Blog

Como aumentar o número de shards primários no Elasticsearch

Aprenda como aumentar o número de shards principais no Elasticsearch usando as APIs split e reindex para ter o redimensionamento ideal de shards.

Não é possível aumentar o número de shards primários de um índice existente, o que significa que um índice precisa ser recriado se você quiser aumentar a quantidade de shards primários. Geralmente, existem dois métodos utilizados nessas situações: a API _reindex e a API _split.

A API _split costuma ser um método mais rápido do que a API _reindex. A indexação deve ser interrompida antes de ambas as operações; caso contrário, as contagens de documentos em source_index e target_index serão diferentes.

Aumentando o número de shards no Elasticsearch ao recriar um índice

Método 1 – usando a API dividida

A API de divisão é usada para criar um novo índice com o número desejado de shards primários, copiando as configurações e mapeando um índice existente. O número desejado de fragmentos primários pode ser definido durante a criação. As seguintes configurações devem ser verificadas antes de implementar a API dividida:

  1. O índice de origem deve ser somente leitura. Isso significa que o processo de indexação precisa ser interrompido.

  2. O número de shards primários no índice de destino deve ser um múltiplo do número de shards primários no índice de origem. Por exemplo, se o índice de origem tiver 5 shards primários, o número de shards primários do índice de destino pode ser definido como 10, 15, 20 e assim por diante.

Observação: Se apenas o número do fragmento primário precisar ser alterado, a API de divisão é preferível, pois é muito mais rápida do que a API de reindexação.

Implementando a API dividida

Criar um índice de teste:

POST test_split_source/_doc
{
  "test": "test"
}

O índice de origem deve ser somente leitura para poder ser dividido:

PUT test_split_source/_settings
{
  "index.blocks.write": true
}

As configurações e os mapeamentos serão copiados automaticamente do índice de origem:

POST /test_split_source/_split/test_split_target
{
  "settings": {
    "index.number_of_shards": 3
  }
}

Você pode verificar o progresso com:

GET _cat/recovery/test_split_target?v&h=index,shard,time,stage,files_percent,files_total

Como as configurações e os mapeamentos são copiados dos índices de origem, o índice de destino é somente leitura. Vamos habilitar a operação de escrita para o índice de destino:

PUT test_split_target/_settings
{
    "index.blocks.write": null
}

Verifique a contagem de documentos (docs.count) nos índices de origem e destino antes de excluir o índice original:

GET _cat/indices/test_split*?v&h=index,pri,rep,docs.count

O nome do índice e o nome do alias não podem ser iguais. Você precisa excluir o índice de origem e adicionar o nome do índice de origem como um alias para o índice de destino:

DELETE test_split_source
PUT /test_split_target/_alias/test_split_source

Após adicionar o alias test_split_source ao índice test_split_target , você deve testá-lo com:

GET test_split_source
POST test_split_source/_doc
{
  "test": "test"
}

Método 2 – usando a API de reindexação

Ao criar um novo índice com a API Reindex, é possível definir qualquer número de shards primários. Após a criação de um novo índice com o número desejado de shards primários, todos os dados do índice de origem podem ser reindexados para esse novo índice.

Além dos recursos de API dividida, os dados podem ser manipulados usando o ingest_pipeline no AP de reindexação. Com o pipeline de ingestão, somente os campos especificados que correspondem ao filtro serão indexados no índice de destino usando a consulta. O conteúdo dos dados pode ser alterado usando um script simples, e vários índices podem ser mesclados em um único índice.

Implementando a API de reindexação

Criar um reindexador de teste:

POST test_reindex_source/_doc
{
    "test": "test"
}

Copie as configurações e os mapeamentos do índice de origem:

GET test_reindex_source

Crie um índice de destino com configurações, mapeamentos e a quantidade desejada de fragmentos (shards):

PUT test_reindex_target
{
  "mappings" : {},
  "settings": {
    "number_of_shards": 10,
    "number_of_replicas": 0,
    "refresh_interval": -1
  }
}

*Nota: definir number_of_replicas: 0 e refresh_interval: -1 aumentará a velocidade de reindexação.

Inicie o processo de reindexação. Definir requests_per_second=-1 e slices=auto ajustará a velocidade de reindexação.

POST _reindex?requests_per_second=-1&slices=auto&wait_for_completion=false
{
  "source": {
    "index": "test_reindex_source"
  },
  "dest": {
    "index": "test_reindex_target"
  }
}

Você verá o task_id ao executar a API de reindexação. Copie isso e verifique com a API _tasks:

GET _tasks/<task_id>

Atualize as configurações após a conclusão da reindexação:

PUT test_reindex_target/_settings
{
  "number_of_replicas": 1,
  "refresh_interval": "1s"
}

Antes de excluir o índice original, verifique o número de documentos (docs.count) nos índices de origem e destino; eles devem ser iguais.

GET _cat/indices/test_reindex_*?v&h=index,pri,rep,docs.count

O nome do índice e o nome do alias não podem ser iguais. Exclua o índice de origem e adicione o nome do índice de origem como um alias para o índice de destino:

DELETE test_reindex_source
PUT /test_reindex_target/_alias/test_reindex_source

Após adicionar o alias test_split_source ao índice test_split_target, teste-o usando:

GET test_reindex_source

Resumo

Se você deseja aumentar o número de shards primários de um índice existente, precisa recriar as configurações e os mapeamentos para um novo índice. Existem dois métodos principais para fazer isso: a API de reindexação e a API de divisão. A indexação ativa deve ser interrompida antes de usar qualquer um dos métodos.

Conteúdo relacionado

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

Kofi Bartlett

Apresentando a interface de usuário de regras de consulta do Elasticsearch no Kibana.

Jhon Guzmán

Elasticsearch em JavaScript da maneira correta, parte II

Jeffrey Rengifo

Implementação de busca semântica: Construindo uma busca de receitas com Elasticsearch

Andre Luiz

Como implantar o Elasticsearch no AWS Marketplace

Eduard Martin

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)