sql >> Database teknologi >  >> NoSQL >> Redis

Introduktion til Redis Cluster Sharding – fordele, begrænsninger, implementering og klientforbindelser

Redis Cluster er den native sharding-implementering, der er tilgængelig i Redis, og som giver dig mulighed for automatisk at distribuere dine data på tværs af flere noder uden at skulle stole på eksterne værktøjer og hjælpeprogrammer. Hos ScaleGrid har vi for nylig tilføjet support til Redis™* Clusters på vores fuldt administrerede platform gennem vores hosting for Redis™-planer. I dette indlæg vil vi introducere dig til de avancerede Redis Cluster-sharding-muligheder, diskutere dets fordele og begrænsninger, hvornår du bør implementere, og hvordan du opretter forbindelse til din Redis Cluster.

Sharding med Redis Cluster

Hele tasterummet i Redis Clusters er opdelt i 16384 slots (kaldet hash slots), og disse slots er tildelt flere Redis noder. En given nøgle er knyttet til en af ​​disse slots, og hash-sloten for en nøgle beregnes som:

HASH_SLOT =CRC16(nøgle) mod 16384

Multi-key operationer understøttes på Redis Clusters, så længe alle nøglerne involveret i en enkelt kommandoudførelse tilhører den samme hash slot. Dette kan sikres ved hjælp af konceptet hash-tags.

Redis Cluster Specification er den endegyldige guide til at forstå det indre af teknologien, mens Redis Cluster Tutorial giver retningslinjer for implementering og administration.

Fordele

Tjek de største fordele ved Redis Clusters for at se, hvordan det kan gavne dine implementeringer:

  • Høj ydeevne

    Redis Cluster lover det samme niveau af ydeevne som selvstændige Redis-implementeringer.

  • Høj tilgængelighed

    Redis Cluster understøtter standard Redis master-replica-konfiguration for at sikre høj tilgængelighed og holdbarhed. Den implementerer også en flådelignende konsensustilgang for at sikre tilgængelighed af hele klyngen.

  • Horisontal og vertikal skalerbarhed

    Tilføjelse eller fjernelse af nye Redis-noder fra klyngen kan ske gennemsigtigt og uden nedetid. Dette gør det nemt at tilføje og fjerne shards, trække sig tilbage eller skalere individuelle noder.

  • Native løsning

    Implementering af Redis Clusters kræver ingen eksterne proxyer eller værktøjer, så der er ingen nye værktøjer, du behøver at lære eller bekymre dig om. Det giver også næsten fuldstændig kompatibilitet med selvstændige Redis-implementeringer.

Begrænsninger

Lad os også være opmærksomme på begrænsningerne for at sikre, at det er rigtigt for din implementering:

  • Kræver klientsupport

    Kunder skal foretage ændringer for at understøtte Redis Clusters. Selvom Redis Clusters har eksisteret i mange år nu, er der stadig kunder, der ikke understøtter det. Se Redis-klientdokumentationen for at sikre, at den klient, du bruger, understøttes, før du vælger at implementere Redis-klynger.

  • Begrænset support med flere nøgler

    Som nævnt i det foregående afsnit, understøttes multi-key operationer kun, når alle nøglerne i en enkelt operation tilhører samme slot. Dette er noget, du skal være opmærksom på, når du designer dine datastrukturer.

  • Understøtter kun én database

    I modsætning til selvstændige databaser understøtter Redis Clusters kun én database (database 0), og SELECT-kommandoen er ikke tilladt. Da de fleste mennesker ikke bruger flere databaser, er dette heller ikke en større begrænsning.

Hvornår skal du implementere en Redis-klynge?

Redis Cluster-løsningen kan passe godt til dig, hvis du har brug for en shard Redis-løsning. Redis Cluster er en indbygget løsning, der er enkel og giver fantastisk ydeevne.

Typisk begynder folk at se på at sønderdele deres Redis-implementeringer, når de er begyndt at mætte en selvstændig Redis-knude med skrivninger og ønsker at sprede skrivninger ud til flere noder. Selvom Redis primært er enkelttrådet, bliver I/O typisk netværks- eller hukommelsesbundet på en selvstændig, før den kan begynde at mætte CPU'en. Hukommelsesbundet kan til en vis grad overvindes ved at vælge at tilføje mere hukommelse til et selvstændigt system, men det begynder at blive uoverkommeligt med hensyn til omkostninger, backup, genstart, opvarmningstider osv. ud over et vist punkt.

