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

Introduzione a Redis Cluster Sharding:vantaggi, limitazioni, distribuzione e connessioni client

Redis Cluster è l'implementazione di sharding nativa disponibile in Redis che ti consente di distribuire automaticamente i tuoi dati su più nodi senza dover fare affidamento su strumenti e utilità esterni. In ScaleGrid, abbiamo aggiunto di recente il supporto per i cluster Redis™* sulla nostra piattaforma completamente gestita tramite i nostri piani di hosting per Redis™. In questo post, ti presenteremo le opportunità avanzate di sharding di Redis Cluster, ne discuteremo vantaggi e limiti, quando dovresti eseguire il deployment e come connetterti al tuo Redis Cluster.

Sharding con Redis Cluster

L'intero spazio delle chiavi in ​​Redis Clusters è diviso in 16384 slot (chiamati hash slot) e questi slot sono assegnati a più nodi Redis. Una determinata chiave viene mappata su uno di questi slot e lo slot hash per una chiave viene calcolato come:

HASH_SLOT =CRC16(chiave) mod 16384

Le operazioni con più chiavi sono supportate sui cluster Redis purché tutte le chiavi coinvolte nell'esecuzione di un singolo comando appartengano allo stesso hash slot. Questo può essere garantito utilizzando il concetto di hash tag.

La specifica del cluster Redis è la guida definitiva per comprendere gli elementi interni della tecnologia, mentre il tutorial del cluster Redis fornisce linee guida per l'implementazione e l'amministrazione.

Vantaggi

Scopri i principali vantaggi di Redis Clusters per vedere come può avvantaggiare le tue implementazioni:

  • Alte prestazioni

    Redis Cluster promette lo stesso livello di prestazioni delle distribuzioni Redis standalone.

  • Alta disponibilità

    Redis Cluster supporta la configurazione standard della replica master Redis per garantire disponibilità e durabilità elevate. Implementa inoltre un approccio di consenso simile a quello di Raft per garantire la disponibilità dell'intero cluster.

  • Scalabilità orizzontale e verticale

    L'aggiunta o la rimozione di nuovi nodi Redis dal Cluster può avvenire in modo trasparente e senza tempi di inattività. Ciò semplifica l'aggiunta e la rimozione di frammenti, il ritiro o il ridimensionamento dei singoli nodi.

  • Soluzione nativa

    La distribuzione di Redis Clusters non richiede proxy o strumenti esterni, quindi non ci sono nuovi strumenti di cui devi imparare o di cui preoccuparti. Fornisce inoltre una compatibilità quasi completa con le distribuzioni Redis standalone.

Limiti

Dobbiamo anche essere consapevoli dei limiti per assicurarci che sia adatto alla tua distribuzione:

  • Richiede l'assistenza del cliente

    I clienti devono apportare modifiche per supportare i cluster Redis. Sebbene Redis Clusters sia in circolazione da molti anni ormai, ci sono ancora clienti che non lo supportano. Fai riferimento alla documentazione del client Redis per assicurarti che il client che utilizzi sia supportato prima di scegliere di distribuire i cluster Redis.

  • Supporto limitato per operazioni multi-chiave

    Come accennato nella sezione precedente, le operazioni con più tasti sono supportate solo quando tutte le chiavi di una singola operazione appartengono allo stesso slot. Questo è un aspetto a cui prestare attenzione quando si progettano le strutture dei dati.

  • Supporta solo un database

    A differenza dei database autonomi, i cluster Redis supportano un solo database (database 0) e il comando SELECT non è consentito. Poiché la maggior parte delle persone non utilizza più database, anche questa non è una limitazione importante.

Quando dovresti distribuire un cluster Redis?

La soluzione Redis Cluster può essere adatta a te se hai bisogno di una soluzione Redis partizionata. Redis Cluster è una soluzione nativa che è semplice e offre grandi prestazioni.

In genere, le persone iniziano a considerare lo sharding delle proprie distribuzioni Redis quando hanno iniziato a saturare un nodo Redis autonomo con scritture e desiderano distribuire le scritture su più nodi. Anche se Redis è principalmente a thread singolo, l'I/O in genere diventa legato alla rete o alla memoria in modo autonomo prima che possa iniziare a saturare la CPU. Il limite di memoria può essere superato in una certa misura scegliendo di aggiungere più memoria a un sistema autonomo, ma inizia a diventare proibitivo in termini di costi, backup, riavvio, tempi di riscaldamento, ecc. oltre un certo punto.

