Clusters, fragmentos, e estruturas de dados internas

A: Nó

nó de cluster Iniciar

opções de configuração do servidor Redis com base em na inicialização se sim determinar se o modo de aglomerado aberto, os nós continuará a utilizar os componentes do servidor modo stand-alone, como habilitado para cluster:

Nó vai continuar a usar o manipulador de eventos de comando de arquivo para processar o pedido e retorna a resposta do comando.

Nó continuará a usar o tempo para executar a função de manipulador de eventos serverCron, e a função irá chamar a função específica agrupamento modelo clusterCron serverCron: função clusterCron operação normal responsável por executar em um cluster necessidades de modo a ser executada, como Fofoca mensagens enviar para outros nós do cluster é verificado se o break; se eles precisam para verificar ou automática nó de failover off-line, e similares.

Nó vai continuar a usar o banco de dados para armazenar dados chave, pares chave-valor ainda será uma grande variedade de diferentes tipos de objetos.

nó RDB continuará a usar o módulo AOF persistente e módulo de persistência para realizar um trabalho persistente.

Nó continuará a publicar e assinar módulo para executar PUBLICAR, SUBSCRIBE comandos.

Nó continuará a utilizar o módulo de replicação para copiar um nó.

Nó continuará a usar o ambiente de script Lua para executar a entrada de script Lua cliente

Além disso, o nó vai continuar a usar a estrutura redisServer para manter o estado do servidor, usando a estrutura redisClient para manter o estado do cliente, apenas os dados serão utilizados em um modo de cluster, o nó irá guardá-las para o Clusternode, clusterLink, clusterState no interior da estrutura.

 

 Estrutura de dados

clusterState

Cada nó mantém uma estrutura clusterState que é gravado na perspectiva do nó actual, que o estado actual do cluster - tal como agrupamento é on-line ou off-line, o conjunto contém o número de nós, a corrente era de configuração de cluster /

