Elasticsearch: ¿Cuál es el tiempo casi real de ES? Este artículo lo lleva a comprender el principio de descarga de actualización de translogs de ES


Este artículo presenta principalmente el mecanismo de trabajo de índices de Elasticsearch y explora las razones de su consulta casi en tiempo real. Explore cómo utiliza translog para garantizar la seguridad de los datos y cómo optimizamos los parámetros de translog en un entorno de producción para maximizar el rendimiento.

Principalmente introducirá dos operaciones comunes en elástico: actualizar y vaciar, y cómo estas dos interfaces aseguran que los datos se puedan recuperar.

1 persistencia de datos translog de WAL

1.1 Colocación de datos fsync

Cuando escribimos datos en el disco, generalmente escribimos primero los datos en el sistema de archivos virtual del sistema operativo, también en la memoria, y luego necesitamos llamar a fsync para vaciar los datos del sistema de archivos virtual en el disco. el sistema está apagado, causará pérdida de datos Creo que todos conocen este principio.

1.2 Registro de escritura anticipada de ES

Elasticsearch debe conservar todos los cambios en el disco para lograr una alta confiabilidad.

La capa inferior de elástico usa la biblioteca lucene para implementar la función de índice invertido. En el concepto de lucene, cada registro se llama documento (documento), lucene usa segmento (segmento) para almacenar datos y el punto de confirmación se usa para registrar todos segmentos Metadatos.

Para que se busque un registro, debe estar escrito en el segmento. Esto es muy importante. Presentaré por qué la búsqueda elástica es casi en tiempo real (casi en tiempo real) en lugar de en tiempo real.

Elastic usa translog para registrar todas las operaciones, lo llamamos write-ahead-log, cuando agregamos un nuevo registro, es escribirá los datos en translog y en el búfer de memoria (búfer de memoria), como se muestra en la siguiente figura:

Inserte la descripción de la imagen aquí

1.3 Escritura secuencial translog

Translog es fsync en tiempo real, y también escribe datos es. El contenido de translog correspondiente se escribe en el disco en tiempo real, y está en el camino de los archivos adjuntos secuenciales, por lo que el rendimiento de la escritura en el disco es muy alto.

Siempre que los datos se escriban en el translog, se puede garantizar que la información original se haya colocado en el disco, lo que garantiza aún más la fiabilidad de los datos.

El área del búfer de memoria y el translog son la clave para casi el tiempo real. Mencionamos anteriormente que el nuevo índice debe escribirse en el segmento antes de que se pueda buscar. Por lo tanto, después de escribir los datos en el búfer de memoria, no se puede buscar. Si desea que el documento se busque inmediatamente, debe llamar manualmente a la operación de actualización.

2 La operación de actualización forma un nuevo segmento y lo escribe en el sistema de archivos virtual del SO, mientras que se puede consultar la apertura del nuevo segmento

De forma predeterminada, es ejecuta la actualización cada segundo. Este intervalo de actualización puede ser modificado por el parámetro index.refresh_interval. ¿Qué hace exactamente la operación de actualización?

Todos los documentos del búfer de memoria se escriben en un nuevo segmento, pero no se llama a fsync, por
lo que es posible que se pierdan los datos de la memoria. El segmento se abre para que se puedan buscar los documentos que contiene . El estado después de que se ejecuta la actualización en el
búfer de memoria
. Como se muestra en la siguiente figura:
(Nota: translog está en el disco)
Inserte la descripción de la imagen aquí

2.1 Razones para el tiempo casi real

Debido a que los datos en la memoria intermedia se escriben en el archivo de segmento y el archivo de segmento se escribe en el sistema de archivos virtual, el nuevo archivo de segmento se puede abrir para recuperarlo.

Por tanto, los datos del búfer de memoria no se pueden recuperar antes de que se forme el nuevo archivo de segmento.

La operación de actualización se ejecuta una vez en 1 de forma predeterminada, y el documento recién insertado se puede recuperar solo después de 1 de forma predeterminada. Esta es la razón del tiempo casi real.

2.2 actualizar el combate real

