La Red de Conocimientos Pedagógicos - Conocimientos educativos - "Habilidades básicas" Gestión del ciclo de vida del índice de búsqueda elástica (con código)

"Habilidades básicas" Gestión del ciclo de vida del índice de búsqueda elástica (con código)

La indexación es uno de los conceptos más importantes en la búsqueda elástica y la base de toda la operación de búsqueda elástica. Elasticsearch proporciona API de índice para la gestión del ciclo de vida de Elasticsearch, incluida la creación, consulta, eliminación y configuración de índices, congelación y descongelación de índices, división y reducción, etc. Dominar la gestión de índices es la capacidad básica para el desarrollo, la operación y el mantenimiento de Elasticsearch, y también ayudará a optimizar Elasticsearch más adelante.

Para crear un índice se puede utilizar la API proporcionada por Elasticsearch, cuyo formato es el siguiente:

donde está el nombre del índice a crear, es un parámetro obligatorio, y todas las letras deben estar en minúsculas. Al crear un índice, también puede realizar configuraciones relevantes:

Una solicitud para crear un índice sin configurar nada es la siguiente:

"reconocido" en el cuerpo de la respuesta indica que tiene tuvo éxito en el clúster de Elasticsearch. Se crea el índice y "shards_acknowledged" indica que todos los fragmentos de réplica del fragmento de índice se prepararon antes de que se agotara el tiempo de espera de la solicitud. Por supuesto, incluso si "reconocido" y "shards_acknowledged" son falsos, solo significa que el índice no se completó antes del tiempo de espera y que los clústeres posteriores eventualmente pueden crear el índice con éxito.

La API para crear índices también admite parámetros de consulta y cuerpos de solicitud, donde los parámetros son opcionales.

Los parámetros de consulta admiten los siguientes parámetros:

El cuerpo de la solicitud también admite tres parámetros:

El siguiente ejemplo de código especifica los parámetros de consulta y el cuerpo de la solicitud:

A través de la API Obtener índice, puede consultar información relacionada de uno o más índices. El formato de la API es el siguiente:

El destino puede ser un flujo de datos, un índice o un alias. Varios índices están separados por comas. El objetivo también admite consultas difusas (*). Si consulta todos los índices, puede utilizar * o _all. Si el control de permisos de seguridad está habilitado en el clúster, debe obtener el permiso de operación de índice de view_index_metadata o intentar consultar la información del índice. El siguiente es un caso de consulta específico:

La API de obtención de índice admite parámetros de consulta con URL. Estos parámetros son opcionales e incluyen principalmente lo siguiente:

En primer lugar, debemos dejar claro que el indicador en sí no se puede modificar. Cuando decimos modificar un índice, en realidad nos referimos a modificar los alias, las asignaciones de campos y la configuración del índice.

Primero explique el papel de los alias. Elasticsearch proporciona la función de alias. Se pueden agregar varios índices a un alias, lo que facilita la operación de múltiples índices específicos operando con un alias. Por ejemplo, cada año se crea un índice que incluye cuatro índices: índice-2019, índice-2020, índice-2021, índice-2022 * *.

De hecho, la modificación del alias consiste en eliminar el alias del índice y luego agregar un nuevo alias. Estas dos acciones se combinan para garantizar su atomicidad y garantizar que el alias no apunte a ningún índice en el momento de su eliminación.

El siguiente código desvincula my-index del índice my-index-000001 y luego lo vuelve a vincular al índice my-index-000002.

Asigne la estructura de datos y el tipo de campo del índice especificado, modifique la asignación del índice, modifique el nombre y el tipo del campo original y agregue nuevos campos. A continuación se agrega un nuevo tipo de palabra clave al campo de correo electrónico.

Admite múltiples índices, flujos de datos y alias, admite búsqueda difusa, use * o _all para especificar todos los flujos de datos y alias.

La siguiente es la situación de modificación de la configuración. Configure el índice con dos sectores principales y dos réplicas.

Eliminar un índice eliminará la información de metadatos de sus documentos, fragmentos y clústeres correspondientes.

Las operaciones indexadas son operaciones de alto riesgo y requieren precaución. Si el clúster habilita el control de permisos de seguridad, debe obtener el permiso de operación del índice de delete_index o intentar eliminar el índice.

