sql >> Database >  >> NoSQL >> Redis

Inleiding tot Redis Cluster Sharding - Voordelen, beperkingen, implementatie en clientverbindingen

Redis Cluster is de native sharding-implementatie die beschikbaar is binnen Redis en waarmee u uw gegevens automatisch over meerdere knooppunten kunt distribueren zonder afhankelijk te zijn van externe tools en hulpprogramma's. Bij ScaleGrid hebben we onlangs ondersteuning toegevoegd voor Redis™*-clusters op ons volledig beheerde platform via onze hosting voor Redis™-abonnementen. In dit bericht laten we u kennismaken met de geavanceerde shardingmogelijkheden van Redis Cluster, bespreken we de voordelen en beperkingen ervan, wanneer u deze moet implementeren en hoe u verbinding kunt maken met uw Redis Cluster.

Sharden met Redis-cluster

De volledige sleutelruimte in Redis-clusters is verdeeld in 16384 slots (hashslots genoemd) en deze slots zijn toegewezen aan meerdere Redis-knooppunten. Een bepaalde sleutel wordt toegewezen aan een van deze slots en de hash-slot voor een sleutel wordt berekend als:

HASH_SLOT =CRC16(sleutel) mod 16384

Bewerkingen met meerdere toetsen worden ondersteund op Redis-clusters zolang alle sleutels die betrokken zijn bij de uitvoering van een enkele opdracht tot hetzelfde hash-slot behoren. Dit kan worden gegarandeerd met behulp van het concept van hash-tags.

De Redis Cluster-specificatie is de definitieve gids voor het begrijpen van de interne technologie van de technologie, terwijl de Redis Cluster-zelfstudie richtlijnen voor implementatie en beheer biedt.

Voordelen

Bekijk de belangrijkste voordelen van Redis-clusters om te zien hoe het uw implementaties ten goede kan komen:

  • Hoge prestaties

    Redis Cluster belooft hetzelfde prestatieniveau als zelfstandige Redis-implementaties.

  • Hoge beschikbaarheid

    Redis Cluster ondersteunt de standaard Redis-master-replicaconfiguratie om een ​​hoge beschikbaarheid en duurzaamheid te garanderen. Het implementeert ook een Raft-achtige consensusbenadering om de beschikbaarheid van het hele cluster te garanderen.

  • Horizontale en verticale schaalbaarheid

    Het toevoegen of verwijderen van nieuwe Redis-knooppunten uit het cluster kan transparant en zonder downtime gebeuren. Dit maakt het toevoegen en verwijderen van shards, het terugtrekken of schalen van individuele nodes eenvoudig.

  • Native oplossing

    Voor het implementeren van Redis Clusters zijn geen externe proxy's of tools nodig, dus er zijn geen nieuwe tools waar u meer over hoeft te leren of u zich zorgen over hoeft te maken. Het biedt ook bijna volledige compatibiliteit met zelfstandige Redis-implementaties.

Beperkingen

Laten we ook rekening houden met de beperkingen om ervoor te zorgen dat het geschikt is voor uw implementatie:

  • Klantondersteuning vereist

    Klanten moeten wijzigingen aanbrengen om Redis Clusters te ondersteunen. Hoewel Redis Clusters al vele jaren bestaan, zijn er nog steeds klanten die dit niet ondersteunen. Raadpleeg de Redis-clientdocumentatie om te controleren of de client die u gebruikt, wordt ondersteund voordat u ervoor kiest Redis-clusters te implementeren.

  • Beperkte ondersteuning voor meerdere toetsenbediening

    Zoals vermeld in de vorige sectie, worden bewerkingen met meerdere toetsen alleen ondersteund als alle toetsen in een enkele bewerking tot hetzelfde slot behoren. Dit is iets om voorzichtig mee te zijn bij het ontwerpen van uw gegevensstructuren.

  • Ondersteunt slechts één database

    In tegenstelling tot zelfstandige databases, ondersteunen Redis-clusters slechts één database (database 0) en is de opdracht SELECT niet toegestaan. Aangezien de meeste mensen niet meerdere databases gebruiken, is dit ook geen grote beperking.

Wanneer moet u een Redis-cluster implementeren?

De Redis Cluster-oplossing kan goed bij u passen als u een sharded Redis-oplossing nodig hebt. Redis Cluster is een native oplossing die eenvoudig is en geweldige prestaties biedt.

Meestal beginnen mensen te kijken naar sharding van hun Redis-implementaties wanneer ze een standalone Redis-knooppunt beginnen te verzadigen met schrijfbewerkingen en het schrijven naar meerdere knooppunten willen verspreiden. Hoewel Redis voornamelijk single-threaded is, wordt I/O meestal netwerk- of geheugengebonden op een standalone voordat het de CPU kan verzadigen. Geheugengebondenheid kan tot op zekere hoogte worden overwonnen door ervoor te kiezen meer geheugen toe te voegen aan een standalone systeem, maar na een bepaald punt begint het onbetaalbaar te worden in termen van kosten, back-up, herstart, opwarmtijden, enz.

