Guia para Configurar um Cluster Elasticsearch de Alta Disponibilidade
O Elasticsearch é um motor de busca e análise distribuído poderoso, projetado para escalabilidade e resiliência. Em ambientes de produção, garantir a operação contínua e a tolerância a falhas é fundamental. Este guia irá guiá-lo pelas etapas essenciais para configurar múltiplos nós Elasticsearch para criar um cluster robusto e de alta disponibilidade (HA). Seguindo estas instruções, você aprenderá como configurar seu cluster para resistir a falhas de nós e manter a acessibilidade dos dados, garantindo que suas aplicações permaneçam responsivas e seus dados seguros.
Configurar um cluster Elasticsearch de alta disponibilidade envolve um planejamento cuidadoso das funções dos nós, configuração de rede e estratégias de replicação de dados. O objetivo é distribuir a carga de trabalho e os dados de forma redundante por várias máquinas, eliminando pontos únicos de falha. Este artigo abordará os conceitos centrais, as etapas práticas de configuração e as melhores práticas para ajudá-lo a construir uma infraestrutura Elasticsearch resiliente, adequada para casos de uso de produção exigentes.
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 múltiplos nós.
- Funções dos Nós (Node Roles): Diferentes nós podem servir a propósitos distintos, permitindo alocação especializada de recursos e isolamento de falhas.
- Replicação de Shards: 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.
- Zen Discovery (Zen2): Este módulo lida com a descoberta de nós e a eleição do mestre, garantindo que os nós possam se encontrar e formar um cluster de forma confiável.
Funções Essenciais dos Nós
Em uma configuração HA, entender as funções dos nós é crucial. As funções primárias para HA são:
- Nós elegíveis a Mestre (Master-eligible nodes): Estes 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 busca/indexação, a menos que também possuam a função
data. Para HA, você deve ter um número ímpar (tipicamente 3) de nós dedicados elegíveis a mestre para formar um quorum. - Nós de Dados (Data nodes): Estes nós armazenam seus dados indexados em shards e executam operações relacionadas a dados, como busca, agregação e indexação. Eles são a força de trabalho do seu cluster.
- Nós apenas de Coordenação (Coordinating-only nodes): (Opcional) Estes nós podem ser usados para rotear solicitações, lidar com fases de redução de busca e gerenciar indexação em lote (bulk indexing). Eles não mantêm estado de dados ou cluster, mas podem descarregar trabalho dos nós de dados e mestres.
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 para ser o novo primário, garantindo nenhuma perda de dados e operação contínua.
Pré-requisitos para Configurar um Cluster HA
Antes de mergulhar na configuração, certifique-se de que seu ambiente atende a estes requisitos básicos:
- Java Development Kit (JDK): O Elasticsearch requer um JDK compatível (tipicamente OpenJDK). Certifique-se de que ele esteja instalado em todos os nós.
- Recursos do Sistema: Aloque RAM suficiente (ex: 8-32GB), núcleos de CPU e espaço em disco de E/S rápido (SSD recomendado) para cada nó, especialmente para os 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 inter-nós, 9200 para API HTTP). Certifique-se de que os firewalls estejam configurados apropriadamente.
- Sistema Operacional: Uma distribuição Linux estável (ex: Ubuntu, CentOS, RHEL) é geralmente preferida para implantações de produção.
Guia Passo a Passo para Configuração de Cluster HA
Esta seção descreve o processo de instalação e configuração de um cluster Elasticsearch multi-nó.
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 o configuremos primeiro).
sudo systemctl daemon-reload
sudo systemctl enable elasticsearch
Passo 2: Configurar elasticsearch.yml em Cada Nó
O arquivo elasticsearch.yml, geralmente 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: Este deve ser idêntico para todos os nós que você deseja que ingressem no mesmo cluster.
yaml cluster.name: my-ha-cluster -
node.name: Um nome exclusivo para cada nó, útil para identificação.
yaml node.name: node-1 -
network.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.
yaml 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.101 -
http.port: A porta para comunicação do cliente HTTP (padrão 9200).
yaml http.port: 9200 -
transport.port: A porta para comunicação inter-nós (padrão 9300). Deve ser consistente.
yaml transport.port: 9300
Configurações de Descoberta (Cruciais para HA)
Estas configurações instruem os nós sobre como se encontrar e formar um cluster.
-
discovery.seed_hosts: Uma lista de endereços dos nós elegíveis a mestre em seu cluster. É assim que os nós descobrem os 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.
yaml 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 totalmente 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. Depois que o cluster for formado, esta configuração é ignorada.
yaml cluster.initial_master_nodes: ["node-1", "node-2", "node-3"]- Dica Importante: Remova ou comente
cluster.initial_master_nodesdepois que o cluster for formado com sucesso para evitar comportamentos indesejados se um nó for reiniciado e tentar formar um novo cluster.
- Dica Importante: Remova ou comente
Configuração de Funções do Nó
Especifique a(s) função(ões) para cada nó. Uma configuração HA comum envolve 3 nós mestres dedicados e vários nós de dados.
- Nós Elegíveis a Mestre (ex: node-1, node-2, node-3):
yaml node.roles: [master] - Nós de Dados (ex: node-4, node-5, node-6):
yaml node.roles: [data] - Nós com Funções Mistas (não recomendado para HA de produção grande):
yaml node.roles: [master, data]- Melhor Prática: Para verdadeira alta disponibilidade e estabilidade em produção, dedique nós separados para as funções mestre e de dados. Isso isola processos mestres críticos de operações de dados com uso intensivo de recursos.
Passo 3: Configurar o Tamanho da Heap JVM
Edite /etc/elasticsearch/jvm.options para definir o tamanho da heap da JVM. Uma boa regra geral é alocar 50% da RAM disponível, mas nunca exceder 30-32GB. Por exemplo, se um servidor tiver 16GB de RAM, aloque 8GB:
-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 a /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 Serviços Elasticsearch
Inicie o serviço Elasticsearch em *todos* os nós configurados. Muitas vezes, é recomendável iniciar primeiro os nós elegíveis a mestre, mas com a descoberta moderna, a ordem é menos crítica, desde que `discovery.seed_hosts` esteja configurado corretamente.
```bash
sudo systemctl start elasticsearch
Verifique o status do serviço e os logs em busca de 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 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 o node-1 como o mestre eleito (* na coluna master) e outros nós como parte do cluster.
Passo 7: Configurar Sharding e Replicação de Índice
Para índices recém-criados, o Elasticsearch tem como padrão um shard primário e uma réplica (index.number_of_shards: 1, index.number_of_replicas: 1). Para HA, você geralmente 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:
```bash
curl -X PUT "localhost:9200/my_ha_index?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index": {
"number_of_shards": 3