No se puede eliminar un índice de escritura para un flujo de datos. Para eliminar el índice de escritura actual, se debe invertir el flujo de datos y se debe crear un nuevo índice de escritura.

La API para eliminar un índice es la siguiente:

es un parámetro obligatorio que especifica el nombre del índice. Se pueden separar varios índices mediante comas, no se admiten alias y la coincidencia aproximada no se admite de forma predeterminada. Si realmente necesita una coincidencia aproximada, debe configurar la acción del parámetro del clúster. destructivo_requires_name es falso. La API Eliminar índice es similar a la API Obtener índice y también admite parámetros de consulta de URL. Estos parámetros incluyen enable_no_indicators, expand_wildcards, ignore_unavailable, master_timeout y timeout. Los significados de estos parámetros son similares y no los repetiré aquí. Este es el código de caso para eliminar un índice:

De forma predeterminada, una vez que se crea un índice, estará activado. Sin embargo, en algunos casos, puede ser necesario cerrar el índice. Por ejemplo, algunos índices antiguos e innecesarios todavía ocupan una cierta cantidad de espacio y el clúster aún requiere algunos costos de mantenimiento. Cerrar un índice bloqueará todas las operaciones de lectura/escritura en el índice. Un índice cerrado no requiere mantenimiento del índice ni de las estructuras de datos internas del documento de búsqueda, lo que reduce la sobrecarga del clúster.

Nota especial: Cerrar el índice consumirá mucho espacio en disco y es una operación que requiere especial atención en producción. El cierre de índices se puede deshabilitar configurando cluster.indexes.close.enable en falso a través de la API de configuración del clúster; el valor predeterminado es verdadero.

Cuando se abre o cierra el índice, el nodo maestro se encarga de reiniciar los fragmentos, que pasarán por el proceso de recuperación. Después de abrir o cerrar el índice, los datos fragmentados se copiarán automáticamente para garantizar que haya suficientes fragmentos duplicados y alta disponibilidad.

De forma predeterminada, solo se admiten índices específicos que coincidan con el nombre completo, pero si el parámetro action. Si el nombre destructivo _ requisitos _ se establece en falso, puede usar * o _all para hacer referencia a todos los índices. Sin embargo, en este caso, una vez que un índice no coincide, se informará un error y no se recomienda abrirlo.

La API abierta se utiliza para reabrir un índice cerrado. Si el objetivo es un flujo de datos, se abrirán todos los índices correspondientes a ese flujo de datos.

De forma predeterminada, solo se admiten índices específicos que coincidan con el nombre completo, pero si el parámetro action. destructivo_requirements_name está configurado en falso, puede usar * o _all para hacer referencia a todos los índices, pero en este caso, una vez que falla una coincidencia de índice, se informará un error.

La contracción y división exponencial se refiere al número de partes principales del índice de contracción o división. Primero, debemos entender por qué necesitamos reducir el índice de división.

En elasticsearch, el nodo maestro tiene una gran carga de trabajo para administrar fragmentos. Reducir la cantidad de fragmentos en todo el clúster reduce el tiempo de recuperación, el tamaño del estado del clúster y el costo de mantenimiento del clúster. En muchos casos, algunos índices fríos no tienen datos para escribir después de ejecutarse durante un período de tiempo. La combinación de algunos fragmentos pequeños puede reducir los costos de mantenimiento del clúster.

Por otro lado, si durante las operaciones comerciales se descubre que un solo fragmento es demasiado grande debido al gran volumen de negocios y a una estimación insuficiente, es necesario dividir los indicadores y ampliar el número de fragmentos primarios.

En primer lugar, la contracción exponencial

Elasticsearch ha proporcionado una API de reducción desde la versión 5.0, que se utiliza para reducir la cantidad de fragmentos de índice para algunos índices pequeños. En realidad, el índice de origen no se manipula, sino que se crea un nuevo índice con la misma configuración que el índice de origen, pero con un número reducido de fragmentos.

Una vez reducida la fragmentación del índice, se puede eliminar el índice de origen.

Para poder dividir y reducir a través de la API de reducción, el índice debe cumplir las siguientes tres condiciones:

Para facilitar la asignación de fragmentos, primero puede eliminar los fragmentos replicados del índice y luego reducir Vuelva a agregar los fragmentos copiados una vez completada la operación.

