Como migrar dados entre diferentes versões do Elasticsearch e entre clusters

Explorando métodos para transferência de dados entre versões e clusters do Elasticsearch.

Novo no Elasticsearch? Participe do nosso webinar Introdução ao Elasticsearch. Você também pode iniciar um teste gratuito na nuvem do Elastic ou experimentar o Elastic em sua máquina agora.

Ao atualizar um cluster Elasticsearch, às vezes é mais fácil criar um novo cluster separado e transferir os dados do cluster antigo para o novo. Isso oferece aos usuários a vantagem de poderem testar todos os seus dados e configurações no novo cluster com todos os seus aplicativos, sem qualquer risco de tempo de inatividade ou perda de dados.

As desvantagens dessa abordagem são que ela exige alguma duplicação de hardware e pode criar dificuldades ao tentar transferir e sincronizar todos os dados sem problemas.

Pode também ser necessário realizar um procedimento semelhante caso precise migrar aplicações de um centro de dados para outro.

Neste artigo, discutiremos e detalharemos três maneiras de transferir dados entre clusters Elasticsearch.

Como migrar dados entre clusters Elasticsearch?

Existem 3 maneiras de transferir dados entre clusters Elasticsearch:

  1. Reindexação a partir de um cluster remoto
  2. Transferência de dados usando snapshots
  3. Transferindo dados usando Logstash

Utilizar snapshots geralmente é a maneira mais rápida e confiável de transferir dados. No entanto, lembre-se de que você só pode restaurar um snapshot em um cluster de versão igual ou superior, e nunca com uma diferença superior a uma versão principal. Isso significa que você pode restaurar um snapshot da versão 6.x em um cluster da versão 7.x, mas não em um cluster da versão 8.x.

Se precisar atualizar para mais de uma versão principal, você precisará reindexar ou usar o Logstash.

Agora, vamos analisar detalhadamente cada uma das três opções para transferir dados entre clusters Elasticsearch.

1. Reindexação de dados de um cluster remoto

Antes de iniciar a reindexação, lembre-se de que será necessário configurar os mapeamentos apropriados para todos os índices no novo cluster. Para isso, você deve criar os índices diretamente com os mapeamentos apropriados ou usar modelos de índice.

Reindexação remota — configuração necessária

Para reindexar remotamente, você deve adicionar a configuração abaixo ao arquivo elasticsearch.yml do cluster que está recebendo os dados, o qual, em sistemas Linux, geralmente está localizado em: /etc/elasticsearch/elasticsearch.yml. A configuração a ser adicionada é a seguinte:

Se você estiver usando SSL, deverá adicionar o certificado da CA a cada nó e incluir o seguinte no comando de cada nó no arquivo elasticsearch.yml:

Alternativamente, você pode adicionar a linha abaixo a todos os nós do Elasticsearch para desativar a verificação SSL. No entanto, essa abordagem é menos recomendada, pois não é tão segura quanto a opção anterior:

Você precisará fazer essas modificações em cada nó e executar uma reinicialização gradual. Para obter mais informações sobre como fazer isso, consulte nosso guia.

Comando de reindexação

Após definir o host remoto no arquivo elasticsearch.yml e adicionar os certificados SSL, se necessário, você pode iniciar a reindexação dos dados com o comando abaixo:

Ao fazer isso, você pode se deparar com erros de tempo limite, portanto, pode ser útil definir valores generosos para os tempos limite em vez de confiar nos valores padrão.

Agora, vamos dar uma olhada em alguns outros erros comuns que você pode encontrar ao reindexar remotamente.

Erros comuns ao reindexar remotamente

1. Reindexação não incluída na lista de permissões

Se você se deparar com esse erro, significa que você não definiu o endereço IP do host remoto ou o nome do nó DNS no Elasticsearch conforme descrito acima, ou se esqueceu de reiniciar os serviços do Elasticsearch.

Para corrigir isso no cluster Elasticsearch, você precisa adicionar o host remoto a todos os nós do Elasticsearch e reiniciar os serviços do Elasticsearch.

2. Exceção de handshake SSL

Esse erro significa que você se esqueceu de adicionar o reindex.ssl.certificate_authorities ao elasticsearch.yml, conforme descrito acima. Para adicionar:

2. Transferência de dados usando snapshots

Lembre-se, como mencionado acima, você só pode restaurar um snapshot em um cluster de versão igual ou superior, e nunca com uma diferença superior a uma versão principal.

Se precisar atualizar para mais de uma versão principal, você precisará reindexar ou usar o Logstash.

Os seguintes passos são necessários para transferir dados via snapshots:

Etapa 1. Adicionando o plugin de repositório ao primeiro cluster Elasticsearch – Para transferir dados entre clusters por meio de snapshots, você precisa garantir que o repositório esteja acessível tanto no cluster novo quanto no antigo. Repositórios de armazenamento em nuvem, como AWS, Google e Azure, são geralmente ideais para isso. Para tirar fotos, consulte nosso guia e siga os passos descritos nele.