D'altra parte, se stai solo cercando di distribuire la tua lettura su più nodi, è molto più semplice aggiungere repliche di lettura allo standalone.

Se confrontato con altre soluzioni di sharding per Redis, il ribilanciamento degli shard in Redis Clusters è trasparente per le applicazioni. Ciò semplifica l'aggiunta o la rimozione di frammenti senza influire sull'applicazione.

Introduzione allo sharding del cluster #Redis:vantaggi, limitazioni, quando distribuire e connessioni clientFai clic per twittare

Connessione a un cluster Redis

Se scegli di distribuire un Redis™ Cluster con ScaleGrid, ottieni un'implementazione Redis Cluster completa e totalmente compatibile con la versione standard.

Se hai appena iniziato, registrati per una prova gratuita di 30 giorni sulla console ScaleGrid e consulta questa documentazione sulla creazione della tua prima distribuzione di ScaleGrid per Redis™.

Ecco di cosa hai bisogno per connetterti al Redis™ Cluster su ScaleGrid:

  • Elenco dei nomi dei nodi
  • Porte
  • Stringa di autenticazione

La scheda Panoramica della pagina dei dettagli della distribuzione Redis™ contiene l'elenco dei master di ogni shard, insieme ai numeri di porta e alle informazioni di autenticazione:

In alternativa, l'elenco di tutti i nodi del cluster è disponibile nella scheda Macchine:

Come avrai notato, non sono disponibili molti esempi che mostrano come connettersi a un cluster Redis™ abilitato all'autenticazione disponibile online, ecco alcuni esempi che utilizzano alcuni dei i clienti popolari.

Connessione con Java

Tra i popolari client Redis Java, Jedis e Lettuce supportano i cluster Redis™. Prenderemo Jedi come esempio.

Jedi

Le connessioni Redis™ Cluster sono astratte dal JedisCluster classe. I migliori esempi di utilizzo di questa classe per la connessione a Redis™ Cluster possono essere trovati nei test Jedis, codice sorgente Jedis. Sfortunatamente in questo momento, quando viene specificata l'autenticazione, il JedisCluster il costruttore non è molto pulito. Ecco un esempio che scrive 100 chiavi nel Redis™ Cluster. Nota che poiché le chiavi non sono contrassegnate, finiranno in slot diversi su nodi diversi:

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

Gli argomenti del costruttore sono documentati nei documenti dell'API Jedis. Ti consigliamo di specificare tutti i nodi del cluster durante la creazione del cluster con Jedis.

Connettersi con Ruby

Il client Redis più popolare in Ruby è redis-rb. Supporta anche i cluster Redis™, quindi lo useremo nel nostro esempio.

Redis-rb

redis-rb versioni 4.1.0 e successive supportano i cluster Redis™. Il 'cluster' l'opzione deve essere specificata durante l'inizializzazione della connessione e puoi fare riferimento a questa documentazione per la semantica esatta. Ecco lo stesso programma dell'esempio Java sopra 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

Connessione con Node.js

Node_redis è il client Redis più popolare in Node.js. Tuttavia, non supporta ancora ufficialmente i cluster Redis™. ioredis è un altro popolare client Redis che supporta Redis™ Clusters, quindi lo useremo per il nostro esempio Node.js.

ioredis

La documentazione di ioredis descrive i dettagli dei parametri aggiuntivi che devono essere passati per la connessione a Redis™ Clusters e nel README viene fornito anche un esempio di base. Ecco un programma di esempio che richiede all'utente una chiave e ne legge il valore dal 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);
});

Dovresti essere in grado di eseguire uno qualsiasi di questi esempi dopo aver installato le versioni più recenti dei driver Redis sui tuoi computer client.

Se sei pronto per migrare le tue distribuzioni Redis alla piattaforma completamente gestita di ScaleGrid per l'hosting per Redis™, dai un'occhiata alle straordinarie funzionalità disponibili sulla console ScaleGrid attraverso una prova gratuita di 30 giorni. I nostri piani di hosting AWS per Redis™ sono disponibili in 14 diversi data center in tutto il mondo e siamo l'unico servizio per Redis™ che ti consente di gestire le tue distribuzioni all'interno del tuo account cloud.