Guia para Configurar um Cluster Elasticsearch de Alta Disponibilidade
Configure um cluster Elasticsearch de alta disponibilidade com funções de nó, descoberta, réplicas, dimensionamento de JVM e verificações de integridade.
Guia para Configurar um Cluster Elasticsearch de Alta Disponibilidade
O Elasticsearch pode permanecer disponível durante falhas de nó, mas apenas se você planejar corretamente as eleições de mestre, a colocação de dados, as réplicas e a descoberta. Um cluster de nó único pode funcionar em desenvolvimento, mas não pode proteger sua carga de trabalho de pesquisa contra falhas de host.
Este guia mostra como configurar um cluster Elasticsearch de alta disponibilidade com nós dedicados elegíveis a mestre, nós de dados, réplicas de shard e comandos básicos de validação.
Entendendo a Alta Disponibilidade no Elasticsearch
A alta disponibilidade no Elasticsearch é alcançada através de vários mecanismos-chave:
- Arquitetura Distribuída: O Elasticsearch distribui inerentemente dados e operações por vários nós.
- Funções de Nó: Diferentes nós podem servir a diferentes propósitos, permitindo alocação especializada de recursos e isolamento de falhas.
- Replicação de Shard: Cada índice é dividido em shards, e cada shard primário pode ter um ou mais shards de réplica, armazenados em nós diferentes.
- Eleição de Nó Mestre: Um processo de eleição robusto garante que um nó mestre esteja sempre disponível para gerenciar o estado do cluster.
- Descoberta Zen (Zen2): Este módulo lida com a descoberta de nós e eleição de mestre, garantindo que os nós possam se encontrar e formar um cluster de forma confiável.
Funções Essenciais de Nó
Em uma configuração de alta disponibilidade, entender as funções de nó é crucial. As funções primárias para alta disponibilidade são:
- Nós elegíveis a mestre: Esses nós são responsáveis por gerenciar o estado do cluster, incluindo criação/exclusão de índices, rastreamento de nós e alocação de shards. Eles não armazenam dados nem lidam diretamente com solicitações de pesquisa/índice, a menos que também tenham a função
data. Para alta disponibilidade, você deve ter um número ímpar (tipicamente 3) de nós dedicados elegíveis a mestre para formar um quórum. - Nós de dados: Esses nós armazenam seus dados indexados em shards e realizam operações relacionadas a dados, como pesquisa, agregação e indexação. Eles são os cavalos de batalha do seu cluster.
- Nós apenas coordenadores: (Opcional) Esses nós podem ser usados para rotear solicitações, lidar com fases de redução de pesquisa e gerenciar indexação em lote. Eles não armazenam dados nem estado do cluster, mas podem descarregar trabalho dos nós de dados e mestre.
Shards e Réplicas
O Elasticsearch armazena seus dados em shards. Cada índice consiste em um ou mais shards primários. Para alcançar alta disponibilidade, você deve configurar um ou mais shards de réplica para cada shard primário. Shards de réplica são cópias dos shards primários. Se um nó que hospeda um shard primário falhar, um shard de réplica em outro nó pode ser promovido a novo primário, garantindo que não haja perda de dados e operação contínua.
Pré-requisitos para Configurar um Cluster de Alta Disponibilidade
Antes de mergulhar na configuração, certifique-se de que seu ambiente atenda a esses requisitos básicos:
- Pacotes ou arquivos do Elasticsearch: Pacotes oficiais incluem um JDK empacotado em versões recentes do Elasticsearch. Se sua instalação usar um JDK separado, certifique-se de que seja compatível com sua versão do Elasticsearch.
- Recursos do Sistema: Aloque RAM suficiente (por exemplo, 8-32 GB), núcleos de CPU e espaço em disco de E/S rápido (SSD recomendado) para cada nó, especialmente nós de dados.
- Configuração de Rede: Todos os nós devem ser capazes de se comunicar entre si através de portas específicas (padrão 9300 para comunicação entre nós, 9200 para API HTTP). Certifique-se de que os firewalls estejam configurados adequadamente.
- Sistema Operacional: Uma distribuição Linux estável (por exemplo, Ubuntu, CentOS, RHEL) é geralmente preferida para implantações de produção.
Guia Passo a Passo para Configuração de Cluster de Alta Disponibilidade
Esta seção descreve o processo para instalar e configurar um cluster Elasticsearch de vários nós.
Passo 1: Instalar o Elasticsearch em Todos os Nós
Instale o Elasticsearch em cada servidor que fará parte do seu cluster. Você pode usar gerenciadores de pacotes (APT para Debian/Ubuntu, YUM para RHEL/CentOS) ou baixar o arquivo diretamente.
Exemplo (Debian/Ubuntu via APT):
wget -qO - https://artifacts.elastic.co/GPG-KEY-elasticsearch | sudo gpg --dearmor -o /usr/share/keyrings/elasticsearch-keyring.gpg
echo "deb [signed-by=/usr/share/keyrings/elasticsearch-keyring.gpg] https://artifacts.elastic.co/packages/8.x/apt stable main" | sudo tee /etc/apt/sources.list.d/elastic-8.x.list
sudo apt update
sudo apt install elasticsearch
Após a instalação, habilite e inicie o serviço (embora vamos configurá-lo primeiro).
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
Passo 2: Configurar elasticsearch.yml em Cada Nó
O arquivo elasticsearch.yml, tipicamente localizado em /etc/elasticsearch/, é onde você define as configurações do seu cluster. Edite este arquivo em cada nó com as configurações apropriadas.
Configuração Comum para Todos os Nós
cluster.name: Deve ser idêntico para todos os nós que você deseja que entrem no mesmo cluster.cluster.name: my-ha-clusternode.name: Um nome único para cada nó, útil para identificação.node.name: node-1network.host: Vincula o Elasticsearch a uma interface de rede específica. Use0.0.0.0para vincular a todas as interfaces disponíveis, ou um endereço IP específico.network.host: 0.0.0.0 # ou um endereço IP específico para segurança/configurações multi-NIC # network.host: 192.168.1.101http.port: A porta para comunicação do cliente HTTP (padrão 9200).http.port: 9200transport.port: A porta para comunicação entre nós (padrão 9300). Deve ser consistente.transport.port: 9300
Configurações de Descoberta (Cruciais para Alta Disponibilidade)
Essas configurações informam aos nós como se encontrar e formar um cluster.
discovery.seed_hosts: Uma lista de endereços de nós elegíveis a mestre em seu cluster. É assim que os nós descobrem nós elegíveis a mestre iniciais. Forneça os endereços IP ou nomes de host de todos os seus nós elegíveis a mestre.discovery.seed_hosts: ["192.168.1.101", "192.168.1.102", "192.168.1.103"]cluster.initial_master_nodes: Usado apenas ao inicializar um cluster novo pela primeira vez. Esta lista deve conter onode.namedos nós elegíveis a mestre que participarão da primeira eleição de mestre. Uma vez que o cluster tenha se formado, esta configuração é ignorada.cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]- Dica Importante: Remova ou comente
cluster.initial_master_nodesapós o cluster ter se formado com sucesso. Não defina novamente para reinicializações ou para adicionar novos nós.
- Dica Importante: Remova ou comente
Configuração de Função de Nó
Especifique a(s) função(ões) para cada nó. Uma configuração comum de alta disponibilidade envolve 3 nós mestres dedicados e vários nós de dados.
- Nós Elegíveis a Mestre (por exemplo, node-1, node-2, node-3):
node.roles: [master] - Nós de Dados (por exemplo, node-4, node-5, node-6):
node.roles: [data] - Nós de Função Mista (não recomendado para produção de alta disponibilidade em grande escala):
node.roles: [master, data]- Melhor Prática: Para verdadeira alta disponibilidade e estabilidade em produção, dedique nós separados para funções de mestre e dados. Isso isola processos críticos de mestre de operações de dados intensivas em recursos.
Passo 3: Configurar o Tamanho do Heap da JVM
Edite /etc/elasticsearch/jvm.options para definir o tamanho do heap da JVM. Uma boa regra é alocar 50% da RAM disponível, mas nunca excedendo 30-32 GB. Por exemplo, se um servidor tiver 16 GB de RAM, aloque 8 GB:
-Xms8g
-Xmx8g
Passo 4: Configurações do Sistema
Para produção, aumente o vm.max_map_count e o ulimit para arquivos abertos em todos os nós. Adicione estas linhas ao /etc/sysctl.conf e aplique (sudo sysctl -p).
vm.max_map_count=262144
E em /etc/security/limits.conf (ou /etc/security/limits.d/99-elasticsearch.conf):
elasticsearch - nofile 65536
elasticsearch - memlock unlimited
Passo 5: Iniciar os Serviços do Elasticsearch
Inicie o serviço do Elasticsearch em todos os nós configurados. Muitas vezes é recomendado iniciar os nós elegíveis a mestre primeiro, mas com a descoberta moderna, a ordem é menos crítica, desde que discovery.seed_hosts esteja configurado corretamente.
sudo systemctl start elasticsearch
Verifique o status do serviço e os logs para quaisquer erros:
sudo systemctl status elasticsearch
sudo journalctl -f -u elasticsearch
Passo 6: Verificar a Saúde do Cluster
Assim que todos os nós estiverem em execução, verifique a saúde do cluster usando a API do Elasticsearch. Você pode consultar qualquer nó no cluster.
curl -X GET "localhost:9200/_cat/health?v&pretty"
Saída Esperada:
epoch timestamp cluster status node.total node.data shards pri relo init unassign pending_tasks max_task_wait_time active_shards_percent
1678886400 12:00:00 my-ha-cluster green 6 3 0 0 0 0 0 0 - 100.0%
status: Deve sergreen(todos os shards primários e de réplica estão alocados) ouyellow(todos os shards primários estão alocados, mas alguns shards de réplica ainda não).redindica um problema sério.node.total: Deve corresponder ao número total de nós que você iniciou.node.data: Deve corresponder ao número de nós de dados.
Verifique os nós para garantir que todos entraram no cluster:
curl -X GET "localhost:9200/_cat/nodes?v&pretty"
Saída Esperada (exemplo para 3 nós mestres, 3 nós de dados):
ip heap.percent ram.percent cpu load_1m load_5m load_15m node.role master name
192.168.1.101 21 87 0 0.00 0.01 0.05 m * node-1
192.168.1.102 20 88 0 0.00 0.01 0.05 m - node-2
192.168.1.103 22 86 0 0.00 0.01 0.05 m - node-3
192.168.1.104 35 90 1 0.10 0.12 0.11 d - node-4
192.168.1.105 32 89 1 0.11 0.13 0.10 d - node-5
192.168.1.106 30 91 1 0.12 0.10 0.09 d - node-6
Isso mostra node-1 como o mestre eleito (* sob a coluna master) e outros nós como parte do cluster.
Passo 7: Configurar Fragmentação e Replicação de Índice
Para índices recém-criados, o Elasticsearch padrão é um shard primário e uma réplica (index.number_of_shards: 1, index.number_of_replicas: 1). Para alta disponibilidade, você normalmente deseja pelo menos uma réplica, o que significa que seus dados existem em pelo menos dois nós diferentes. Isso garante que, se um nó falhar, uma réplica esteja disponível em outro lugar.
Ao criar um índice, especifique estas configurações:
curl -X PUT "localhost:9200/my_ha_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index": {
"number_of_shards": 3,
"number_of_replicas": 1
}
}
}'
Se a segurança estiver habilitada, use HTTPS e credenciais ou uma chave de API em seu comando curl. Por exemplo:
curl --cacert /etc/elasticsearch/certs/http_ca.crt -u elastic "https://localhost:9200/_cluster/health?pretty"
Verificações Operacionais
Após o cluster estar verde, verifique o comportamento de falha antes que o tráfego de produção dependa dele:
- Pare um nó de dados e confirme que as réplicas são promovidas e os primários permanecem disponíveis.
- Pare o nó mestre eleito e confirme que outro nó elegível a mestre é eleito.
- Verifique
_cat/shards?vpara shards não atribuídos após o cluster se estabilizar. - Confirme que os clientes se conectam através de vários nós ou um balanceador de carga em vez de um único endpoint HTTP.
Conclusão Final
A alta disponibilidade do Elasticsearch vem de três escolhas práticas: manter um quórum de mestre confiável, colocar réplicas de shard em nós diferentes e tornar os clientes resilientes à perda de nós. Comece com três nós dedicados elegíveis a mestre, nós de dados suficientes para armazenar shards primários e de réplica, e um procedimento de recuperação testado para reinicializações e falhas de nós.