Redis
 sql >> Base de données >  >> NoSQL >> Redis

Introduction à Redis Cluster Sharding - Avantages, limitations, déploiement et connexions client

Redis Cluster est l'implémentation de partitionnement native disponible dans Redis qui vous permet de distribuer automatiquement vos données sur plusieurs nœuds sans avoir à recourir à des outils et utilitaires externes. Chez ScaleGrid, nous avons récemment ajouté la prise en charge des clusters Redis™* sur notre plate-forme entièrement gérée via nos plans d'hébergement pour Redis™. Dans cet article, nous allons vous présenter les opportunités avancées de partitionnement du cluster Redis, discuter de ses avantages et de ses limites, quand vous devez déployer et comment vous connecter à votre cluster Redis.

Sharding avec le cluster Redis

L'ensemble de l'espace de clés dans les clusters Redis est divisé en 16 384 emplacements (appelés emplacements de hachage) et ces emplacements sont attribués à plusieurs nœuds Redis. Une clé donnée est mappée à l'un de ces emplacements, et l'emplacement de hachage pour une clé est calculé comme :

HASH_SLOT =CRC16(clé) mod 16384

Les opérations multi-clés sont prises en charge sur les clusters Redis tant que toutes les clés impliquées dans une seule exécution de commande appartiennent au même emplacement de hachage. Cela peut être assuré en utilisant le concept de balises de hachage.

La spécification du cluster Redis est le guide définitif pour comprendre les rouages ​​de la technologie, tandis que le didacticiel du cluster Redis fournit des directives de déploiement et d'administration.

Avantages

Découvrez les principaux avantages des clusters Redis pour voir comment ils peuvent bénéficier à vos déploiements :

  • Hautes performances

    Redis Cluster promet le même niveau de performances que les déploiements Redis autonomes.

  • Haute disponibilité

    Redis Cluster prend en charge la configuration standard du réplica maître Redis pour garantir une disponibilité et une durabilité élevées. Il met également en œuvre une approche consensuelle de type Raft pour garantir la disponibilité de l'ensemble du cluster.

  • Évolutivité horizontale et verticale

    L'ajout ou la suppression de nouveaux nœuds Redis du cluster peut se produire de manière transparente et sans aucun temps d'arrêt. Cela facilite l'ajout et la suppression de partitions, le retrait ou la mise à l'échelle de nœuds individuels.

  • Solution native

    Le déploiement de clusters Redis ne nécessite aucun proxy ou outil externe. Vous n'avez donc pas besoin d'apprendre ou de vous soucier de nouveaux outils. Il offre également une compatibilité presque complète avec les déploiements Redis autonomes.

Limites

Soyons également conscients des limites afin de nous assurer qu'il convient à votre déploiement :

  • Nécessite une assistance client

    Les clients doivent apporter des modifications afin de prendre en charge les clusters Redis. Alors que les clusters Redis existent depuis de nombreuses années maintenant, il y a encore des clients qui ne le prennent pas en charge. Reportez-vous à la documentation du client Redis pour vous assurer que le client que vous utilisez est compatible avant de choisir de déployer des clusters Redis.

  • Prise en charge limitée des opérations multi-touches

    Comme mentionné dans la section précédente, les opérations multi-clés ne sont prises en charge que lorsque toutes les clés d'une même opération appartiennent au même emplacement. Il faut faire attention à cela lors de la conception de vos structures de données.

  • Ne prend en charge qu'une seule base de données

    Contrairement aux bases de données autonomes, les clusters Redis ne prennent en charge qu'une seule base de données (base de données 0) et la commande SELECT n'est pas autorisée. Étant donné que la plupart des gens n'utilisent pas plusieurs bases de données, ce n'est pas non plus une limitation majeure.

Quand devez-vous déployer un cluster Redis ?

La solution Redis Cluster peut vous convenir si vous avez besoin d'une solution Redis partitionnée. Redis Cluster est une solution native simple et performante.

Généralement, les utilisateurs commencent à envisager de partitionner leurs déploiements Redis lorsqu'ils commencent à saturer un nœud Redis autonome avec des écritures et souhaitent répartir les écritures sur plusieurs nœuds. Même si Redis est principalement monothread, les E/S deviennent généralement liées au réseau ou à la mémoire sur un support autonome avant de commencer à saturer le processeur. La limite de mémoire peut être surmontée dans une certaine mesure en choisissant d'ajouter plus de mémoire à un système autonome, mais elle commence à devenir prohibitive en termes de coût, de sauvegarde, de redémarrage, de temps de préchauffage, etc. au-delà d'un certain point.

