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.

New to Elasticsearch? Join our getting started with Elasticsearch webinar. You can also start a free cloud trial or try Elastic on your machine now.

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.

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 implantar o Elasticsearch no Azure AKS automaticamente

Eduard Martin

Configurando o particionamento recursivo para documentos estruturados no Elasticsearch

Daniel Rubinstein

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

Jhon Guzmán

Como implantar o Elasticsearch no AWS Marketplace

Eduard Martin

Fragmentos e réplicas do Elasticsearch: um guia prático

Piotr Przybyl