Pular para o conteúdo principal

Version Vector

Descrição​

O Version Vector associa a cada valor de uma chave um vetor com um contador por nó do cluster. Quando um nó atualiza o valor localmente, incrementa apenas o seu próprio contador. Quando as réplicas trocam dados, comparam os vetores: se um vetor é maior ou igual ao outro em todas as posições, o valor correspondente é mais novo e substitui o outro; se cada um é maior em alguma posição, as atualizações foram concorrentes, e há um conflito a ser resolvido.

A resolução pode ser feita pelo cliente, por uma regra como last-write-wins ou por tipos de dados de merge (CRDTs). Isso permite que vários servidores aceitem escritas para a mesma chave sem líder e detectem conflitos depois, em vez de impedi-los.

É usado em Dynamo e Riak; Cassandra optou por timestamps (last-write-wins) em vez de vetores.

Problemas que resolve​

  • Quando vários servidores aceitam atualizações para a mesma chave, é preciso detectar se réplicas receberam modificações concorrentes.
  • Relógios físicos não são confiáveis para ordenar eventos entre nós.

Quando usar​

  • Armazenamentos sem líder (leaderless), com replicação multi-mestre e alta disponibilidade de escrita.
  • Quando conflitos devem ser detectados e resolvidos explicitamente, em vez de silenciosamente descartados.

Quando evitar​

  • Sistemas com um líder único, em que a ordem já é definida (use Versioned Value).
  • Clusters muito grandes, pois o vetor cresce com o número de nós.
  • Quando last-write-wins é aceitável.

Trade-offs​

GanhoCusto / Risco
Detecta atualizações concorrentes sem relógios sincronizadosO tamanho do vetor cresce com o número de nós ou clientes
Permite escrita em qualquer réplica, com alta disponibilidadeConflitos precisam de resolução, que pode ser complexa
Preserva causalidade entre atualizaçõesMais complexo que um simples número de versão
  • Poda: limite o tamanho do vetor, removendo entradas antigas, ao custo de precisão.
  • Dotted version vectors: reduzem o crescimento por cliente.

Diagrama​

Dois nós atualizam a mesma chave sem conhecer a atualização do outro; ao sincronizar, a comparação dos vetores revela o conflito.

Padrões relacionados​

Referência​