D'un autre côté, si vous cherchez uniquement à répartir votre lecture sur plusieurs nœuds, il est beaucoup plus facile d'ajouter simplement des répliques en lecture à la version autonome.

Par rapport à d'autres solutions de partitionnement pour Redis, le rééquilibrage des partitions dans les clusters Redis est transparent pour les applications. Cela facilite l'ajout ou la suppression de fragments sans affecter l'application.

Introduction à #Redis Cluster Sharding – Avantages, limites, quand déployer et connexions clientClick To Tweet

Connexion à un cluster Redis

Si vous choisissez de déployer un cluster Redis™ avec ScaleGrid, vous obtenez un déploiement de cluster Redis complet et totalement compatible avec la version standard.

Si vous débutez, inscrivez-vous pour un essai gratuit de 30 jours sur la console ScaleGrid et consultez cette documentation sur la création de votre premier déploiement ScaleGrid pour Redis™.

Voici ce dont vous avez besoin pour vous connecter au cluster Redis™ sur ScaleGrid :

  • Liste des noms de nœuds
  • Ports
  • Chaîne d'authentification

L'onglet Présentation de la page des détails de votre déploiement Redis™ contient la liste des maîtres de chaque partition, ainsi que les numéros de port et les informations d'authentification :

Alternativement, la liste de tous les nœuds du cluster est disponible sur l'onglet Machines :

Comme vous l'avez peut-être remarqué, peu d'exemples sont disponibles pour vous montrer comment vous connecter à un cluster Redis™ avec authentification disponible en ligne. Voici quelques exemples utilisant certains des les clients populaires.

Se connecter avec Java

Parmi les clients Redis Java populaires, Jedis et Lettuce prennent en charge les clusters Redis™. Nous prendrons Jedis pour exemple.

Jedis

Les connexions du cluster Redis™ sont abstraites par le JedisCluster classe. Les meilleurs exemples d'utilisation de cette classe pour se connecter aux clusters Redis™ se trouvent dans les tests Jedis, le code source Jedis. Malheureusement, à l'heure actuelle, lorsque l'authentification est spécifiée, le JedisCluster le constructeur n'est pas très propre. Voici un exemple qui écrit 100 clés dans le cluster Redis™. Notez que puisque les clés ne sont pas étiquetées, elles se retrouveront dans différents emplacements sur différents nœuds :

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

Les arguments du constructeur sont documentés dans la documentation de l'API Jedis. Nous vous recommandons de spécifier tous les nœuds du cluster lors de la création du cluster avec Jedis.

Se connecter avec Ruby

Le client Redis le plus populaire dans Ruby est redis-rb. Il prend également en charge les clusters Redis™, nous l'utiliserons donc dans notre exemple.

Redis-rb

les versions 4.1.0 et supérieures de redis-rb prennent en charge les clusters Redis™. Le 'cluster' L'option doit être spécifiée lors de l'initialisation de la connexion, et vous pouvez vous référer à cette documentation pour la sémantique exacte. Voici le même programme que l'exemple Java ci-dessus dans 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

Connexion avec Node.js

Node_redis est le client Redis le plus populaire dans Node.js. Cependant, il ne prend pas encore officiellement en charge les clusters Redis™. ioredis est un autre client Redis populaire qui prend en charge les clusters Redis™, nous l'utiliserons donc pour notre exemple Node.js.

ioredis

La documentation ioredis décrit les détails des paramètres supplémentaires qui doivent être transmis pour la connexion aux clusters Redis™, et un exemple de base est également fourni dans le fichier README. Voici un exemple de programme qui invite l'utilisateur à saisir une clé et lit sa valeur à partir du cluster Redis™ :

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

Vous devriez pouvoir exécuter n'importe lequel de ces exemples après avoir installé les versions les plus récentes des pilotes Redis sur vos machines clientes.

Si vous êtes prêt à migrer vos déploiements Redis vers la plate-forme entièrement gérée de ScaleGrid pour l'hébergement pour Redis™, découvrez les fonctionnalités incroyables disponibles sur la console ScaleGrid grâce à un essai gratuit de 30 jours. Nos plans d'hébergement AWS pour Redis™ sont disponibles dans 14 centres de données différents dans le monde, et nous sommes le seul service pour Redis™ qui vous permet de gérer vos déploiements au sein de votre propre compte cloud.