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.

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:
O índice de origem deve ser somente leitura. Isso significa que o processo de indexação precisa ser interrompido.
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_totalComo 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.countO 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_sourceApó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_sourceCrie 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.countO 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_sourceApós adicionar o alias test_split_source ao índice test_split_target, teste-o usando:
GET test_reindex_sourceResumo
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.