Puede utilizar el siguiente código para eliminar todos los mosaicos de réplica, asignar todos los mosaicos principales al mismo nodo y establecer el estado del índice en solo lectura:

Reasignar los fragmentos del El índice de origen puede ser necesario en algún momento. Puede utilizar la API _cat para realizar un seguimiento del progreso o la API de estado del clúster para esperar a que se reasignen todos los fragmentos mediante el parámetro wait_for_no_relocation_shards.

Después de completar los pasos anteriores, puede realizar la operación de reducción. El siguiente es el formato de la API _shrink:

En el siguiente ejemplo, el índice my-index-000001 se reduce a encogido-my-index-000001.

Nota especial: debido a que el fragmento de destino se obtiene utilizando el resto del número de fragmento al agregar un nuevo documento, el número de fragmentos primarios solicitados en el índice de destino debe ser un factor del número de fragmentos primarios en el índice fuente. Por ejemplo, un índice con 8 sectores primarios se puede reducir a 4, 2 o 1 sectores primarios, o un índice con 15 sectores primarios se puede reducir a 5, 3 o 1 sectores primarios. Si el número de sectores en el índice es primo, entonces solo se puede reducir al sector principal.

Si el índice actual es un índice de escritura para un flujo de datos, no se permite reducir el índice. Debe invertir el flujo de datos y crear un nuevo índice de escritura para reducir el índice actual.

Todo el proceso de reducción de métricas es el siguiente:

Del mismo modo, Elasticsearch también proporciona una API dividida para dividir un índice en un nuevo índice que contiene más sectores primarios. El formato de la API dividida es el siguiente:

Para completar toda la operación de división, se deben cumplir las siguientes condiciones:

La siguiente solicitud de API puede hacer que el índice sea de solo lectura :

Si el índice actual es un índice de escritura para un flujo de datos, no se permite la división del índice. Antes de dividir el índice actual, es necesario invertir el flujo de datos y crear un nuevo índice de escritura.

El siguiente es un caso de solicitud para la división de índices utilizando la API Split. La API Split admite configuraciones y alias.

El número de sectores principales especificados por index.number_of_shards debe ser un múltiplo del número de sectores de origen.

El número de fragmentos que se pueden dividir mediante una división de índice está determinado por el parámetro index.number_of_routing_shards. El número de fragmentos de enrutamiento especifica el espacio hash. El espacio hash se utiliza internamente para distribuir entre los fragmentos. la forma de hashes consistentes. Por ejemplo, un índice con 5 segmentos y number_of_routing_shards establecido en 30 (5 x 2 x 3) se puede dividir 2 o 3 veces. En otras palabras, se puede descomponer de la siguiente manera:

5 10 30 (dividido en 2 y 3 por turno)

5 15 30 (dividido en 3 y 2 por turno)

5 30 (dividido en 6 partes)

Index.number_of_routing_shards es una configuración estática que se puede especificar al crear un índice o configurar un índice en un índice cerrado. Su valor predeterminado depende del número de sectores primarios en el índice original. De forma predeterminada, se permite la división en múltiplos de 2 en hasta 1024 porciones. Sin embargo, se debe tener en cuenta el número original de cortes primarios. Por ejemplo, un índice creado con 5 sectores se puede dividir en 10, 20, 40, 80, 160, 320 o hasta 640 sectores.

Si el índice de origen tiene solo un segmento principal, se puede dividir en cualquier número de segmentos primarios.

2.2. Flujo de trabajo de división de indicadores

2.3. ¿Por qué Elasticsearch no admite la redivisión incremental?

La mayoría de los almacenes clave-valor admiten la fragmentación automática que se expande automáticamente a medida que crecen los datos. ¿Por qué Elasticsearch no lo admite?

La solución más clásica es agregar un fragmento y luego almacenar los nuevos datos en este fragmento recién agregado. Sin embargo, esta solución puede provocar un cuello de botella en la indexación en Elasticsearch y la estructura general se volverá más compleja, porque Elasticsearch necesita localizar a qué fragmento pertenece el documento, lo que significa que se deben utilizar diferentes esquemas de hash para reequilibrar los datos existentes.

