sql >> Databasteknik >  >> NoSQL >> Redis

Introduktion till Redis Cluster Sharding – Fördelar, begränsningar, distribution och klientanslutningar

Redis Cluster är den inbyggda sharding-implementationen som är tillgänglig inom Redis som låter dig distribuera dina data automatiskt över flera noder utan att behöva förlita dig på externa verktyg och verktyg. På ScaleGrid har vi nyligen lagt till stöd för Redis™* Clusters på vår helt hanterade plattform genom våra hosting for Redis™-planer. I det här inlägget kommer vi att introducera dig för de avancerade Redis Cluster-sharding-möjligheterna, diskutera dess fördelar och begränsningar, när du bör distribuera och hur du ansluter till ditt Redis Cluster.

Sharding med Redis Cluster

Hela tangentutrymmet i Redis Clusters är uppdelat i 16384 platser (kallade hash-platser) och dessa platser är tilldelade flera Redis-noder. En given nyckel mappas till en av dessa platser, och hashplatsen för en nyckel beräknas som:

HASH_SLOT =CRC16(nyckel) mod 16384

Multi-key operationer stöds på Redis Clusters så länge som alla nycklar som är inblandade i en enda kommandokörning tillhör samma hashplats. Detta kan säkerställas med hjälp av konceptet hash-taggar.

Redis Cluster Specification är den definitiva guiden till att förstå teknikens inre delar, medan Redis Cluster Tutorial ger riktlinjer för implementering och administration.

Fördelar

Kolla in de främsta fördelarna med Redis Clusters för att se hur det kan gynna dina implementeringar:

  • Hög prestanda

    Redis Cluster lovar samma prestandanivå som fristående Redis-distributioner.

  • Hög tillgänglighet

    Redis Cluster stöder standard Redis master-replikkonfiguration för att säkerställa hög tillgänglighet och hållbarhet. Den implementerar också en flottliknande konsensusstrategi för att säkerställa tillgängligheten för hela klustret.

  • Horisontell och vertikal skalbarhet

    Att lägga till eller ta bort nya Redis-noder från klustret kan ske transparent och utan driftstopp. Detta gör det enkelt att lägga till och ta bort skärvor, avbryta eller skala enskilda noder.

  • Inbyggd lösning

    Att distribuera Redis Clusters kräver inga externa proxyservrar eller verktyg, så det finns inga nya verktyg du behöver lära dig eller oroa dig för. Det ger också nästan fullständig kompatibilitet med fristående Redis-distributioner.

Begränsningar

Låt oss också vara medvetna om begränsningarna för att säkerställa att det är rätt för din distribution:

  • Kräver kundsupport

    Kunder måste göra ändringar för att stödja Redis Clusters. Även om Redis Clusters har funnits i många år nu, finns det fortfarande kunder som inte stöder det. Se Redis-klientdokumentationen för att säkerställa att klienten du använder stöds innan du väljer att distribuera Redis-kluster.

  • Begränsat stöd för flera tangenter

    Som nämnts i föregående avsnitt, stöds operationer med flera tangenter endast när alla nycklar i en enda operation tillhör samma plats. Detta är något att vara försiktig med när du designar dina datastrukturer.

  • Stöder endast en databas

    Till skillnad från fristående databaser stöder Redis Clusters endast en databas (databas 0), och kommandot SELECT är inte tillåtet. Eftersom de flesta inte använder flera databaser är inte heller detta någon större begränsning.

När ska du distribuera ett Redis-kluster?

Redis Cluster-lösningen kan passa bra för dig om du behöver en fragmenterad Redis-lösning. Redis Cluster är en inbyggd lösning som är enkel och erbjuder fantastisk prestanda.

Vanligtvis börjar folk titta på att dela sina Redis-distributioner när de har börjat mätta en fristående Redis-nod med skrivningar och vill sprida skrivningar till flera noder. Även om Redis huvudsakligen är entrådad, blir I/O vanligtvis nätverks- eller minnesbundet på en fristående innan den kan börja mätta processorn. Minnesbundet kan till viss del övervinnas genom att välja att lägga till mer minne till ett fristående system, men det börjar bli oöverkomligt när det gäller kostnader, backup, omstart, uppvärmningstider, etc. bortom en viss punkt.