typedef struct clusterState {// ponteiro para o atual Clusternode nó * mim mesmo; // atual era configuração de cluster, para failover uint64_t currentEpoch; // estado atual do cluster: online ou estado int desligada; // aglomerado processar, pelo menos, um número de nós de um tamanho de ranhura int; // lista de nós do cluster (incluindo nó me) // chave do dicionário para o nome do nó, o nó correspondente ao valor do dicionário estrutura clusternode Dict * nodos;} clusterState;

 

clusternode

estrutura Clusternode para salvar o estado atual de um nó, como o tempo de criação de nome, o nó nó, o nó era configuração atual, endereço IP e o nó

struct Clusternode {// cria um mstime_t ctime tempo nó; // o nome do nó, que consiste de 40 caracteres hexadecimais // por exemplo 68eef66df23420a5862208ef5b1a7005b806f2ff de char nome [REDIS_CLUSTER_NAMELEN]; // // identificação nó utilizando uma variedade de diferentes valores de identificação nó de registro de caracteres (como o nó mestre ou nó escravo), // e o estado atual em que os nós (como online ou offline). bandeiras int; // atual configuração do nó era, para failover uint64_t configEpoch; endereço IP do carvão nó // ip [REDIS_IP_STR_LEN]; porto // número de porta int do nó; // salva as informações necessárias sobre o nó da conexão clusterLink * ligação;};

 

clusterLink

Esta estrutura mantém a informação necessária para nós de ligação, tais como descritor de socket, buffer de entrada e saída de tampão

typedef struct clusterLink {// criar um mstime_t ctime tempo de conexão; // TCP tomada descritor int fd; tampão // saída, salvando as mensagens aguardando para ser enviado para outros nós (mensagem). sds sndbuf; // buffer de entrada, mantém as mensagens recebidas de outros nós. sds rcvbuf; // a este nó associado a uma conexão, se não, então é NULL struct Clusternode * nó;} clusterLink;

 

CLUSTER CONHEÇA alcançar comando

conexões de cliente comando "nó A" send "CLUSTER ENCONTRAM"

Após o "nó A" e "Nó B" sucesso handshake

Dois nós irá estabelecer Nó_de_cluster de cada outra estrutura de dados

Então, a informação "nó A" envia "Node B" Gossip propagação através do acordo para outros nós no cluster, para que outros nós também apertar a mão do "Node B" no final, depois de um período de tempo "Node B" será Todos os nós do conhecimento aglomerado

 

II: atribuição de fenda (ranhura)

Redis conjunto, dois processos básicos:

Construção de um cluster: modo de cluster é ativado, comando de cluster encontram constrói

16384 atribuição ranhura é completada: o aglomerado na linha (quando o índice, 0 ~ 16383: 2048 x 8,2KB)

Como caça-níqueis atribuições: Ligações de cliente para o nó especificado, realizando addslots de cluster ... comando, e só podem ser atribuídos a ranhura Nó actualmente ligado.

 

detalhes de implementação:

1: pista de informações de atribuição

Clusternode cada nó, o comprimento da matriz de char 2048 (binário) de bits de matriz ranhuras [], a gravação actual Clusternode ranhura processado.

Analisando o nó actual, a possibilidade de processar uma ranhura, a complexidade de tempo de O (1)

2: slot de disseminação de informação de atribuição

Nó própria matriz de slots, é enviado para outros nós, os outros nós são atualizados nós clusterState na lista para encontrar o Clusternode correspondente, que atualiza faixas de matriz

3: Informações sobre a gravação de todos os slots atribuídos

estrutura clusterState, Clusternode * ranhura [16384] matriz, uma ficha para cada intervalo de tempo por um processo que clusternode

4: informações de atribuição de slot é armazenada em dois lugares clusterState.slots & clusterNode.slots, para resolver dois problemas:

Através da Clusternode consulta ranhura: tempo de complexidade de O (1)

Por ranhura consultas de fragmentação: A complexidade de tempo de O (1)

 

Três: Run no cluster

Quando um cliente envia um comando relacionado com o nó de banco de dados chave, o nó irá aceitar comandos faça o seguinte:

1: Calcular a ranhura de chave pertence, em função Slot_Number, por tecla para calcular as chaves () declarações CRC16 CRC16 soma de verificação, então prima & situadas 16381 calcula um número inteiro entre 0-16383 como a chave é número do slot.

2: determinar se a ranhura é responsável pelo processamento do nó actual. É, em seguida, executar o comando. Não, de acordo com o nó ponto ranhuras nó IP eo número da porta, o erro movida é devolvido ao cliente, as diretrizes do cliente de direção o tanque está processando nó. Quando o cluster liga automaticamente, irá imprimir único erro movido.

 

fatia Re: Quatro

aglomerado Redis pode ser on-line já atribuído a qualquer número de slots e um nó das chaves relevantes para re-atribuído a outro nó.

1: O princípio

O principal uso Redis gerenciamento de cluster redis_trib software responsável pela implementação, Redis-trib para re-fragmentação, enviando um comando para os nós de origem e de destino.

1: Redis-trib transmissão aglomerado setslot <slots> importar <SOURCE_ID> comando no nó de destino, de modo que o nó de destino está pronto para importação a partir do nó de origem pertence a um pares chave de fenda.

2: Redis-trib transmissão aglomerado setslot <ranhura> migração <target_id> comando no nó de origem, de modo que o nó de origem está pronto para pertencer a um valor de slot pares para o nó de destino.

3: Redis-trib enviado para a fonte nó de cluster getKeySinSlot <ranhura> <count> comando para obter o número máximo de chaves que pertencem a uma tecla pares de slots.

4: cada tecla de acordo com o nome adquirida, Redis-trib o nó fonte envia uma migre <target_ip> <TARGETPORT> <key_name> 0 <timeout> comando, a migrar quintal chave selecionada a partir do nó de origem para o nó de destino. Até migração passado.

5: Redis-trib transmitir um cluster setslot arbitrária nó no cluster <ranhura> node <target_id> comando, o slot de canal atribuído ao nó de destino. Este informações de atribuição é enviado através de uma mensagem para todo o cluster.

2: ASK erro

Quando um nó A para C migrar um nós sulco B, A recebe uma chave de comando no pedido, a chave é apenas uma parte do tanque C, nó Um primeiro olhar em seu próprio banco de dados, se for encontrado, o nó de execução direta o comando. Caso contrário, verificar o seu clusterState.migrating_slots_to [i], para ver se o slot chave pertence a migração está em andamento, se é durante a migração, ASK nó envia um erro para o cliente, orientando o cliente para localizar a ranhura migração nó chave. (Que não é necessariamente o nó)

erros e diferenças MOVIDO

Logo após a carga dos meios de erro sulco MOVIDO foi transferido de um nó para outro nó, o erro MÓVEL recebida, a solicitação de comando pode ser transmitido diretamente ao nó apontou erro movido.

 

Quatro: Mensagem

Cluster, nó de classe de mensagem 5:

ENCONTRE: for recebida uma mensagem que adicionado ao cluster.

PING: um nó segundo grupo de cinco lista de selecionados aleatoriamente de cada nó conhecida, então o tempo mais longo não enviar a mensagem através do envio de mensagem de PING PING destes cinco nós, a fim de detectar nó está online. Além disso, o nó A recebe a última vez que esta mensagem PONG enviado pelo nó B, quando mais de metade do comprimento da opção de cluster de nó-timeout a partir do momento atual do nó A, o nó A também envia uma mensagem de PING para o nó B, nó evitar um longo tempo porque os transmite B nó de destino escolhidos aleatoriamente uma mensagem PING que levou ao nó B atualiza as informações histerese.

PONG: conhecer e a mensagem PING resposta. Além disso, um nó pode notificar o nó para outros nós no cluster por mensagem pong tornou-se o nó principal do nó actualizado.

FALHA: Quando um nó mestre A determina o principal Node B entrou outro estado FALHA, o nó A será uma mensagem FALHA na transmissão conjunto B, todos os nós receberá a mensagem de como o B marcado offline. A razão desta vez não está em uso Fofoca Fofoca acordo protocolo será adiada levar algum tempo para se propagar por todo o cluster, e quando o nó foi desligado as necessidades da linha de montagem a ser feito o mais cedo possível failover.

PUBLICAÇÃO: Quando um nó recebe um comando PUBLICAR, o nó irá executar o comando, a publicar mensagem de difusão para o cluster, todos receberam este montante PUBLICAR nó da mensagem irá executar o mesmo comando.

Redis dentro do cluster, usando o protocolo Fofocas, diferentes nós trocar informações de status. Especificamente, o protocolo de fofoca por A reunião, sibilo, pong três tipos de mensagens.

 

 

 

 

Publicado 50 artigos originais · ganhou elogios 2 · Vistas 2301

Acho que você gosta

Origin blog.csdn.net/eafun_888/article/details/104714240
Recomendado
Clasificación