Redis Sharding

Redis Sharding



Quando inizi a utilizzare Redis per la prima volta, è facile credere che non avrai mai bisogno di ridimensionarlo oltre le impostazioni predefinite. Il problema è che man mano che la tua applicazione cresce, alla fine avrai bisogno di più memoria, CPU e capacità di throughput per supportare le tue esigenze aziendali. In questo articolo, ti mostreremo come il cluster Redis scala con lo sharding per darti la capacità extra di cui hai bisogno per gestire la tua attività senza problemi e crescere nel futuro. Impareremo nello specifico come il cluster Redis fornisce un throughput elevato con lo sharding.

Scalabilità

Esistono due approcci comuni per ridimensionare un server: ridimensionamento verticale e ridimensionamento orizzontale. Il ridimensionamento o il ridimensionamento verticale è il punto in cui aggiungi più potenza e risorse al tuo server, come più CPU, memoria e spazio di archiviazione, il che è costoso. D'altra parte, il ridimensionamento orizzontale aggiunge più nodi al pool di risorse esistente. Questo si chiama ridimensionamento. Pertanto, in base alle tue limitazioni e requisiti, spetta a te disporre di un'unica istanza del server più grande o distribuire più nodi del server.

Supponiamo di avere 100 GB di RAM e di dover contenere 200 GB di dati. In questo caso, hai due scelte:







  • Scalare aggiungendo più RAM al sistema
  • Aumenta la scalabilità aggiungendo un'altra istanza del server con 100 GB di RAM

Se hai raggiunto il limite massimo di RAM all'interno della tua infrastruttura, la scalabilità orizzontale è l'approccio ideale. Inoltre, la scalabilità orizzontale aumenterà notevolmente il throughput del database.





Redis Sharding

È noto che Redis opera su un singolo thread. Pertanto, Redis non è in grado di utilizzare più core della CPU del tuo server per elaborare i comandi. Pertanto, l'aggiunta di più core della CPU non offre molto throughput o prestazioni con Redis. Non è il caso di suddividere i dati tra più istanze del server. L'aggiunta di più server e la distribuzione del set di dati tra di essi consente l'elaborazione parallela delle richieste dei client, il che aumenta il throughput. Inoltre, le prestazioni complessive possono aumentare quasi in modo lineare.





Viene chiamato questo approccio di suddivisione o distribuzione dei dati tra più server tenendo presente il ridimensionamento sharding . Vengono richiamati tutti i server che memorizzano porzioni di dati frammenti .



Come viene eseguito lo sharding: lo sharding algoritmico

Una delle principali preoccupazioni relative allo sharding era come individuare una determinata chiave tra più nodi Redis. Poiché una determinata chiave può essere archiviata in qualsiasi partizione disponibile, l'interrogazione di tutte le partizioni per trovare una chiave specifica non è l'opzione migliore. Quindi, dovrebbe esserci un modo per mappare ogni chiave a uno specifico frammento e Redis utilizza una strategia di partizionamento algoritmico.

L'approccio più comune consiste nel calcolare un valore hash utilizzando il nome e il modulo della chiave Redis. Quindi, dividilo per i frammenti Redis disponibili nel sistema.

HASH_SLOT = CRC16(chiave) mod 16384

È una soluzione abbastanza buona fintanto che il numero totale di frammenti è costante. Ogni volta che aggiungi una nuova istanza del server Reids, il valore risultante per una determinata chiave potrebbe cambiare poiché il numero totale di frammenti è aumentato. Finirà per interrogare il frammento Redis sbagliato. Quindi, dovresti seguire il processo di resharding calcolando il nuovo shard per ogni chiave e trasferendo i dati al server corretto, che è un'attività ingombrante e non banale se il tuo numero totale di shard aumenta di volta in volta.

Redis usa una nuova entità logica chiamata a slot hash per prevenire questo problema. Sono disponibili diversi slot hash per un determinato shard e un singolo slot hash può contenere più chiavi Redis. Ci sono 16384 hash slot in un cluster di database Redis che rimangono invariati. La divisione modulo viene eseguita con il numero di slot hash invece che con il conteggio degli shard. Fornisce la posizione corretta dello slot hash per la chiave specificata anche quando il numero di shard è aumentato. Semplifica il processo di resharding spostando gli hash slot da uno shard a quello nuovo che suddivide i dati tra le diverse istanze Redis secondo i requisiti.

Vantaggi di Redis Sharding

Lo sharding Redis offre diversi vantaggi al tuo sistema di database con modifiche minime.

Alto rendimento

Poiché Redis è a thread singolo, l'elaborazione di più richieste client non può essere elaborata in parallelo utilizzando più core della CPU. Pertanto, l'aggiunta di nuovi shard o istanze del server garantisce la possibilità di eseguire operazioni Redis in parallelo. Aumenta le operazioni al secondo nel tuo database Redis, che alla fine ti offre un throughput elevato.

Alta disponibilità

Con l'approccio di sharding, il cluster Redis può configurare un'architettura master-replica che garantisce disponibilità e durabilità elevate.

Leggi le repliche

Lo sharding ti consente di conservare una copia esatta dei tuoi dati e fornire operazioni di lettura tramite istanze Redis separate, il che aumenta le prestazioni dell'esecuzione della query di lettura.

Oltre a questi vantaggi, lo sharding può causare situazioni di split brain quando si dispone di un numero pari di shard nel cluster Redis. Pertanto, si consiglia di mantenere un numero dispari di shard nel cluster Redis.

Conclusione

Per riassumere, lo sharding Redis divide i dati tra più server, il che consente il ridimensionamento e un throughput elevato per il database. Come discusso, Redis utilizza una strategia di sharding algoritmico per indirizzare le richieste dei client allo shard corretto. Ciò presenta alcuni inconvenienti quando il numero totale di frammenti aumenta. Quindi, invece del numero totale di shard, Redis utilizza il numero di slot hash per calcolare lo shard appropriato. Con l'introduzione dello sharding, i database Redis offrono disponibilità elevata, throughput elevato e prestazioni elevate.