O que é protocolo de consenso, Raft e etcd (parte 3)

Marcelo Ortiz
6 min readJan 14, 2022

--

Então chegamos no último artigo dessa série, vamos aprofundar a explicação do etcd e ver na prática com tudo isso funciona.

Recapítulando, no primeiro artigo conceituamos o que é o protocolo de consenso, as bases do Raft (strong leader, leader election e membership changes), como funciona a replicação da máquina de estado, os estados que um servidor pode estar em um cluster usando o raft o que é o term (relógio lógico). Você pode acessar o primeiro artigo através do link https://medium.com/@mclortizz/o-que-%C3%A9-protocolo-de-consenso-raft-e-etcd-de9887743dd7.

No segundo artigo descemos ainda mais em alguns conceitos do raft. Pontuamos sobre o algoritmo, detalhamos o mecanismo de eleição de um líder, replicação de log e mudança de membros de um cluster. Caso queira consultar o segundo artigo acesse o link https://medium.com/@mclortizz/o-que-%C3%A9-protocolo-de-consenso-raft-e-etcd-parte-2-f12e48fd962e.

Agora a ideia é demonstrar como todos esses conceitos funcionam em uma implementação de raft. Para isso, escolhi o etcd pois, além dele ser a implementação mais usada (figura abaixo), ele também é usado no Kubernetes.

Vamos demonstrar os aspectos gerais de um cluster etcd (index, terms, líder), simular uma eleição, uma inserção de chaves e uma remoção e adição de nodo no cluster.

Implementação mais usada, segundo o site https://raft.github.io/ acessado em 14/01/2022

O que é o etcd?

O etcd é um projeto open-source de key-value store para dados críticos de um sistema distribuído. Ele distribui os valores das chaves através de replicação de dados para múltiplas instâncias, em um ambiente de alta disponibilidade. O etcd implementa os conceitos do protocolo raft para lidar com particionamentos de rede e falhas de instâncias. Ele é usado em produtos como CoreOs e Kubernetes.

Ambiente da Demonstração

Para fazer essa demonstração eu montei um ambiente na AWS com 4 servidores, 3 nodos na região da Califórnia e 1 nodo na região de Oregon, conforme abaixo.

Ambiente construído na AWS

Para instalação do etcd em cada um desses servidores eu utilizei o procedimento do link https://docs.portworx.com/reference/knowledge-base/etcd-quick-setup/ (acessado em 14/01/2022).

Uma vez o etcd instalado, o cluster ficou com essa configuração:

Configuração do ambiente

A parte oculta da imagem são os IPs. Apesar de ser IPs privados, achei melhor ocultar. :)

Status Geral do Cluster etcd

Com o comando "etcdctl endpoint status" é possível ter uma visão geral do estado do cluster.

Visão geral do cluster etcd

Nessa visão temos algumas informações importantes:

  • ID: que mostra identificador do nodo (esse identificador é único);
  • Version: qual é a versão do etcd instalada nos nodos. No nosso caso instalei a versão 3.5.0;
  • DB Size: tamanho da DB com as chaves;
  • Is Leader: informa quem é o líder do cluster;
  • Raft Term: mostra qual é o term atual do cluster, nessse caso é 6 (ou seja, já tívemos 6 eleições);
  • Raft Index: é o index do log, nesse caso está aplicado o log de index 93.

Eleição

Agora vamos entrar na prática, para ver como acontece uma eleição, vou parar o serviço do etcd no servidor que atualmente é o líder.

Conforme figura abaixo, o servidor líder o cluster é o 32e2948b9e0652ab.

Servidor líder do cluster

Após a pararda do serviço do servidor líder, o novo líder que foi eleito foi o 7cda5d52624dbc3d.

Novo servidor líder do cluster

Notem que:

  1. O servidor que parei o serviço não aparece mais na lista de servidores do cluster;
  2. O term subiu de 6 para 7, indicando que houve a eleição de um novo líder.

O log do etcd mostra todo o processo, veja que:

  1. O servidor 7cda5d52624dbc3d abriu uma nova eleição se tornou candidato;
  2. Ele abriu um novo term, votou nele mesmo e depois recebeu os votos dos demais;
  3. Assim que atingiu o consenso, ele se tornou líder.
Log da eleição do servidor 7cda5d52624dbc3d

Ou seja, o etcd implementa todos os conceitos do raft. Há um timeout do líder, um dos servidores se torna candidato, recebe votos e ao atingir o consenso, se torna líder do cluster.

Replicação dos Logs

Agora vamos simular a inserção de chaves e valores para visualizar como funciona o mecanismo.

Toda instância etcd possui um arquivo de log, que é sincronizado. Esse arquivo é chamado WAL.

Arquivo wal

Toda vez que inserimos alguma chave ou valor, o index vai incrementar. Então, antes de inserir, vamos olhar qual é o index atual do cluster.

No nosso exemplo, o index atual é o 99.

Index atual

Para inserir alguma chave e valor, basta executar o comando "etcdctl put" e para consultar o valor da chave, basta executar o comando "etcdctl get". Abaixo exemplo de "put" e "get".

Inserir as chaves "chave1" e "chave2" com os valores "ola" e "mundo" respectivamente:

Inserir chaves

Consultar os valores da chaves "chave1" e "chave2":

Consulta de valores das chaves

Veja que, antes de inserirmos essas duas chaves, o index estava com o valor 99. Como inserimos duas chaves, ele incrementou para 101.

Novo valor do index

E é isso, super simples!

Remoção e Adição de Nodos no Cluster

Chegou nossa última demonstração, a remoção e adição de nodos no cluster. Vamos começar com a remoção de um nodo no cluster. É uma operação bastante simples. O comando que precisa ser executado é: "etcdctl member remove {id}".

No exemplo abaixo estou removendo a instância com o id 32e2948b9e0652ab do cluster.

Remoção de um nodo do cluster

O passo a passo foi:

  1. Listei todas as instâncias do cluster (4 instâncias no total);
  2. Removi da instância 32e2948b9e0652ab do cluster;
  3. Listei novamente todas as instâncias do cluster (3 instâncias no total).

Já a adição de um novo nodo no cluster é um pouco mais complexo, principalmente se for um nodo novo. Nesses casos é preciso:

  1. Instalar o etcd no novo nodo, sem iniciar o serviço;
  2. Adicionar o novo nodo no cluster;
  3. Iniciar o serviço no novo nodo.

Um aspecto importante, para o passo 1 (de instalação), para adicionar um novo nodo no cluster existe um parametro do arquivo "etcd3.service" que precisa ser ajustado. O default do parâmetro "initial-cluster-state" é "new". Porém, para um cluster que já existe, esse parâmetro, no novo nodo, deve ser "existing".

Uma vez o etcd instalado, o próximo passo é adicionar o novo nodo no cluster. O comando para isso é: "etcdctl member add {node_name} — peer-urls=http://{node_ip}:2380".

Uma vez o cluster adicionado, basta iniciar o serviço no novo nodo.

Inserção do novo nodo

Conclusão

Os objetivos dessa série de artigos foram fundamentar o que é protocolo de consenso, explicar as bases do raft (que é um dos principais protocolos de consenso) e demonstrar na prática de como isso funciona (através do etcd). Protocolo de consenso, suas bases, conceitos e práticas são fundamentais para todos que buscam aprofundar os conhecimentos em sistemas distribuídos. Espero que essa série de artigos ajude nesse entendimento.

Muito obrigado!

Marcelo Ortiz, Engenheiro da Computação, mestrando em Ciência da Computação.

--

--