Power Node Redis7 Notes - Capítulo 6 Redis Distributed System

6 sistema distribuído Redis

Sistema distribuído Redis, oficialmente chamado Redis Cluster, cluster Redis, que é uma solução distribuída lançada pelo Redis 3.0. Ele pode resolver o problema de armazenar diferentes dados em diferentes nós do Redis e rotear convenientemente as solicitações do usuário para diferentes Redis.

6.1 Algoritmo de Partição de Dados

O sistema de banco de dados distribuído irá dispersar e armazenar dados em diferentes nós de servidor de banco de dados de acordo com diferentes algoritmos de partição de dados, e cada nó gerencia um subconjunto de todo o conjunto de dados.

Existem duas regras comuns de particionamento de dados: particionamento sequencial e particionamento hash.

6.1.1 Particionamento Sequencial

As regras de particionamento sequencial podem distribuir dados uniformemente para diferentes nós em uma determinada ordem. Diferentes métodos de ordenação produzem diferentes algoritmos de particionamento. Por exemplo, algoritmo de particionamento round-robin, algoritmo de particionamento round-robin de fatia de tempo, algoritmo de particionamento de bloco de dados, algoritmo de particionamento de tópicos de negócios, etc. Como esses algoritmos são relativamente simples, eles não serão descritos aqui.

6.1.1.1 Algoritmo de particionamento Round Robin

Cada vez que um dado é gerado, ele é atribuído a diferentes nós sucessivamente. Esse algoritmo é adequado para cenários em que o problema de dados é incerto. Como resultado de sua distribuição, quando a quantidade total de dados é muito grande, os dados em cada nó são muito medianos. No entanto, a conexão entre o produtor e o nó de dados precisa ser mantida por muito tempo.

6.1.1.2 Algoritmo de particionamento de rotação de fatia de tempo

Os dados dentro de uma fatia de tempo de comprimento fixo serão atribuídos a um nó. Após o término da fatia de tempo, os dados regenerados serão distribuídos para o próximo nó. Esses nós serão alternados para alocar dados. O algoritmo pode ter dados de nó irregulares (porque a quantidade de dados gerados em cada fatia de tempo pode ser diferente). No entanto, a conexão entre o produtor e o nó precisa ocupar apenas aquela atualmente em uso, e as demais conexões serão liberadas imediatamente após o uso.

6.1.1.3 Algoritmo de partição de bloco de dados

Quando a quantidade total de dados gerais é determinada, de acordo com a capacidade de armazenamento de cada nó, um bloco inteiro de dados conectados pode ser alocado para um determinado nó.

6.1.1.4 Algoritmo de Particionamento de Tópicos de Negócios

Os dados podem ser alocados para diferentes nós de acordo com diferentes temas de negócios.

6.1.2 Particionamento Hash

A regra de partição de hash é fazer uso total do valor de hash dos dados para concluir a distribuição. Diferentes métodos de uso do valor de hash de dados produzem diferentes algoritmos de partição de hash. O algoritmo de partição de hash é relativamente complicado. Aqui estão vários algoritmos de partição de hash comuns.

6.1.2.1 Algoritmo de partição de módulo de nó

A premissa desse algoritmo é que a cada nó foi atribuído um número de sequência exclusivo e, para um sistema distribuído com N nós, o intervalo do número de sequência é [0, N-1]. Em seguida, selecione os próprios dados ou uma parte dos dados que possam representar as características dos dados como a chave, calcule o módulo do hash (chave) e o número de nós N, e o resultado do cálculo é o número serial do armazenamento nó dos dados.
A maior vantagem deste algoritmo é a sua simplicidade, mas também apresenta sérias deficiências. Se o sistema distribuído aumentar ou diminuir, os dados armazenados precisam ser migrados de acordo com o novo número de nós N, caso contrário o usuário não conseguirá mais encontrar os dados originais com base na chave. A expansão na produção geralmente adota o método de expansão duplicada para reduzir a proporção de migração de dados durante a expansão.

6.1.2.2 Algoritmo de Particionamento Hash Consistente