La solución a este problema en los sistemas de almacenamiento clave-valor suele ser utilizar un hash consistente. Cuando el número de fragmentos aumenta de N a N 1, el hash consistente solo necesita redistribuir 1/N claves. Por ejemplo, la solución del clúster redis es encaje.

Pero la capa inferior de un fragmento de Elasticsearch es en realidad un índice de Lucene. Eliminar una pequeña porción de datos de un índice de Lucene suele ser mucho más costoso que un sistema de almacenamiento de valores-clave. Por lo tanto, Elasticsearch elige dividir archivos a nivel de índice y copiar archivos de manera eficiente utilizando enlaces físicos para evitar mover documentos entre índices.

Para el escenario de agregar datos sin modificarlos ni eliminarlos, puede hacerlo creando un nuevo índice e insertando los nuevos datos en ese índice, y agregando un alias para leer el índice antiguo y el nuevo. ganando así una mayor flexibilidad. Suponiendo que el índice antiguo y el índice nuevo tienen M y N fragmentos respectivamente, esto no tiene gastos generales en comparación con la búsqueda de un índice con M N fragmentos.

2.4. ¿Cómo monitorear el avance de la división?

Utilice la API dividida para dividir el índice. El retorno normal de la API no significa que el proceso de división se haya completado. Solo significa que la solicitud para crear el índice de destino se ha completado y el clúster. Se ha añadido el estado. En este momento, es posible que el fragmento principal no se haya asignado y que el fragmento de réplica no se haya creado correctamente.

Una vez asignado el segmento principal, el estado será Inicializando y comenzará el proceso de división. El estado del segmento se activará hasta que se complete el proceso de división.

Puede usar la API de recuperación _cat para monitorear el proceso de división o usar la API de salud del clúster para esperar a que se asignen todos los sectores principales configurando el parámetro wait_for_status en amarillo.

La API Elasticsearch Clone se puede utilizar para copiar y realizar copias de seguridad de los datos del índice Elasticsearch.

En segundo lugar, API de clonación de índices

La clonación de índices no clonará los metadatos del índice de origen, incluidos los alias, las definiciones de la etapa ILM y la información relacionada con los seguidores de CCR. La API de clonación copiará toda la configuración excepto index.number_of_replicas e index.auto_expand_replicas. Estas dos configuraciones especiales se pueden especificar explícitamente en la solicitud a la API de clonación. El formato de la API de clonación es el siguiente:

El índice cumple con las condiciones para la clonación:

Consulte lo que dije antes, al configurar index.blocks.write en verdadero, Aún podemos garantizar que el índice sea legible. El siguiente es un caso de clonación de API:

Nota: El valor de index.number_of_shards debe ser coherente con el número de sectores primarios del índice de origen.

En tercer lugar, el proceso de clonación de índices

En cuarto lugar, monitorear el progreso de la clonación

Cuando se utiliza la API de clonación para clonar el índice, el retorno normal del API no significa que se haya completado el proceso de clonación, lo que solo significa que se completó la solicitud para crear el índice de destino y se agregó el estado del clúster. En este punto, es posible que el fragmento principal no se haya asignado y que el fragmento de réplica no se haya creado correctamente.

Una vez asignada la partición primaria, el estado será inicializando y comenzará el proceso de clonación. El estado de la partición cambiará a activo hasta que se complete el proceso de clonación.

Puede usar la API de recuperación _cat para monitorear el proceso de clonación, o puede usar la API de salud del clúster para esperar a que se asignen todos los sectores primarios configurando el parámetro wait_for_status en amarillo.

Rollover API es una característica muy útil proporcionada por Elasticsearch. Todos sabemos que en MySQL, una vez que la cantidad de datos es relativamente grande, se pueden dividir en bases de datos y tablas, como una tabla por mes según el tiempo. La función de giro funciona de manera similar en este caso. Su principio es crear primero un índice con un alias y luego establecer ciertas reglas (como condiciones que cumplan un cierto rango de tiempo). Cuando se cumplen las reglas establecidas, Elasticsearch creará automáticamente un nuevo índice y el alias cambiará automáticamente para apuntar al nuevo índice, lo que equivale a establecer automáticamente una función de partición de índice en el nivel físico. Cuando los datos de la consulta se encuentran dentro de un cierto período de tiempo, la consulta se realizará en un índice relativamente pequeño, que es relativamente pequeño.