Etapa 2. Reinicie o serviço Elasticsearch (reinicialização gradual).

Etapa 3. Crie um repositório para o primeiro cluster Elasticsearch.

Etapa 4 - Adicione o plugin de repositório ao segundo cluster Elasticsearch.

Etapa 5 - Adicionar repositório como somente leitura ao segundo cluster Elasticsearch - Você precisará adicionar um repositório repetindo os mesmos passos que seguiu para criar o primeiro cluster Elasticsearch.

Nota importante: Ao conectar o segundo cluster Elasticsearch ao mesmo repositório AWS S3, você deve definir o repositório como somente leitura:

Isso é importante porque você deseja evitar o risco de misturar versões do Elasticsearch dentro do mesmo repositório de snapshots.

Etapa 6 - Restaurando dados para o segundo cluster Elasticsearch - Após executar as etapas acima, você pode restaurar os dados e transferi-los para o novo cluster. Siga os passos descritos neste artigo para restaurar os dados no novo cluster. 

3. Transferindo dados usando Logstash

Antes de começar a transferir os dados com o Logstash, lembre-se de que você precisará configurar os mapeamentos apropriados para todos os índices no novo cluster. Para isso, você precisará criar os índices diretamente ou usar modelos de índice.

Para transferir dados entre dois clusters Elasticsearch, você pode configurar um servidor Logstash temporário e usá-lo para realizar a transferência. Para clusters pequenos, uma instância com 2 GB de RAM deve ser suficiente. Para clusters maiores, você pode usar CPUs de quatro núcleos com 8 GB de RAM.

Para obter instruções sobre como instalar o Logstash, consulte aqui.

Configuração do Logstash para transferência de dados de um cluster para outro.

Uma configuração básica para copiar um único índice do cluster A para o cluster B é:

Para um Elasticsearch seguro, você pode usar a configuração abaixo:

Metadados do índice

Os comandos acima escreverão em um único índice nomeado. Se você deseja transferir vários índices e preservar os nomes dos índices, será necessário adicionar a seguinte linha à saída do Logstash:

Além disso, se você quiser preservar o ID original do documento, precisará adicionar:

Lembre-se de que definir o ID do documento tornará a transferência de dados significativamente mais lenta, portanto, preserve o ID original somente se for necessário.

Sincronização de atualizações

Todos os métodos descritos acima levarão um período de tempo relativamente longo, e você poderá constatar que os dados no cluster original foram atualizados enquanto aguarda a conclusão do processo.

Existem diversas estratégias para permitir a sincronização de quaisquer atualizações que possam ter ocorrido durante o processo de transferência de dados, e você deve considerar essas questões antes de iniciar esse processo. Em particular, você precisa pensar em:

  • Qual método você utiliza para identificar quaisquer dados que tenham sido atualizados/adicionados desde o início do processo de transferência de dados (por exemplo, um campo “last_update_time” nos dados)?
  • Que método você pode usar para transferir o último dado?
  • Existe o risco de os registros serem duplicados? Normalmente, sim, a menos que o método que você esteja usando defina o ID do documento para um valor conhecido durante a reindexação.

Os diferentes métodos para ativar a sincronização de atualizações são descritos abaixo.

1. Utilização de sistemas de filas

Alguns sistemas de ingestão/atualização usam filas que permitem "reproduzir" as modificações de dados recebidas nos últimos x dias. Isso pode fornecer um meio de sincronizar quaisquer alterações realizadas.

2. Reindexar remotamente

Repita o processo de reindexação para todos os itens onde “last_update_time” foi atualizado há mais de x dias. Você pode fazer isso adicionando um parâmetro "query" à solicitação de reindexação.

3. Logstash

Na entrada do Logstash, você pode adicionar uma consulta para filtrar todos os itens onde “last_update_time” > x dias atrás. No entanto, esse processo causará duplicatas em dados que não sejam de séries temporais, a menos que você tenha definido o document_id.

4. Instantâneos

Não é possível restaurar apenas parte de um índice, portanto, você precisaria usar um dos outros métodos de transferência de dados descritos acima (ou um script) para atualizar quaisquer alterações que tenham ocorrido desde que o processo de transferência de dados foi realizado.

No entanto, a restauração de snapshots é um processo muito mais rápido do que a reindexação/Logstash, portanto, pode ser possível suspender as atualizações por um breve período enquanto os snapshots são transferidos para evitar o problema por completo.

Conteúdo relacionado

Pronto para criar buscas de última geração?

Uma pesquisa suficientemente avançada não se consegue apenas com o esforço de uma só pessoa. O Elasticsearch é impulsionado por cientistas de dados, especialistas em operações de aprendizado de máquina, engenheiros e muitos outros que são tão apaixonados por buscas quanto você. Vamos nos conectar e trabalhar juntos para construir a experiência de busca mágica que lhe trará os resultados desejados.

Experimente você mesmo(a)