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.

Quando você deseja atualizar um cluster do Elasticsearch, às vezes é mais fácil criar um novo cluster separado e transferir dados do cluster antigo para o novo. Isso oferece aos usuários a vantagem de poder 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 requer alguma duplicação de hardware e pode criar dificuldades ao tentar transferir e sincronizar todos os dados sem problemas.

Também pode ser necessário realizar um procedimento semelhante se você precisar migrar aplicativos de um data center para outro.

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

Como migrar dados entre clusters do Elasticsearch?

Há 3 maneiras de transferir dados entre clusters do Elasticsearch:

  1. Reindexação de um cluster remoto
  2. Transferindo dados usando snapshots
  3. Transferindo dados usando Logstash

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

Se precisar aumentar em 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 do Elasticsearch.

1. Reindexando dados de um cluster remoto

Antes de começar a reindexar, lembre-se de que você precisará configurar mapeamentos apropriados para todos os índices no novo cluster. Para fazer 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 elasticsesearch.yml do cluster que está recebendo os dados, que, em sistemas Linux, geralmente está localizado aqui: /etc/elasticsearch/elasticsearch.yml. A configuração a ser adicionada é a seguinte:

Se estiver usando SSL, você deve adicionar o certificado CA a cada nó e incluir o seguinte no comando para cada nó em elasticsearch.yml:

Como alternativa, você pode adicionar a linha abaixo a todos os nós do Elasticsearch para desabilitar a verificação SSL. Entretanto, 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 contínua. Para mais informações sobre como fazer isso, consulte nosso guia.

Comando de reindexação

Depois de definir o host remoto no arquivo elasticsearch.yml e adicionar os certificados SSL, se necessário, você pode começar a reindexar os dados com o comando abaixo:

Ao fazer isso, você pode enfrentar erros de tempo limite, então pode ser útil estabelecer valores generosos para tempos limite em vez de depender de padrões.

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 permitida

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

Para corrigir isso no cluster do 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

Este erro significa que você esqueceu de adicionar reindex.ssl.certificate_authorities ao elasticsearch.yml, conforme descrito acima. Para adicioná-lo:

2. Transferindo dados usando snapshots

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

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

As seguintes etapas são necessárias para transferir dados por meio de snapshots:

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

Etapa 2. Reinicie o serviço Elasticsearch (reinicialização contínua).

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

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

Etapa 5 - Adicionar repositório como somente leitura ao segundo cluster do Elasticsearch – Você precisará adicionar um repositório repetindo as mesmas etapas executadas para criar o primeiro cluster do Elasticsearch.

Observação importante: ao conectar o segundo cluster do Elasticsearch ao mesmo repositório do AWS S3, você deve definir o repositório como um repositório somente leitura:

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

Etapa 6 - Restaurando dados para o segundo cluster do Elasticsearch – Após seguir as etapas acima, você pode restaurar os dados e transferi-los para o novo cluster. Siga as etapas descritas neste artigo para restaurar 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 mapeamentos apropriados para todos os índices no novo cluster. Para fazer isso, você precisará criar os índices diretamente ou usar modelos de índice.

Para transferir dados entre dois clusters do Elasticsearch, você pode configurar um servidor Logstash temporário e usá-lo para transferir seus dados entre dois clusters. Para clusters pequenos, uma instância de 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 orientações sobre como instalar o Logstash, clique 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 de índice

Os comandos acima gravarão em um único índice nomeado. Se você quiser 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 a identificação original do documento, será necessário adicionar:

Tenha em mente que definir o ID do documento tornará a transferência de dados significativamente mais lenta, portanto, preserve o ID original somente se 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á descobrir que os dados no cluster original foram atualizados enquanto aguardava a conclusão do processo.

Existem várias 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 pensar sobre essas questões antes de iniciar o processo. Em particular, você precisa pensar sobre:

  • Qual método você usa para identificar quaisquer dados que foram 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 pedaço de dados?
  • Existe risco de registros serem duplicados? Geralmente, existe, a menos que o método que você está usando defina o ID do documento durante a reindexação para um valor conhecido).

Os diferentes métodos para habilitar 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 que você “reproduza” 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 em que “last_update_time” > x dias atrás. Você pode fazer isso adicionando um parâmetro “consulta” à solicitação de reindexação.

3. Logstash

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

4. Instantâneos

Não é possível restaurar apenas parte de um índice, então você teria que 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, então pode ser possível suspender as atualizações por um breve período de tempo enquanto os snapshots são transferidos para evitar o problema completamente.

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)