La API de rollover creará nuevos índices para flujos de datos o alias de índice. (Antes de Elasticsearch 7.9, los datos de series temporales generalmente se administraban mediante alias de índice. Después de Elasticsearch, la transmisión de datos reemplazó esta función, requiriendo menos mantenimiento y integrándose automáticamente con la capa de datos).

El efecto de la API rodante varía según el alias del índice que se está rodando:

Cuando se utiliza la API invertida, si especifica el nombre del nuevo índice y el índice original termina con "-" y un número, el nuevo índice conservará el nombre e incrementará el número. Por ejemplo, si el índice original era mi-índice-000001, el nuevo índice será mi-índice-000002.

Si utiliza alias de índice con datos de series temporales, puede utilizar fechas en los nombres de los índices para realizar un seguimiento de las fechas sucesivas. Por ejemplo, puede crear un alias para que apunte a un archivo . Si el índice se creó el 6 de mayo de 1999, el nombre del índice es Mi-Índice-6 de mayo de 2099-000001. Si lanza el alias el 7 de mayo de 1999, el nombre del nuevo índice es my-index-2099.05.07-000002.

El formato de la API de rollover es el siguiente:

La API de rollover también admite parámetros de consulta y cuerpos de solicitud. Los parámetros de consulta admiten wait_for_active_shards, master_timeout, timeout y dry_run, especialmente dry_run. Si dry_run se establece en verdadero, entonces esta solicitud en realidad no se ejecutará, pero verificará si el índice actual cumple con las condiciones especificadas, lo cual es muy útil para las pruebas previas.

El cuerpo de la solicitud admite alias, mapeo y configuraciones (estos tres parámetros solo admiten índices, no flujos de datos) y condiciones.

Sobre todo cuando se habla de condiciones. Este es un parámetro opcional. Si se especifica una condición, la rodadura se realiza solo si se cumplen una o más condiciones especificadas por la condición. Si no se especifica ninguna condición, el desplazamiento será incondicional. Si necesita desplazamiento automático, puede utilizar el volteo ILM.

Las condiciones admiten los siguientes atributos:

El siguiente es un ejemplo del flujo de datos en el flip:

La información de respuesta es la siguiente:

El siguiente es el ejemplo de un alias de índice:

2. Solicitar la API continua

Si el nombre de índice del alias usa una expresión matemática de fecha, y el índice se desplaza en un intervalo fijo, puede utilizar la expresión matemática de fecha para limitar el alcance de la búsqueda. Por ejemplo, la búsqueda a continuación apunta a índices creados en los últimos tres días.

La congelación de índices es una operación proporcionada por Elasticsearch para reducir la sobrecarga de memoria. En la versión 7.14, esta función está marcada como obsoleta. Después de la versión 8, se mejoró el uso de la memoria dinámica y las funciones de congelar y descongelar ya no se aplican.

La siguiente es una demostración de funcionamiento sencillo. Si es la versión 7.x, aún se puede utilizar como referencia.

1. Congelación del índice

Después de congelar el índice, casi no hay sobrecarga en el clúster, excepto para mantener los metadatos en la memoria. Después de la congelación, el índice es de solo lectura y todas las operaciones de escritura, como las escrituras y fusiones de documentos, se bloquean.

El formato API es el siguiente:

El siguiente es un ejemplo de código para una operación de congelación de índice:

Tenga en cuenta que congelar el índice lo cerrará y realice la misma llamada API. Esto hará que la asignación principal quede sin asignar durante un corto período de tiempo y que el clúster se vuelva rojo hasta que las asignaciones se completen nuevamente.

En segundo lugar, descongelación del índice

El formato API para congelar y descongelar el índice correspondiente es el siguiente:

El siguiente es un ejemplo de código para la operación de descongelación del índice. :

Elasticsearch proporciona la API de índice Resolve para ayudar en la resolución del índice. Según la coincidencia de nombre o patrón del índice/alias/flujo de datos proporcionado, se puede encontrar información sobre los índices coincidentes en el clúster actual. El siguiente es el formato de la API:

El caso es el siguiente:

Las funciones de esta API son en su mayoría auxiliares y no se utilizan mucho en la práctica. Consulte la documentación oficial para conocer los parámetros detallados.

Únete a mí y conviértete en un experto en resiliencia.