Entendendo a Eleição do Nó Mestre no Elasticsearch e os Requisitos de Quórum
Como funcionam as eleições de mestre e o quórum no Elasticsearch, com orientações práticas para evitar split-brain e configurações inseguras de bootstrap.
Entendendo a Eleição do Nó Mestre no Elasticsearch e os Requisitos de Quórum
O quórum do nó mestre no Elasticsearch decide se seu cluster pode eleger um líder com segurança, publicar mudanças no estado do cluster e evitar que dois lados desconectados do mesmo cluster tomem decisões diferentes.
O mestre eleito não torna as buscas mais rápidas por si só. Ele coordena o cluster. Quando as eleições são instáveis, os sintomas podem parecer dispersos: a criação de índices trava, a alocação de shards para, o Kibana relata estados de saúde variáveis e os logs repetem mensagens sobre um mestre não encontrado.
O Papel Crítico do Nó Mestre
Enquanto os nós de dados lidam com o trabalho pesado de indexação, busca e armazenamento de dados, o nó mestre é responsável por gerenciar a estrutura e os metadados de todo o cluster. Ele normalmente não participa de operações de consulta ou indexação, a menos que também seja configurado como um nó de dados.
Responsabilidades do Nó Mestre
- Gerenciamento do Estado do Cluster: O mestre mantém e publica o estado do cluster—um blueprint da configuração atual do cluster, incluindo quais índices existem, os mapeamentos e configurações desses índices e a localização de cada shard.
- Gerenciamento de Nós: Lidar com a entrada e saída de nós, atualizando o estado do cluster de acordo.
- Gerenciamento de Índices: Criar, deletar ou atualizar índices.
- Alocação de Shards: Decidir onde os shards primários e réplicas devem residir (alocação inicial e rebalanceamento após falha de nó).
Se o mestre eleito falhar, o cluster pausa o trabalho exclusivo do mestre até que outro mestre seja eleito. As buscas existentes podem continuar para shards disponíveis, mas a criação de índices, atualizações de mapeamento e decisões de alocação dependem de uma coordenação estável do mestre.
Entendendo a Eleição e Votação do Mestre
Em um sistema distribuído, um processo de eleição é necessário sempre que o nó mestre atual falha ou se torna inalcançável. Desde o Elasticsearch 7.0, o mecanismo de eleição foi significativamente simplificado e fortalecido, principalmente através da eliminação da complexa configuração discovery.zen.minimum_master_nodes e da introdução de Configurações de Votação autogerenciadas.
O Processo de Eleição (Elasticsearch 7.x+)
A eleição do mestre agora é tratada automaticamente pelos nós elegíveis a mestre, que são definidos na configuração usando node.roles: [master, data], ou apenas node.roles: [master] para mestres dedicados.
- Descoberta de Candidatos: Nós elegíveis a mestre se comunicam para determinar o conjunto de membros votantes ativos.
- Verificação de Quórum: Os nós verificam se podem alcançar um quórum—uma maioria dos nós votantes conhecidos—para garantir consenso.
- Seleção do Líder: Se um quórum for estabelecido, o subsistema de coordenação do Elasticsearch seleciona um mestre de acordo com suas regras internas de eleição.
- Votação e Compromisso: A proposta é votada e, se aceita pela maioria, o novo mestre assume o controle e publica o novo estado do cluster.
Inicialização Inicial do Cluster
Ao iniciar um cluster novo pela primeira vez, o Elasticsearch precisa saber quais nós devem participar da configuração de votação inicial. Isso é tratado usando a configuração cluster.initial_master_nodes. Esta configuração deve ser usada apenas uma vez durante a inicialização inicial do cluster.
# Trecho do elasticsearch.yml para configuração inicial
cluster.name: my-production-cluster
node.name: node-1
node.roles: [master, data]
# Liste os nomes de todos os nós elegíveis a mestre usados para o bootstrap inicial
cluster.initial_master_nodes: [node-1, node-2, node-3]
Dica: Depois que o cluster for formado, remova
cluster.initial_master_nodesde todos os nós. Mantê-lo pode ser perigoso durante reinicializações posteriores, pois esta configuração é destinada apenas ao primeiro bootstrap de um cluster novo.
Requisitos de Quórum e Prevenção de Split-Brain
A razão fundamental para os requisitos de quórum é garantir que apenas um líder possa ser eleito a qualquer momento, prevenindo assim o problema de split-brain.
O que é Split-Brain?
Split-brain ocorre quando uma partição de rede divide o cluster em segmentos isolados, e mais de um segmento acredita ter o mestre autoritativo. Se isso acontecer, lados diferentes podem aceitar mudanças conflitantes no estado do cluster, que é exatamente o que o quórum foi projetado para prevenir.
A Regra do Quórum (Consenso da Maioria)
Para prevenir split-brain, o Elasticsearch aplica uma regra de consenso da maioria, exigindo um número mínimo de nós votantes para concordar com qualquer mudança no estado do cluster. Este mínimo é o quórum, calculado como:
$$\text{Quórum} = \lfloor (\text{Número de Nós Votantes} / 2) \rfloor + 1$$
Ao exigir uma maioria estrita, se a rede for particionada, apenas o lado maior (que detém a maioria) pode atingir o quórum e continuar operando. O lado menor, incapaz de eleger um mestre, irá parar e aguardar a restauração da conectividade de rede, evitando assim gravações de dados no segmento particionado.
| Número de Nós Mestres Votantes (N) | Quórum Necessário (N/2 + 1) |
|---|---|
| 3 | 2 |
| 5 | 3 |
| 7 | 4 |
Aviso de Melhores Práticas: Sempre implante um número ímpar de nós elegíveis a mestre (por exemplo, três ou cinco). Implantar um número par (por exemplo, quatro) oferece a mesma tolerância a falhas que o número ímpar anterior (três), mas requer mais recursos. Por exemplo, um cluster de votação de 4 nós requer 3 votos (N/2+1), o que significa que pode tolerar apenas uma falha, assim como um cluster de 3 nós, mas usa um servidor extra.
Configurando Nós Mestres Dedicados
Para ambientes de produção, três nós dedicados elegíveis a mestre são a linha de base comum. Isso separa a carga de busca e indexação do trabalho de coordenação. Clusters de desenvolvimento pequenos podem executar funções mistas, mas um cluster que importa não deve permitir que uma agregação pesada ou pico de ingestão prive o mestre eleito de recursos.
Exemplo de Configuração de Nó (Mestre Dedicado)
Para configurar um nó para ser elegível a mestre, mas não armazenar dados ou executar pipelines de ingestão, use as seguintes funções em elasticsearch.yml:
# Nó 1: Mestre Dedicado
node.name: es-master-01
node.roles: [master]
# Vincule o transporte a uma rede privada e restrinja o acesso com firewalls/grupos de segurança.
# network.host: 10.0.0.1
Exemplo de Configuração de Nó (Nó de Dados Dedicado)
Por outro lado, um nó de dados dedicado deve ser impedido de participar do processo de eleição de mestre:
# Nó 4: Nó de Dados Dedicado
node.name: es-data-04
node.roles: [data]
# Se nenhuma função for especificada, o Elasticsearch atribui o conjunto de funções padrão para essa versão.
Configurações de Descoberta do Cluster
Todos os nós devem ser configurados para encontrar o mesmo conjunto de nós elegíveis a mestre usando a configuração discovery.seed_hosts. Esta configuração lista os endereços de rede onde o Elasticsearch pode tentar contatar outros nós para se juntar ao cluster.
# Configuração comum para todos os nós no cluster
discovery.seed_hosts: ["10.0.0.1:9300", "10.0.0.2:9300", "10.0.0.3:9300"]
Esta lista deve conter os endereços dos nós elegíveis a mestre (es-master-01, es-master-02, es-master-03, etc.).
Solucionando Problemas de Eleição
Se o cluster falhar ao eleger um mestre, ele normalmente entra em um estado 'vermelho' ou 'amarelo' e registra erros persistentes. Causas comuns incluem:
| Problema | Descrição e Solução |
|---|---|
| Problemas de Rede | Os nós não conseguem se comunicar devido a regras de firewall, problemas de roteamento, problemas de DNS ou alta latência. A porta de transporte, comumente 9300, deve estar acessível entre os nós. HTTP, comumente 9200, é para acesso de cliente/API e não é o canal de eleição. |
| Incompatibilidade de Configuração | cluster.name está incorreto ou discovery.seed_hosts não aponta para os nós elegíveis a mestre corretos. Verifique se todos os nós usam configurações idênticas. |
| Perda de Quórum | Muitos nós votantes falharam ao mesmo tempo, como duas falhas em uma configuração de três mestres. Se os nós ausentes desapareceram permanentemente, use a API de exclusões de configuração de votação com cuidado e somente após confirmar o modo de falha. |
| I/O de Disco | O I/O de disco do nó mestre está saturado, impedindo-o de publicar o estado do cluster rapidamente, levando a timeouts e eleições repetidas. |
Verificando a Configuração de Votação
Você pode inspecionar a configuração de votação atual usando a API do Cluster:
GET /_cluster/state?filter_path=metadata.cluster_coordination
Esta saída confirma quais nós estão atualmente contados para o quórum, garantindo que sua configuração corresponda às suas metas de tolerância a falhas.
O padrão de produção mais seguro é simples: três nós dedicados elegíveis a mestre em domínios de falha separados, rede de transporte estável, seed hosts corretos e cluster.initial_master_nodes usado apenas uma vez. Quando as eleições falharem, resista ao impulso de reiniciar todos os nós de uma vez. Leia os logs, confirme quais nós elegíveis a mestre podem se ver e faça uma mudança controlada de cada vez.