O algoritmo de hash consistente é implementado por meio de uma estrutura de dados chamada anel de hash consistente. O ponto inicial deste anel é 0, o ponto final é 232 - 1 e o ponto inicial coincide com o ponto final. Os inteiros no meio do anel são distribuídos no sentido anti-horário, então o intervalo de distribuição de inteiros desse anel é [0, 232-1].

Na figura acima, existem quatro objetos o1, o2, o3 e o4, que representam respectivamente quatro dados a serem alocados, e os quadrados vermelhos são os pontos de queda do hash(o) desses quatro dados no anel Hash. Ao mesmo tempo, existem três nós m0, m1 e m2 no gráfico, e o círculo verde é o ponto de queda do hash(m) desses três nós no anel Hash.
Agora é hora de atribuir os dados ao nó onde serão armazenados. O hash(o) do objeto de dados está mais próximo do hash(m) do nó no sentido anti-horário e os dados são armazenados no nó. Isso resulta na distribuição mostrada na figura acima.
A maior vantagem desse algoritmo é que a expansão e a contração de um nó afetam apenas o nó mais próximo do nó no sentido anti-horário e não afetam os outros nós.
Quando o número de nós é pequeno, é muito fácil formar um problema de distorção de dados, e o número de nós afetados pelas alterações de nós é responsável por uma grande proporção, ou seja, a quantidade de dados afetados é grande. Portanto, esse método não é adequado para cenários com menos nós de dados.

6.1.2.3 Algoritmo de partição de slot virtual

O algoritmo primeiro virtualiza um número fixo de conjuntos de inteiros, e cada inteiro no conjunto é chamado de slot. O número de slots é geralmente muito maior que o número de nós. Em seguida, mapeie todos os slots de slot para cada nó em média. Por exemplo, um total de 16384 slots são virtualizados no sistema distribuído Redis e o intervalo é [0, 16383]. Supondo que existam 3 nós no total, a relação de mapeamento entre slots e nós é mostrada na figura abaixo:

e os dados são apenas relacionados a slots, não diretamente relacionados a nós. Os dados são mapeados apenas para o slot por meio do hash(key) de sua chave: slot = hash(key) % slotNums. Esta também é uma vantagem do algoritmo, dados e nós são desacoplados, o cliente não precisa manter os nós, mas apenas manter o relacionamento com o slot.
Este algoritmo é usado para particionamento de dados Redis. A fórmula para calcular os pontos de slot é: slot = CRC16(key) % 16384. CRC16() é uma função de algoritmo de hash especial com função de verificação e boa função de dispersão. Na verdade, a fórmula para calcular os slots no Redis não é a anterior, mas sim: slot = CRC16(key) &16383.
Para calcular a % b, se b for uma potência de 2, então a % b = a & (b-1).

6.2 Construção e Operação do Sistema

6.2.1 Construção do Sistema

6.2.1.1 Arquitetura do Sistema

O sistema distribuído Redis a ser construído abaixo consiste em 6 nós. Os endereços e as funções desses 6 nós são mostrados na tabela abaixo. Um mestre está equipado com um escravo, mas a relação de emparelhamento entre o mestre e o escravo será atribuída automaticamente depois que o sistema for construído com sucesso.

número de série Papel endereço
1 mestre 127.0.0.1:6380
2 mestre 127.0.0.1:6381
3 mestre 127.0.0.1:6382
4 escravo 127.0.0.1:6383
5 escravo 127.0.0.1:6384
6 escravo 127.0.0.1:6385

6.2.1.2 Excluir arquivos persistentes

Primeiro exclua o arquivo persistente RDB dump638*.conf e o arquivo persistente AOF gerado no diretório de instalação do Redis no "cluster mestre-escravo Redis" anterior. Porque o sistema distribuído Redis requer criação em um banco de dados vazio. Observe que todos os arquivos persistentes AOF estão no diretório appendonlydir.

6.2.1.3 Criar diretório

No diretório de instalação do Redis, mkdir um novo diretório cluster-dis, que é usado como o diretório de trabalho do sistema distribuído.

6.2.1.4 Copiar 2 arquivos de configuração

