Redis
 sql >> Base de Dados >  >> NoSQL >> Redis

Introdução ao Redis Cluster Sharding – vantagens, limitações, implantação e conexões de cliente

O Redis Cluster é a implementação nativa de fragmentação disponível no Redis que permite distribuir automaticamente seus dados em vários nós sem precisar depender de ferramentas e utilitários externos. No ScaleGrid, recentemente adicionamos suporte para Redis™* Clusters em nossa plataforma totalmente gerenciada por meio de nossos planos de hospedagem para Redis™. Nesta postagem, apresentaremos as oportunidades avançadas de fragmentação do Redis Cluster, discutiremos suas vantagens e limitações, quando você deve implantar e como se conectar ao seu Redis Cluster.

Fragmentação com cluster Redis

Todo o keyspace nos Redis Clusters é dividido em 16384 slots (chamados de hash slots) e esses slots são atribuídos a vários nós Redis. Uma determinada chave é mapeada para um desses slots e o slot de hash para uma chave é calculado como:

HASH_SLOT =CRC16(chave) mod 16384

As operações com várias chaves são suportadas em clusters Redis, desde que todas as chaves envolvidas em uma única execução de comando pertençam ao mesmo slot de hash. Isso pode ser garantido usando o conceito de tags de hash.

A Redis Cluster Specification é o guia definitivo para entender os aspectos internos da tecnologia, enquanto o Redis Cluster Tutorial fornece diretrizes de implantação e administração.

Vantagens

Confira as principais vantagens do Redis Clusters para ver como ele pode beneficiar suas implantações:

  • Alto desempenho


    O Redis Cluster promete o mesmo nível de desempenho das implantações autônomas do Redis.
  • Alta disponibilidade


    O Redis Cluster oferece suporte à configuração de réplica mestre padrão do Redis para garantir alta disponibilidade e durabilidade. Ele também implementa uma abordagem de consenso semelhante ao Raft para garantir a disponibilidade de todo o cluster.
  • Escalabilidade horizontal e vertical


    A adição ou remoção de novos nós Redis do cluster pode ocorrer de forma transparente e sem qualquer tempo de inatividade. Isso facilita a adição e remoção de fragmentos, a desativação ou o dimensionamento de nós individuais.
  • Solução nativa


    A implantação do Redis Clusters não requer proxies ou ferramentas externas, portanto, não há novas ferramentas com as quais você precise aprender ou se preocupar. Ele também oferece compatibilidade quase completa com implantações autônomas do Redis.

Limitações


Também estamos cientes das limitações para garantir que seja adequado para sua implantação:
  • Requer suporte ao cliente


    Os clientes precisam fazer alterações para oferecer suporte aos clusters Redis. Embora o Redis Clusters já exista há muitos anos, ainda existem clientes que não o suportam. Consulte a documentação do cliente Redis para garantir que o cliente que você usa seja compatível antes de optar por implantar clusters Redis.
  • Suporte limitado de operação com várias teclas


    Conforme mencionado na seção anterior, as operações com várias chaves são suportadas apenas quando todas as chaves em uma única operação pertencem ao mesmo slot. Isso é algo para se ter cuidado ao projetar suas estruturas de dados.
  • Suporta apenas um banco de dados


    Ao contrário dos bancos de dados autônomos, os Redis Clusters suportam apenas um banco de dados (banco de dados 0) e o comando SELECT não é permitido. Como a maioria das pessoas não usa vários bancos de dados, isso também não é uma limitação importante.

Quando você deve implantar um cluster Redis?

A solução Redis Cluster pode ser uma boa opção se você precisar de uma solução Redis fragmentada. O Redis Cluster é uma solução nativa simples e com ótimo desempenho.

Normalmente, as pessoas começam a procurar fragmentar suas implantações do Redis quando começam a saturar um nó Redis autônomo com gravações e desejam distribuir gravações para vários nós. Embora o Redis seja principalmente single thread, a E/S normalmente se torna vinculada à rede ou à memória em um autônomo antes de começar a saturar a CPU. O limite de memória pode ser superado até certo ponto ao optar por adicionar mais memória a um sistema autônomo, mas começa a se tornar proibitivo em termos de custo, backup, reinicialização, tempos de aquecimento etc. além de um determinado ponto.

