Blog

Cómo aumentar el conteo de fragmentos primarios en Elasticsearch

Aprende cómo aumentar la cantidad de shards primarios en Elasticsearch usando las API split y reindex para un escalado óptimo de shards.

No es posible aumentar el número de fragmentos primarios de un índice existente, lo que significa que hay que recrear un índice si quieres aumentar el número de fragmentos primarios. En estas situaciones se emplean generalmente dos métodos: la API _reindex y la API _split.

La API _split suele ser un método más rápido que la API _reindex. La indexación debe detener antes de ambas operaciones, de lo contrario, el source_index y el target_index el recuentos de documentos variarán.

Mayor cantidad de shards en Elasticsearch al recrear un índice

Método 1 – usando la API dividida

La API dividida se emplea para crear un nuevo índice con el número deseado de fragmentos primarios copiando los ajustes y mapeando un índice existente. El número deseado de fragmentos primarios puede establecer durante la creación. Se deben comprobar las siguientes configuraciones antes de implementar la API de división:

  1. El índice de origen debe ser de solo lectura. Esto significa que el proceso de indexación debe detener.

  2. El número de fragmentos primarios en el índice objetivo debe ser un múltiplo del número de fragmentos primarios en el índice fuente. Por ejemplo, si el índice fuente tiene 5 fragmentos primarios, los fragmentos primarios del índice objetivo pueden establecer en 10, 15, 20, y así sucesivamente.

Nota: Si solo es necesario cambiar el número principal del fragmento, se prefiere la API dividida porque es mucho más rápida que la API de Reindex.

Implementación de la API de división

Crea un índice de prueba:

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

El índice fuente debe ser de solo lectura para poder dividir:

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

Los ajustes y mapeos se copiarán automáticamente desde el índice fuente:

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

Puedes consultar el progreso con:

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

Como los ajustes y mapeos se copian de los índices fuente, el índice destino es de solo lectura. Activemos la operación de escritura para el índice objetivo:

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

Consulta el índice de origen y destino docs.count antes de eliminar el índice original:

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

El nombre del índice y el nombre del alias no pueden ser iguales. Necesitas eliminar el índice fuente y agregar el nombre del índice fuente como alias al índice objetivo:

DELETE test_split_source
PUT /test_split_target/_alias/test_split_source

Luego de agregar el alias test_split_source al índice de test_split_target , deberías probarlo con:

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

Método 2 – usando la API de reindex

Al crear un nuevo índice con la API Reindex, se puede obtener cualquier número de conteos de fragmentos primarios. Tras crear un nuevo índice con el número previsto de fragmentos primarios, todos los datos del índice fuente pueden reindexar a este nuevo índice.

Además de las funciones de API dividida, los datos pueden manipular usando el ingest_pipeline en el AP de reindexación. Con la tubería de ingest, solo los campos especificados que encajen con el filtro se indexarán en el índice objetivo usando la consulta. El contenido de los datos puede modificar usando un script sencillo, y varios índices pueden fusionar en un solo índice.

Implementación de la API de reindex

Crea un reindexado de prueba:

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

Copia la configuración y los mapeos del índice fuente:

GET test_reindex_source

Crea un índice objetivo con ajustes, mapeos y el número de fragmentos deseado:

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

*Nota: ajustar number_of_replicas: 0 y refresh_interval: -1 aumentará la velocidad de reindexación.

Inicia el proceso de reindexación. Configurar requests_per_second=-1 y slices=auto ajustará la velocidad de reindexación.

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

Verás el task_id cuando ejecutes la API de reindex. Cópila y comprueba con _tasks API:

GET _tasks/<task_id>

Actualiza la configuración después de que termine el reindexado:

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

Consulta el índice fuente y destino docs.count antes de borrar el índice original, debería ser el mismo:

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

El nombre del índice y el nombre del alias no pueden ser iguales. Elimina el índice fuente y agrega el nombre del índice fuente como alias al índice objetivo:

DELETE test_reindex_source
PUT /test_reindex_target/_alias/test_reindex_source

Luego de agregar el alias test_split_source al índice de test_split_target, pruébalo usando:

GET test_reindex_source

Resumen

Si quieres aumentar el recuento de fragmentos primarios de un índice existente, necesitas recrear los ajustes y asignaciones a un nuevo índice. Hay 2 métodos principales para hacerlo: la API de reindex y la API de split. La indexación activa debe detener antes de usar cualquiera de los dos métodos.

Contenido relacionado

Cómo migrar datos entre diferentes versiones de Elasticsearch y entre clusters

Kofi Bartlett

Introducción de la interfaz de reglas de consulta Elasticsearch en Kibana

Jhon Guzmán

Elasticsearch en JavaScript de la manera correcta, parte II

Jeffrey Rengifo

Implementación de búsqueda semántica: Construcción de una búsqueda de recetas con Elasticsearch

Andre Luiz

Cómo desplegar Elasticsearch en AWS Marketplace

Eduard Martin

¿Estás listo para crear experiencias de búsqueda de última generación?

No se logra una búsqueda suficientemente avanzada con los esfuerzos de uno. Elasticsearch está impulsado por científicos de datos, operaciones de ML, ingenieros y muchos más que son tan apasionados por la búsqueda como tú. Conectemos y trabajemos juntos para crear la experiencia mágica de búsqueda que te dará los resultados que deseas.

Pruébalo tú mismo