Aan de andere kant, als je alleen je read over meerdere nodes wilt verspreiden, is het veel gemakkelijker om leesreplica's toe te voegen aan de standalone.

In vergelijking met andere sharding-oplossingen voor Redis is het opnieuw in evenwicht brengen van shards in Redis-clusters transparant voor toepassingen. Dit maakt het heel eenvoudig om scherven toe te voegen of te verwijderen zonder de toepassing te beïnvloeden.

Inleiding tot #Redis Cluster Sharding – Voordelen, beperkingen, wanneer te implementeren en clientverbindingen Klik om te tweeten

Verbinding maken met een Redis-cluster

Als u ervoor kiest om een ​​Redis™ Cluster met ScaleGrid te implementeren, krijgt u een volledig functionele Redis Cluster-implementatie die volledig compatibel is met de standaardversie.

Als je net begint, meld je dan aan voor een gratis proefperiode van 30 dagen op de ScaleGrid-console en bekijk deze documentatie over het maken van je eerste ScaleGrid voor Redis™-implementatie.

Dit is wat je nodig hebt om verbinding te maken met de Redis™ Cluster op ScaleGrid:

  • Lijst met knooppuntnamen
  • Poorten
  • Verificatietekenreeks

Het tabblad Overzicht van uw Redis™-implementatiepagina bevat de lijst met masters van elke shard, samen met poortnummers en authenticatie-informatie:

Als alternatief is de lijst met alle knooppunten van het cluster beschikbaar op het tabblad Machines:

Zoals je misschien hebt gemerkt, zijn er niet veel voorbeelden beschikbaar die je laten zien hoe je verbinding kunt maken met een online beschikbare Redis™-cluster met authenticatie. de populaire klanten.

Verbinding maken met Java

Van de populaire Redis Java-clients ondersteunen Jedis en Lettuce Redis™-clusters. We zullen Jedis als voorbeeld nemen.

Jedi's

Redis™ Cluster-verbindingen worden geabstraheerd door de JedisCluster klas. De beste voorbeelden van het gebruik van deze klasse om verbinding te maken met Redis™ Clusters zijn te vinden in de Jedis-tests, Jedis-broncode. Helaas, op dit moment, wanneer authenticatie is gespecificeerd, de JedisCluster constructeur is niet erg schoon. Hier is een voorbeeld waarbij 100 sleutels naar de Redis™-cluster worden geschreven. Houd er rekening mee dat, aangezien de sleutels niet zijn getagd, ze in verschillende slots op verschillende knooppunten terechtkomen:

...
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();
    }
}

De argumenten voor de constructor zijn gedocumenteerd in de Jedis API-documenten. We raden u aan om alle knooppunten van het cluster op te geven tijdens het maken van clusters met Jedis.

Verbinding maken met Ruby

De meest populaire Redis-client in Ruby is redis-rb. Het ondersteunt ook Redis™-clusters, dus we zullen het in ons voorbeeld gebruiken.

Redis-rb

redis-rb versies 4.1.0 en hoger hebben ondersteuning voor Redis™ Clusters. De 'cluster' optie moet worden opgegeven tijdens het initialiseren van de verbinding, en u kunt deze documentatie raadplegen voor de exacte semantiek. Hier is hetzelfde programma als het Java-voorbeeld hierboven in 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

Verbinding maken met Node.js

Node_redis is de meest populaire Redis-client in Node.js. Het ondersteunt echter officieel nog geen Redis™-clusters. ioredis is een andere populaire Redis-client die Redis™ Clusters ondersteunt, dus we zullen dit gebruiken voor ons Node.js-voorbeeld.

ioredis

De ioredis-documentatie beschrijft de details van de aanvullende parameters die moeten worden doorgegeven om verbinding te maken met Redis™-clusters, en een basisvoorbeeld wordt ook gegeven in de README. Hier is een voorbeeldprogramma dat de gebruiker om een ​​sleutel vraagt ​​en de waarde ervan uit de Redis™-cluster afleest:

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);
});

U zou elk van deze voorbeelden moeten kunnen uitvoeren nadat u de meest recente versies van de Redis-stuurprogramma's op uw clientcomputers hebt geïnstalleerd.

Als je klaar bent om je Redis-implementaties te migreren naar het volledig beheerde platform van ScaleGrid voor hosting voor Redis™, bekijk dan de geweldige functies die beschikbaar zijn op de ScaleGrid-console via een gratis proefperiode van 30 dagen. Onze AWS-hosting voor Redis™-abonnementen zijn beschikbaar in 14 verschillende datacenters wereldwijd, en we zijn de enige service voor Redis™ waarmee u uw implementaties kunt beheren binnen uw eigen cloudaccount.


  1. Express Node.JS - Redis-callback ontvangen, beloften uitvoeren

  2. Groepeer records per maand en tel ze - Mongoose, nodeJs, mongoDb

  3. Een sleutel/waarde verwijderen uit bestaande MongoDB-invoer

  4. MongoDB $ltrim