Copie os arquivos redis.conf e redis6380.conf no diretório cluster para o diretório cluster-dis.

6.2.1.5 Modificar redis.conf

Para o arquivo de configuração redis.conf, ele envolve principalmente os três ou quatro atributos a seguir:

6.2.1.5.1 dir.


Especifique o diretório de trabalho como o diretório cluster-dis criado anteriormente. Arquivos de persistência e arquivos de configuração de nó serão gerados automaticamente no diretório de trabalho no futuro.

6.2.1.5.2 habilitado para cluster


Essa propriedade é usada para ativar o modo de cluster do Redis.

6.2.1.5.3 arquivo de configuração do cluster


Esta propriedade é usada para especificar o arquivo de configuração de um "nó de cluster". Este arquivo será gerado automaticamente quando o nó for iniciado pela primeira vez e o caminho gerado estiver no diretório de trabalho especificado pelo atributo dir. Depois que as informações do nó do cluster forem alteradas (como nó offline, failover etc.), o nó salvará automaticamente as informações de status do cluster no arquivo de configuração.
No entanto, a propriedade permanece comentada aqui. Configure-o em um arquivo de configuração separado para cada nó a seguir.

6.2.1.5.4 tempo limite do nó do cluster


Usado para especificar o limite de tempo limite para comunicação entre "nós de cluster", em milissegundos.

6.2.1.6 Modificar redis6380.conf


Basta adicionar uma propriedade cluster-config-file.

6.2.1.7 Copiar 5 arquivos de configuração

Use redis6380.conf para copiar 5 arquivos de configuração redis6381.conf, redis6382.conf, redis6383.conf, redis6384.conf, redis6385.conf.

Existem 7 arquivos de configuração em cluster-dis.

6.2.1.8 Modificar 5 arquivos de configuração

Modifique o conteúdo dos cinco arquivos de configuração redis6381.conf, redis6382.conf, redis6383.conf, redis6384.conf e redis6385.conf e substitua todos os números de porta envolvidos pelos números de porta no nome do arquivo atual. Por exemplo, o seguinte é o conteúdo do arquivo de configuração de redis6381.conf.

6.2.2 Inicialização e desligamento do sistema

6.2.2.1 Nós Iniciais

Inicie todos os nós do Redis.


Verifique o diretório cluster-dis neste momento e você verá que os arquivos de configuração para 6 nós foram gerados.

6.2.2.2 Criar sistema

Depois que os 6 nós são iniciados, eles ainda são 6 Redis independentes e um sistema distribuído pode ser criado com 6 nós por meio do comando redis-cli --cluster create.

Este comando é usado para conectar os 6 nós especificados em um sistema distribuído. --cluster replicas 1 especifica que cada mestre terá um escravo como cópia.
Depois de pressionar Enter, você verá o seguinte log imediatamente:

Digite sim e pressione Enter, o sistema realmente aplicará as informações de configuração dinâmica exibidas acima ao nó e, em seguida, você poderá ver o seguinte log:

6.2.2.3 Sistema de teste


Por meio do comando cluster nodes, é possível visualizar o relacionamento e o status da conexão de cada nó no sistema. Contanto que você possa ver que cada nó está conectado, isso significa que o sistema distribuído foi construído com sucesso. No entanto, para o comando de conexão do cliente redis-cli, você precisa prestar atenção a dois pontos:

  • redis-cli tem o parâmetro -c, indicando que isso é para se conectar a um "cluster" em vez de um nó.
  • Qualquer um dos 6 pode ser usado para o número da porta.

6.2.2.4 Desligando o sistema

Para o desligamento do sistema distribuído, basta desligar cada nó.

6.3 Operação do Cluster

6.3.1 Conecte-se ao cluster

Não importa como você deseja operar um sistema distribuído, você precisa se conectar primeiro.

A única diferença em comparação com a conexão autônoma anterior é a adição do parâmetro -c.

6.3.2 Escrever dados

6.3.2.1 Gravação de tecla única

Independentemente de o tipo de valor ser String ou um tipo de coleção como List ou Set, desde que a operação seja uma chave ao escrever, não há problema em um sistema distribuído. Por exemplo,

