Guia para Configurar um Cluster Elasticsearch de Alta Disponibilidade

Garanta operação contínua e tolerância a falhas com este guia completo para configurar um cluster Elasticsearch de alta disponibilidade. Aprenda a configurar múltiplos nós Elasticsearch, compreenda conceitos críticos como papéis de nó e replicação de shards, e implemente configurações de descoberta para um ambiente de produção robusto. Este artigo fornece instruções passo a passo, exemplos práticos e melhores práticas essenciais para garantir que seu motor de busca e análise distribuído seja resiliente, seguro e sempre disponível. Evite perda de dados e tempo de inatividade dominando as configurações de Elasticsearch HA.

59 visualizações

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

  1. 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

  2. node.name: Um nome exclusivo para cada nó, útil para identificação.
    yaml node.name: node-1

  3. network.host: Vincula o Elasticsearch a uma interface de rede específica. Use 0.0.0.0 para 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

  4. http.port: A porta para comunicação do cliente HTTP (padrão 9200).
    yaml http.port: 9200

  5. 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.

  1. 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"]

  2. cluster.initial_master_nodes: Usado apenas ao inicializar um cluster totalmente novo pela primeira vez. Esta lista deve conter o node.name dos 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_nodes depois que o cluster for formado com sucesso para evitar comportamentos indesejados se um nó for reiniciado e tentar formar um novo cluster.

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 ser green (todos os shards primários e de réplica estão alocados) ou yellow (todos os shards primários estão alocados, mas alguns shards de réplica ainda não). red indica 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