På den anden side, hvis du kun ønsker at sprede din læsning på tværs af flere noder, er det meget nemmere blot at tilføje læsereplikaer til den selvstændige.

Sammenlignet med andre sharding-løsninger til Redis er shard-rebalancering i Redis Clusters gennemsigtig for applikationer. Dette gør det meget nemt at tilføje eller fjerne skår uden at påvirke påføringen.

Introduktion til #Redis Cluster Sharding – fordele, begrænsninger, hvornår de skal implementeres og klientforbindelserKlik for at tweete

Opret forbindelse til en Redis-klynge

Hvis du vælger at implementere en Redis™ Cluster med ScaleGrid, får du en fuldt udstyret Redis Cluster-implementering, der er fuldstændig kompatibel med standardudgivelsen.

Hvis du lige er startet, tilmeld dig en gratis 30-dages prøveperiode på ScaleGrid-konsollen, og tjek denne dokumentation om oprettelse af din første ScaleGrid for Redis™-implementering.

Her er, hvad du skal bruge for at oprette forbindelse til Redis™-klyngen på ScaleGrid:

  • Liste over nodenavne
  • Porte
  • Godkendelsesstreng

Fanen Oversigt på din Redis™-implementeringsdetaljeside har listen over mastere for hvert shard sammen med portnumre og godkendelsesoplysninger:

Alternativt er listen over alle klyngens noder tilgængelig på fanen Maskiner:

Som du måske har bemærket, er der ikke mange eksempler tilgængelige, der viser dig, hvordan du opretter forbindelse til en godkendelsesaktiveret Redis™-klynge, der er tilgængelig online. Her er et par eksempler ved hjælp af nogle af de populære kunder.

Opret forbindelse med Java

Blandt de populære Redis Java-klienter understøtter Jedis og Lettuce Redis™ Clusters. Vi vil tage Jedis op som vores eksempel.

Jedis

Redis™ Cluster-forbindelser abstraheres af JedisCluster klasse. De bedste eksempler på brug af denne klasse til at oprette forbindelse til Redis™ Clusters kan findes i Jedis-testene, Jedis-kildekoden. Desværre på dette tidspunkt, hvor godkendelse er angivet, er JedisCluster konstruktøren er ikke særlig ren. Her er et eksempel, der skriver 100 nøgler til Redis™ Cluster. Bemærk, at da nøglerne ikke er tagget, vil de ende i forskellige slots på forskellige noder:

...
import java.util.HashSet;
import java.util.Set;
import redis.clients.jedis.HostAndPort;
import redis.clients.jedis.JedisCluster;
import redis.clients.jedis.JedisPoolConfig;
...

public class RedisClusterModeTest {
    public static final int    DEFAULT_TIMEOUT      = 5000;
    public static final int    DEFAULT_REDIRECTIONS = 5;