Å andra sidan, om du bara vill sprida din läsning över flera noder, är det mycket lättare att bara lägga till läsrepliker till den fristående.

Jämfört med andra skärningslösningar för Redis är ombalansering av skärvor i Redis Clusters transparent för applikationer. Detta gör det mycket enkelt att lägga till eller ta bort skärvor utan att appliceringen påverkas.

Introduktion till #Redis Cluster Sharding – fördelar, begränsningar, när du ska distribuera och klientanslutningar Klicka för att tweeta

Ansluta till ett Redis-kluster

Om du väljer att distribuera ett Redis™ Cluster med ScaleGrid får du en komplett Redis Cluster-distribution som är helt kompatibel med standardversionen.

Om du precis har börjat, registrera dig för en gratis 30-dagars provperiod på ScaleGrid-konsolen och kolla in den här dokumentationen om hur du skapar din första ScaleGrid för Redis™-implementering.

Här är vad du behöver för att ansluta till Redis™-klustret på ScaleGrid:

  • Lista med nodnamn
  • Portar
  • Autentiseringssträng

Fliken Översikt på din Redis™-distributionsinformationssida har listan över masters för varje shard, tillsammans med portnummer och autentiseringsinformation:

Alternativt är listan över alla noder i klustret tillgänglig på fliken Maskiner:

Som du kanske har märkt finns det inte många exempel som visar hur du ansluter till ett autentiseringsaktiverat Redis™-kluster tillgängligt online. Här är några exempel med några av de populära klienterna.

Ansluter med Java

Bland de populära Redis Java-klienterna stödjer Jedis och Lettuce Redis™-kluster. Vi kommer att ta upp Jedis som vårt exempel.

Jedis

Redis™ Cluster-anslutningar abstraheras av JedisCluster klass. De bästa exemplen på att använda den här klassen för att ansluta till Redis™-kluster finns i Jedis-testerna, Jedis källkod. Tyvärr vid denna tidpunkt, när autentisering är specificerad, JedisCluster konstruktören är inte särskilt ren. Här är ett exempel som skriver 100 nycklar till Redis™-klustret. Observera att eftersom nycklarna inte är taggade kommer de att hamna i olika platser på olika 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();
    }
}

Argumenten till konstruktorn är dokumenterade i Jedis API-dokument. Vi rekommenderar att du anger alla noder i klustret när du skapar kluster med Jedis.

Ansluter med Ruby

Den mest populära Redis-klienten i Ruby är redis-rb. Den stöder också Redis™ Clusters så vi kommer att använda den i vårt exempel.

Redis-rb

redis-rb version 4.1.0 och senare har stöd för Redis™-kluster. 'klustret' alternativet måste anges under anslutningsinitieringen, och du kan se den här dokumentationen för exakt semantik. Här är samma program som Java-exemplet ovan 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

Ansluter med Node.js

Node_redis är den mest populära Redis-klienten i Node.js. Det stöder dock inte officiellt Redis™ Clusters ännu. ioredis är en annan populär Redis-klient som har stöd för Redis™ Clusters så vi kommer att använda detta för vårt Node.js-exempel.

ioredis

Ioredis-dokumentationen beskriver detaljerna för de ytterligare parametrar som måste skickas för att ansluta till Redis™-kluster, och ett grundläggande exempel finns också i README. Här är ett exempelprogram som ber användaren om en nyckel och läser dess värde från Redis™-klustret:

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 kunna köra något av dessa exempel efter att du har installerat de senaste versionerna av Redis-drivrutinerna på dina klientdatorer.

Om du är redo att migrera dina Redis-distributioner till ScaleGrids helt hanterade plattform för värd för Redis™, kolla in de fantastiska funktionerna som finns tillgängliga på ScaleGrid-konsolen genom en gratis 30-dagars provperiod. Våra AWS-värd för Redis™-planer är tillgängliga i 14 olika datacenter över hela världen, och vi är den enda tjänsten för Redis™ som låter dig hantera dina implementeringar inom ditt eget molnkonto.


  1. In-memory cache med LRU-utgång

  2. Uppdatera ett underdokument som finns i en array som finns i ett MongoDB-dokument

  3. MongoDB Single Documents storleksgräns är 16 MB

  4. Meteor:ladda upp fil från klient till Mongo-samling vs filsystem vs GridFS