6.3.2.2 Operação em lote de chaves

Para a operação de gravação de várias chaves ao mesmo tempo, uma vez que várias chaves calcularão vários slots, vários slots podem corresponder a vários nós. Como apenas um nó pode ser gravado por vez, esta operação relatará um erro.

No entanto, o sistema também fornece um esquema de operação para chaves de lote, especificando um grupo unificado para essas chaves e tornando esse grupo o único valor para o cálculo do slot.

6.3.3 Consulta de cluster

6.3.3.1 Consultar o slot da chave

O slot da chave especificada pode ser consultado por meio do slot de chave do cluster. Por exemplo, o seguinte é o slot para consultar emp.

6.3.3.2 Consultar o número de chaves no slot

Use o comando cluster countkeysinslot para visualizar o número de chaves contidas no slot especificado.

6.3.3.3 Consultar a chave no slot

Use o comando cluster getkeysinslot para visualizar as chaves contidas no slot especificado.

6.3.4 Failover

Se um mestre no sistema distribuído cair, seu escravo correspondente será automaticamente promovido a mestre. Se o mestre original for reiniciado, o mestre original se tornará automaticamente o escravo do novo mestre.

6.3.4.1 Simulando falhas

Por meio do comando cluster nodes, é possível visualizar a estrutura geral e o status da conexão do sistema.

Obviamente, você também pode visualizar a função do nó conectado ao cliente atual por meio da replicação de informações. Pode-se ver que o nó 6381 é o mestre e seu escravo é o nó 6383.

Para simular o tempo de inatividade do 6381, desligue-o diretamente.

Depois de se conectar ao nó 6383 por meio do cliente, você pode ver que ele foi promovido automaticamente a mestre.

Depois de reiniciar o nó 6381, verifique sua função e descubra que ele se torna automaticamente escravo do nó 6383.

6.3.4.2 Requisitos de cobertura total

Se todos os mestres e escravos dos nós correspondentes a um determinado intervalo de slots estiverem inativos, se todo o sistema distribuído ainda pode fornecer serviços de leitura externos depende da configuração do atributo cluster-require-full-coverage.

Este atributo tem dois valores:

  • sim: o valor padrão. O sistema pode ser executado somente quando todos os nós de slot estiverem totalmente cobertos.
  • no: O sistema também pode fornecer serviços de consulta quando os nós do slot estiverem incompletos.

6.3.5 Expansão do Cluster

下面要在正在运行的分布式系统中添加两个新的节点:端口号为6386的节点为master节点,其下会有一个端口号为6387的slave节点。

6.3.5.1 Copie e modifique 2 arquivos de configuração

Use redis6380.conf para copiar os dois arquivos de configuração redis6386.conf e redis6387.conf e modifique os números de porta em cada local para os números de porta correspondentes para preparar a expansão do cluster.

6.3.5.2 Iniciar o sistema com 2 nós

Como o que será demonstrado é a expansão dinâmica durante a operação do sistema distribuído, então aqui começamos primeiro o sistema distribuído.

Os dois nós a serem adicionados são dois Redis, então eles precisam ser iniciados primeiro. No entanto, antes de serem adicionados ao sistema distribuído, os dois são nós isolados e cada nó não tem nada a ver com nenhum outro nó.

6.3.5.3 Adicionar nó mestre


Novos nós podem ser adicionados ao sistema pelo comando redis-cli --cluster add-node {newHost}:{newPort} {existHost}:{existPort}. Onde {newHost}:{newPort} é o endereço do nó recém-adicionado e {existHost}:{existPort} é o endereço de qualquer nó no sistema original.
Depois que a adição for bem-sucedida, você poderá ver o log a seguir.

Depois que a adição for bem-sucedida, por meio do comando redis-cli -c -p 6386 cluster nodes, você poderá ver que outros nós mestres têm slots atribuídos e apenas o mestre recém-adicionado não tem slots correspondentes. Obviamente, o ID dinâmico do novo nó também pode ser visto por meio deste comando.

6.3.5.4 Alocação de slots