    public static void main(String[] args) {
        Set jedisClusterNodes = new HashSet();
        jedisClusterNodes.add(new HostAndPort("SG-example-1.servers.scalegrid.io, 6379));
        jedisClusterNodes.add(new HostAndPort("SG-example-2.servers.scalegrid.io", 6379));
        jedisClusterNodes.add(new HostAndPort("SG-example-3.servers.scalegrid.io", 6379));
        jedisClusterNodes.add(new HostAndPort("SG-example-4.servers.scalegrid.io", 6379));
        jedisClusterNodes.add(new HostAndPort("SG-example-5.servers.scalegrid.io", 6379));
        jedisClusterNodes.add(new HostAndPort("SG-example-6.servers.scalegrid.io", 6379));

        JedisCluster jedis = new JedisCluster(jedisClusterNodes, DEFAULT_TIMEOUT, DEFAULT_TIMEOUT, DEFAULT_REDIRECTIONS, <auth>, new JedisPoolConfig());
        for (int i = 0; i < 100; i++) {
            jedis.set("key" + i, "value" + i);
        }
        jedis.close();
    }
}

Argumenterne til konstruktøren er dokumenteret i Jedis API-dokumenter. Vi anbefaler, at du angiver alle klyngens noder under oprettelse af klynge med Jedis.

Forbindelse med Ruby

Den mest populære Redis-klient i Ruby er redis-rb. Den understøtter også Redis™ Clusters, så vi bruger den i vores eksempel.

Redis-rb

redis-rb versioner 4.1.0 og nyere har understøttelse af Redis™ Clusters. 'klyngen' indstilling skal angives under initialisering af forbindelsen, og du kan se denne dokumentation for nøjagtig semantik. Her er det samme program som Java-eksemplet ovenfor i Ruby:

require 'redis'
require 'pp'

NODES = ["redis://SG-example-1.servers.scalegrid.io:6379",
         "redis://SG-example-2.servers.scalegrid.io:6379",
         "redis://SG-example-3.servers.scalegrid.io:6379",
         "redis://SG-example-4.servers.scalegrid.io:6379",
         "redis://SG-example-5.servers.scalegrid.io:6379",
         "redis://SG-example-6.servers.scalegrid.io:6379"]
begin
    pp "Attempting connection..."
    redis = Redis.new(cluster: NODES, password: <auth>)
    100.times { |i| redis.set("key#{i}", "value#{i}") }
    pp "Done..."
    redis.close
rescue StandardError => e
    puts e.message
end

Opretter forbindelse med Node.js

Node_redis er den mest populære Redis-klient i Node.js. Det understøtter dog ikke officielt Redis™ Clusters endnu. ioredis er en anden populær Redis-klient, som har Redis™ Clusters-understøttelse, så vi vil bruge dette til vores Node.js-eksempel.

ioredis

ioredis-dokumentationen beskriver detaljerne for de yderligere parametre, der skal videregives for at oprette forbindelse til Redis™-klynger, og et grundlæggende eksempel findes også i README. Her er et eksempel på et program, som beder brugeren om en nøgle og læse dens værdi fra Redis™ Cluster:

const readline = require('readline');
const Redis = require('ioredis');

var cluster = new Redis.Cluster([{
    port: 6379,
    host: 'SG-example-1.servers.scalegrid.io'
},
{
    port: 6379,
    host: 'SG-example-2.servers.scalegrid.io'
},
{
    port: 6379,
    host: 'SG-example-3.servers.scalegrid.io'
},
{
    port: 6379,
    host: 'SG-example-4.servers.scalegrid.io'
},
{
    port: 6379,
    host: 'SG-example-5.servers.scalegrid.io'
},
{
    port: 6379,
    host: 'SG-example-6.servers.scalegrid.io'
}
], { redisOptions: { password: '<auth>' } });

const rl = readline.createInterface({
    input: process.stdin,
    output: process.stdout,
    prompt: 'enter key> '
});

console.log('Welcome to the Redis Cluster reader. Enter the key which you want to read [Ctrl D to Exit]');
rl.prompt();
rl.on('line', (line) => {
    if (line.trim()) {
        cluster.get(line, function (err, result) {
            if (err) {
                console.error(err);
            } else {
                console.log("value: " + result);
            }
            rl.prompt();
        });
    } else {
        console.error("No input received");
        rl.prompt();
    }
}).on('close', () => {
    console.log('\nterminating');
    cluster.quit();
    process.exit(0);
});

Du bør være i stand til at udføre et hvilket som helst af disse eksempler efter installation af de seneste versioner af Redis-driverne på dine klientmaskiner.

Hvis du er klar til at migrere dine Redis-implementeringer til ScaleGrids fuldt administrerede platform til hosting af Redis™, så tjek de fantastiske funktioner, der er tilgængelige på ScaleGrid-konsollen gennem en gratis 30-dages prøveperiode. Vores AWS-hosting for Redis™-planer er tilgængelige på tværs af 14 forskellige datacentre verden over, og vi er den eneste tjeneste for Redis™, der giver dig mulighed for at administrere dine implementeringer på din egen cloud-konto.


  1. LuaSocket, Lua 5.2 og Redis

  2. Sådan bruger du ActionController::Live sammen med Resque + Redis (til chatapplikation)

  3. MongoDB kort()

  4. Hent positionen for det valgte dokument i samlingen [mongoDB]