La sobrecarga de actualización es relativamente grande. Probé el tiempo de actualización de los registros de 10 W en mi propio entorno y me tomó alrededor de 14 ms. Por lo tanto, al crear índices en lotes, puedo establecer el intervalo de actualización en -1 para cerrar temporalmente la actualización y esperar hasta que se envíen los índices. Active la actualización, puede modificar este parámetro a través de la siguiente interfaz:

curl -XPUT 'localhost:9200/test/_settings' -d '{ "index" : { "refresh_interval" : "-1" }}'

Además, cuando realiza una indexación por lotes, puede considerar establecer el número de copias en 0, porque cuando el documento se copia del fragmento principal al fragmento de réplica, se debe realizar el mismo análisis e indexación en el fragmento secundario. el proceso de fusión, esta sobrecarga es relativamente grande, puede abrir la copia después de que se compile el índice, por lo que solo necesita copiar los datos del fragmento primario al fragmento secundario:

 curl -XPUT 'localhost:9200/my_index/_settings' -d ' { "index" : { "number_of_replicas" : 0 }}'

Después de ejecutar el índice de lotes, vuelva a cambiar el intervalo de actualización:

 curl -XPUT 'localhost:9200/my_index/_settings' -d '{ "index" : { "refresh_interval" : "1s" } }'

También puede forzar una actualización y combinación de segmentos de índice:

 curl -XPOST 'localhost:9200/my_index/_refresh'curl -XPOST 'localhost:9200/my_index/_forcemerge?max_num_segments=5'

3 Funcionamiento de vaciado, borrado de registro, disco flash fsync de archivos de segmento en el sistema de archivos virtual

A medida que el archivo de translog se hace cada vez más grande, es necesario considerar vaciar los datos de la memoria en el disco. Este proceso se llama vaciar. El proceso de vaciado realiza principalmente las siguientes operaciones:

  1. Escriba todos los documentos del búfer de memoria en un nuevo segmento
  2. Vaciar el búfer de memoria
  3. Escribe la información del punto de confirmación en el disco
  4. Caché de página (segmentos) del sistema de archivos virtual fsync to disk
  5. Elimine el archivo de translog antiguo, por lo que en este momento los segmentos de la memoria se han escrito en el disco, no hay necesidad de translog para garantizar la seguridad de los datos

El estado después de la descarga es el siguiente:
Inserte la descripción de la imagen aquí

es tiene varias condiciones para determinar si se va a descargar en el disco. Las diferentes versiones de los parámetros de es son diferentes. Puede consultar la versión correspondiente del documento de es para ver estos parámetros: es translog, aquí está el parámetro de descarga de la versión 1.7:

index.translog.flush_threshold_ops,执行多少次操作后执行一次flush,默认无限制
index.translog.flush_threshold_size,translog的大小超过这个参数后flush,默认512mb
index.translog.flush_threshold_period,多长时间强制flush一次,默认30m
index.translog.interval,es多久去检测一次translog是否满足flush条件

El parámetro anterior es la frecuencia con la que es realiza la operación de descarga. Durante el proceso de recuperación del sistema, es comparará los datos en translog y segmentos para garantizar la integridad de los datos. Para la seguridad de los datos, es actualizará translog (fsync) cada 5 segundos de forma predeterminada. el disco, es decir, cuando el sistema está apagado, perderá hasta 5 segundos de datos. Si eres más sensible a la seguridad de los datos, puedes reducir este intervalo o cambiarlo a fsync translog a disco después de cada solicitud . Pero consumirá más recursos; este intervalo está controlado por los siguientes dos parámetros:

index.translog.sync_interval 控制translog多久fsync到磁盘,最小为100ms
index.translog.durability translog是每5秒钟刷新一次还是每次请求都fsync,这个参数有2个取值:request(每次请求都执行fsync,es要等translog fsync到磁盘后才会返回成功)async(默认值,translog每隔5秒钟fsync一次)

Los lectores deben averiguar la diferencia entre flush y fsync. Flush es vaciar los datos de la memoria (incluidos translog y segmentos) en el disco, mientras que fsync es solo un disco que vacía translog (para garantizar que no se pierdan los datos).

Supongo que te gusta

Origin blog.csdn.net/hugo_lei/article/details/106519069
Recomendado
Clasificación