Pular para o conteúdo

Arquitetura de software · Dados · 5 min de leitura

Hashing consistente

Distribuir chaves entre servidores de modo que adicionar ou remover um servidor mova só uma pequena parte dos dados.

chave “ana” → Servidor A: hash = 40°hash = 40°chave “bia” → Servidor C: hash = 300°hash = 300°Servidor A → Servidor BServidor B → Servidor Cchave “ana”chave “ana”chave “bia”chave “bia”Servidor A — posição 90°Servidor Aposição 90°Servidor B — posição 210°Servidor Bposição 210°Servidor C — posição 330°Servidor Cposição 330°

Arraste para o lado para ver o diagrama inteiro.

Servidores e chaves são posicionados no mesmo anel pelo hash. Se B sai, só as chaves entre A e B mudam de dono.

O problema do módulo

Com servidor = hash(chave) % N, mudar N (adicionar uma máquina) remapeia quase todas as chaves — o cache inteiro esfria e os dados precisam migrar.

A solução

No hashing consistente, servidores e chaves vivem num anel de valores de hash. Cada chave pertence ao primeiro servidor encontrado no sentido horário. Adicionar ou remover um servidor afeta só o trecho vizinho, em média 1/N das chaves. Nós virtuais (várias posições por servidor) equilibram a carga.

Onde aparece

Caches distribuídos, bancos como Dynamo e Cassandra, balanceadores com afinidade e CDNs.

Em resumo

Referências

Continue aprendendo

Todos os temas de arquitetura de software →