Por outro lado, se você deseja apenas distribuir sua leitura em vários nós, é muito mais fácil adicionar réplicas de leitura ao autônomo.

Quando comparado a outras soluções de sharding para Redis, o rebalanceamento de shard nos Redis Clusters é transparente para os aplicativos. Isso torna muito fácil adicionar ou remover fragmentos sem afetar o aplicativo.

Introdução ao #Redis Cluster Sharding – vantagens, limitações, quando implantar e conexões do clienteClique para tuitar

Conectando a um cluster Redis

Se você optar por implantar um Redis™ Cluster com ScaleGrid, obterá uma implantação completa do Redis Cluster que é totalmente compatível com a versão padrão.

Se você está apenas começando, inscreva-se para uma avaliação gratuita de 30 dias no console do ScaleGrid e confira esta documentação sobre como criar sua primeira implantação do ScaleGrid para Redis™.

Veja o que você precisa para se conectar ao Redis™ Cluster no ScaleGrid:

  • Lista de nomes de nós
  • Portas
  • String de autenticação

A guia Visão geral da página de detalhes da implantação do Redis™ tem a lista de mestres de cada fragmento, além de números de porta e informações de autenticação:


Alternativamente, a lista de todos os nós do cluster está disponível na guia Máquinas:


Como você deve ter notado, não há muitos exemplos disponíveis mostrando como se conectar a um cluster Redis™ habilitado para autenticação disponível on-line. Aqui estão alguns exemplos usando alguns dos os clientes populares.

Conexão com Java

Entre os clientes Redis Java populares, Jedis e Lettuce são compatíveis com Redis™ Clusters. Vamos pegar Jedis para o nosso exemplo.

Jedis

As conexões do Redis™ Cluster são abstraídas pelo JedisCluster aula. Os melhores exemplos de uso dessa classe para se conectar a Redis™ Clusters podem ser encontrados nos testes Jedis, código-fonte Jedis. Infelizmente, neste momento, quando a autenticação é especificada, o JedisCluster construtor não é muito limpo. Aqui está um exemplo que grava 100 chaves no Redis™ Cluster. Observe que, como as chaves não são marcadas, elas terminarão em slots diferentes em nós diferentes:

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

Os argumentos para o construtor estão documentados nos documentos da API Jedis. Recomendamos que você especifique todos os nós do cluster durante a criação do cluster com Jedis.

Conectando com Ruby

O cliente Redis mais popular em Ruby é o redis-rb. Ele também suporta Redis™ Clusters, então vamos usá-lo em nosso exemplo.

Redis-rb

redis-rb versões 4.1.0 e superiores têm suporte para Redis™ Clusters. O 'cluster' A opção precisa ser especificada durante a inicialização da conexão, e você pode consultar esta documentação para obter a semântica exata. Aqui está o mesmo programa do exemplo Java acima em 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

Conectando com Node.js

Node_redis é o cliente Redis mais popular no Node.js. No entanto, ainda não é compatível oficialmente com Redis™ Clusters. ioredis é outro cliente Redis popular que tem suporte a Redis™ Clusters, então usaremos isso para nosso exemplo Node.js.

ioredis

A documentação do ioredis descreve os detalhes dos parâmetros adicionais que devem ser passados ​​para a conexão com os clusters Redis™, e um exemplo básico também é fornecido no README. Aqui está um programa de exemplo que solicita ao usuário uma chave e lê seu valor no 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);
});

Você deve conseguir executar qualquer um desses exemplos após instalar as versões mais recentes dos drivers Redis em suas máquinas clientes.

Se você estiver pronto para migrar suas implantações do Redis para a plataforma totalmente gerenciada do ScaleGrid para hospedagem do Redis™, confira os incríveis recursos disponíveis no console do ScaleGrid através de um teste gratuito de 30 dias. Nossos planos de hospedagem da AWS para Redis™ estão disponíveis em 14 datacenters diferentes em todo o mundo, e somos o único serviço para Redis™ que permite gerenciar suas implantações em sua própria conta na nuvem.