O que é protocolo de consenso, Raft e etcd (parte 3)
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.
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.
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:
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.
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.
Após a pararda do serviço do servidor líder, o novo líder que foi eleito foi o 7cda5d52624dbc3d.
Notem que:
- O servidor que parei o serviço não aparece mais na lista de servidores do cluster;
- 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:
- O servidor 7cda5d52624dbc3d abriu uma nova eleição se tornou candidato;
- Ele abriu um novo term, votou nele mesmo e depois recebeu os votos dos demais;
- Assim que atingiu o consenso, ele se tornou líder.
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.
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.
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:
Consultar os valores da chaves "chave1" e "chave2":
Veja que, antes de inserirmos essas duas chaves, o index estava com o valor 99. Como inserimos duas chaves, ele incrementou para 101.
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.
O passo a passo foi:
- Listei todas as instâncias do cluster (4 instâncias no total);
- Removi da instância 32e2948b9e0652ab do cluster;
- 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:
- Instalar o etcd no novo nodo, sem iniciar o serviço;
- Adicionar o novo nodo no cluster;
- 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.
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.