Os slots alocados para o novo mestre vêm de outros nós e o número total de slots não será alterado. Portanto, o processo de alocação de slots é essencialmente um processo de movimentação de slots.
Use o comando redis-cli –c --cluster reshard {existIP}:{existPort} para iniciar o processo de alocação de slots. O endereço {existIP}:{existPort} é o endereço de qualquer nó no sistema distribuído.

Nesse processo, a alocação de slot do nó atual será consultada primeiro.

Em seguida, inicie a interação de perguntas e respostas. Um total de quatro perguntas foram feitas, aqui estão três:

  • Quantos slots você vai mover?
  • Quem vai receber o slot móvel?
  • Selecione o nó de origem para mover o slot. Existem duas opções. Se você optar por digitar todos, todos os nós de slots existentes serão usados ​​como nós de origem de slots, ou seja, esta solução fará uma alocação global de slots grandes. Você também pode selecionar outros nós parciais como nós de origem do slot. Neste momento, copie o ID dinâmico do nó de origem aqui, pressione Enter após digitar cada ID e, em seguida, copie o ID dinâmico do próximo nó de origem do slot e, em seguida, digite feito até que o último seja concluído e pressione Enter.

O tipo aqui é all, para alocação global grande.

Ele primeiro detectará os dados do nó de origem do slot especificado e, em seguida, formulará um plano de reshard.

Haverá outra interação de perguntas e respostas aqui, perguntando se você deseja continuar trabalhando na solução recomendada. Digite sim e inicie a alocação global real até a conclusão.

Neste momento, verifique as informações do nó por meio do comando redis-cli -c -p 6386 cluster nodes e você verá que os slots foram alocados para os 6386 nós, mas os números dos slots alocados não são contínuos. O nó principal foi adicionado.

6.3.5.5 Adicionar nó escravo

Agora adicione o nó 6387 como escravo do nó 6386. Obviamente, antes de tudo, verifique se o Redis do nó 6387 foi iniciado.
Por meio do comando redis-cli --cluster add-node {newHost}:{newPort} {existHost}:{existPort} --cluster-slave --cluster-master-id masterID, o nó recém-adicionado pode ser adicionado diretamente como o mestre-escravo especificado.

Depois de pressionar Enter, você pode ver o log a seguir, indicando que a adição foi bem-sucedida.

Neste momento, através do comando redis-cli -c -p 6386 cluster nodes, você pode ver que ele foi adicionado com sucesso e é o escravo do mestre especificado.

6.3.6 Encolhimento do cluster

Em seguida, o nó escravo 6387 e o nó mestre 6386 serão excluídos do sistema distribuído.

6.3.6.1 Excluir nó escravo

Para nós escravos, você pode excluí-los diretamente por meio do comando redis-cli --cluster del-node : delNodeID.

Verifique o cluster neste momento e descubra que não há mais 6387 nós.

6.3.6.2 Remova o slot mestre

Antes de excluir um mestre, deve-se garantir que não haja slots alocados no mestre. Caso contrário, não pode ser excluído. Portanto, antes de excluir um mestre, o slot alocado nele precisa ser removido.

A interação acima especifica que os slots de 1999 no nó 6386 são movidos para o nó 6380.
Perceber:

  • O número de slots contidos no nó a ser excluído pode ser visto nos resultados da detecção anterior. Por exemplo, o número de slots em 6386 não é 2000, mas 1999
  • Qual é o ID do nó receptor? Somente um nó receptor pode ser especificado

Entre e continue.


Verifique novamente neste momento e descubra que não há slot no nó 6386.

6.3.6.3 Excluir o nó mestre

Neste ponto, o nó 6386 pode ser excluído.

Neste momento, verifique o cluster novamente e descubra que não há 6386 nós.

6.4 Limitações dos Sistemas Distribuídos

O sistema distribuído do Redis possui algumas restrições de uso:

  • Apenas o número de banco de dados 0 é suportado
  • O suporte à operação de chave em lote é limitado
  • As partições são limitadas a chaves
  • suporte limitado a transações
  • Não suporta gerenciamento hierárquico

Acho que você gosta

Origin blog.csdn.net/f5465245/article/details/130951775
Recomendado
Clasificación