Cómo funciona Elastic Search

Preguntas de entrevista

¿Cuál es el principio de funcionamiento de la escritura de datos ES? ¿Cómo funcionan los datos de consulta de ES? ¿Qué pasa con Lucene en la parte inferior? ¿Entiendes el índice invertido?

Psicoanálisis entrevistador

Pregunta esto, de hecho, el entrevistador quiere ver si entiendes algunos principios básicos de es, porque usar es no es más que escribir datos y buscar datos. Si no comprende lo que hace es cuando inicia una solicitud de escritura y búsqueda, entonces realmente lo está ...

Sí, es básicamente una caja negra, ¿qué más puedes hacer? Lo único que puede hacer es usar la API es para leer y escribir datos. Si algo sale mal y no sabes nada, ¿qué puedes esperar de ti?

Análisis de las preguntas de la entrevista

es escribir proceso de datos

  • El cliente selecciona un nodo para enviar la solicitud, y este nodo es el  coordinating node (nodo coordinador).
  • coordinating node El documento se enruta y la solicitud se reenvía al nodo correspondiente (hay un fragmento primario).
  • primary shard Procese la solicitud en el nodo real  y luego sincronice los datos con él  replica node .
  • coordinating node Si se encuentra  primary node y todo  replica node está hecho, devuelve el resultado de la respuesta al cliente.

es-escribir

es leer proceso de datos

Se puede  doc id consultar y, en función  doc id del hash, se juzgará a doc id qué fragmento está asignado en ese momento  y se le preguntará desde el fragmento.

  • El cliente envía una solicitud a cualquier nodo y se convierte en  coordinate node .
  • coordinate node De  doc id ruta Hash, reenvía la solicitud al Nodo correspondiente, esta vez utilizando  round-robin un algoritmo de sondeo aleatorio , la  primary shard selección aleatoria y una réplica de todos, para que la solicitud de lectura se equilibre la carga.
  • El nodo que recibe la solicitud devuelve el documento al  coordinate node .
  • coordinate node Devuelva el documento al cliente.

es proceso de búsqueda de datos

La más poderosa de ellas es hacer una búsqueda de texto completo, es decir, por ejemplo, tiene tres piezas de datos:

java真好玩儿啊
java好难学啊
j2ee特别牛Copiar al portapapelesErrorCopied

java Busca en función de  palabras clave y busca las que java están  contenidas  document . es volverá a ti: java es muy divertido, java es muy difícil de aprender.

  • El cliente envía una solicitud a uno  coordinate node .
  • El nodo coordinador reenvía la solicitud de búsqueda al  OR correspondiente de  todos los fragmentos   .primary shardreplica shard
  • Fase de consulta: cada fragmento devuelve sus propios resultados de búsqueda (de hecho, algunos  doc id ) al nodo de coordinación, y el nodo de coordinación realiza operaciones como la combinación de datos, la clasificación y la paginación para producir el resultado final.
  • podido recuperar la fase de: seguido por el nodo coordinador de acuerdo con los  doc id diversos nodos a tirar de la real de  document datos, finalmente devuelve al cliente.

La solicitud de escritura se escribe en el fragmento principal y luego se sincroniza con todos los fragmentos de réplica; la solicitud de lectura se puede leer desde el fragmento primario o el fragmento de réplica mediante un algoritmo de sondeo aleatorio.

El principio subyacente de escribir datos

es-escribir-detalle

Primero escriba en el búfer de memoria, los datos no se pueden buscar mientras están en el búfer; al mismo tiempo, escriba los datos en el archivo de registro de translog.

Si el búfer está casi lleno, o después de un cierto período de tiempo, los datos refresh en el búfer de la memoria se transferirán  a segment file uno nuevo  , pero en este momento los datos no ingresarán al segment filearchivo de disco directamente  , sino primero  os cache . Este proceso es solo eso  refresh .

Cada segundo, es escribe los datos en el búfer en uno nuevo segment file  , y cada segundo se genera un nuevo archivo de disco segment file  , que  segment file almacena los datos escritos en el búfer en el último segundo.

Pero si no hay datos en el búfer en este momento, entonces, por supuesto, la operación de actualización no se ejecutará. Si hay datos en el búfer, la operación de actualización se ejecutará una vez por segundo de forma predeterminada y se actualizará en un nuevo archivo de segmento. .

En el sistema operativo, los archivos de disco en realidad tienen algo llamado  os cache caché del sistema operativo, es decir, antes de que los datos se escriban en el archivo de disco, primero ingresará  os cache , primero ingresará a un caché de memoria a nivel del sistema operativo. Siempre  buffer que los datos se actualicen mediante la operación de actualización  os cache , estos datos se pueden buscar.

¿Por qué se llama es casi en tiempo realNRT , El nombre completo  near real-time . El valor predeterminado es actualizar cada 1 segundo, por lo que es casi en tiempo real, porque los datos escritos solo se pueden ver después de 1 segundo. Es a través de  restful api o  java api , realice manualmente una operación de actualización, el búfer de datos se coloca manualmente en el pincel  os cache , de modo que los datos se pueden encontrar de inmediato. Mientras se ingresen los datos  os cache , el búfer se vaciará, porque no hay necesidad de retener el búfer y los datos se han guardado en el disco en el translog.

Repitiendo los pasos anteriores, los nuevos datos ingresan continuamente al búfer y translog, y escriben continuamente los  buffer datos uno tras otro  segment file . Cada vez  refresh que se borra el búfer, el translog se retiene. A medida que avanza este proceso, translog se hará cada vez más grande. Cuando el translog alcanza una cierta longitud, se activa la  commit operación.

El primer paso de la operación de confirmación es almacenar los datos en búfer antes  refresh de  os cache vaciar el búfer. Luego, escriba uno  commit point en el archivo de disco, que identifica el  commit point todo correspondiente  segment file y, al mismo tiempo, fuerce  os cache todos los datos actuales  fsync al archivo de disco. Finalmente, borre el  archivo de registro de translog existente, reinicie un translog y la operación de confirmación estará completa.

Esta operación de confirmación se llama  flush . El valor predeterminado se ejecuta automáticamente cada 30 minutos  flush , pero si el translog es demasiado grande, también se activará  flush . La operación de vaciado corresponde a todo el proceso de confirmación. Podemos ejecutar manualmente la operación de vaciado a través de la es api, y vaciar manualmente los datos en la caché del sistema operativo para fsync en el disco.

¿Cuál es el propósito de los archivos de registro translog? Antes de ejecutar la operación de confirmación, los datos permanecen en el búfer o en la caché del sistema operativo. Tanto el búfer como la caché del sistema operativo son memoria. Una vez que la máquina muere, todos los datos en la memoria se pierden. Por lo tanto, las operaciones correspondientes a los datos deben escribirse en un archivo de registro especial  translog . Una vez que la máquina se apaga y se reinicia nuevamente, es leerá automáticamente los datos en el archivo de registro de translog y los restaurará al búfer de memoria y al caché del sistema operativo.

El translog se escribe primero en la caché del sistema operativo. De forma predeterminada, se descarga en el disco cada 5 segundos, por lo que, de forma predeterminada, puede haber 5 segundos de datos que solo permanecerán en la caché del sistema operativo del búfer o archivo de translog. Si la máquina está en este momento Si cuelga, perderá  5 segundos de datos. Sin embargo, este rendimiento es mejor, perdiendo hasta 5 segundos de datos. También puede configurar translog para que cada operación de escritura deba realizarse directamente  fsync en el disco, pero el rendimiento será mucho peor.

De hecho, estás aquí. Si el entrevistador no te hizo la pregunta de es perder datos, puedes presumir ante el entrevistador aquí. Dijiste, es primero es casi en tiempo real, y los datos se pueden buscar después de 1 segundo .; Puede perder datos. Hay 5 segundos de datos que permanecen en el búfer, la caché del sistema operativo del registro y la caché del sistema operativo del archivo de segmento, pero no en el disco. Si se cae en este momento, se producirán 5 segundos de pérdida de datos .

En resumen , los datos se escriben primero en el búfer de memoria, y luego cada 1s, los datos se actualizan en la caché del sistema operativo y los datos se pueden buscar en la caché del sistema operativo (por lo que dijimos que se puede buscar es desde la escritura hasta la , y hay 1 s en el medio. retraso). Cada 5 s, escriba datos en el archivo de translog (por lo que si la máquina está inactiva y los datos de la memoria se han ido por completo, habrá como máximo 5 s de pérdida de datos), el translog es grande hasta cierto punto, o cada 30 minutos por defecto, la operación de confirmación se activará y el búfer se almacenará en búfer Los datos de la zona se vacían en el archivo de disco del archivo de segmento.

Una vez que los datos se escriben en el archivo de segmento, se crea un índice invertido al mismo tiempo.

El principio subyacente de eliminar / actualizar datos

Si se trata de una operación de eliminación, se generará un .del archivo al realizar la  confirmación y se marcará un documento como  deleted estado, luego al buscar, se .del puede saber si el documento se ha eliminado de acuerdo con el  archivo.

Si se trata de una operación de actualización, el documento original se marca como un  deleted estado y luego se escribe un nuevo dato.

Se genera un búfer en cada actualización  segment file , por lo que por defecto es uno cada 1 segundo  segment file , por lo segment file que bajará  más y más. En este momento, la fusión se ejecutará con regularidad. Cada vez que se fusiona, varios  documentos se  segment file fusionarán en uno. Al mismo tiempo, el deleteddocumento identificado  se eliminará físicamente y, a continuación segment file , se escribirá el nuevo  en el disco. Se escribirá uno aquí para  commit point identificar todos los nuevos  segment file y luego ábralo  segment file para buscar., Y elimine el anterior al mismo tiempo  segment file .

Lucene de bajo nivel

En pocas palabras, lucene es un paquete jar que contiene varios códigos de algoritmo encapsulados para establecer índices invertidos. Cuando desarrollamos en Java, introducimos el tarro de lucene y luego lo desarrollamos en base a la api de lucene.

A través de lucene, podemos indexar los datos existentes y lucene organizará la estructura de datos del índice en el disco local.

Índice invertido

En un motor de búsqueda, cada documento tiene un ID de documento correspondiente y el contenido del documento se representa como una colección de una serie de palabras clave. Por ejemplo, el documento 1 se ha segmentado por palabras y se extraen 20 palabras clave, y cada palabra clave registrará el número de veces que aparece en el documento y dónde aparece.

Luego, el índice invertido es  la asignación de palabras clave a ID de documentos.Cada palabra clave corresponde a una serie de archivos, y las palabras clave aparecen en estos archivos.

Regala una castaña.

Están disponibles los siguientes documentos:

DocId Doc
1 El padre de Google Maps salta a Facebook
2 El padre de Google Maps se une a Facebook
3 Russ, fundador de Google Maps, deja Google para unirse a Facebook
4 El padre de Google Maps abandonó Facebook relacionado con la cancelación del proyecto Wave
5 Russ, el padre de Google Maps, se une al sitio de redes sociales Facebook

Después de la segmentación de palabras del documento, se obtiene el siguiente índice invertido .

WordId Palabra DocIds
1 Google 1, 2, 3, 4, 5
2 mapa 1, 2, 3, 4, 5
3 Padre 1, 2, 4, 5
4 Salto de trabajo 1, 4
5 Facebook 1, 2, 3, 4, 5
6 Unirse 2, 3, 5
7 Fundador 3
8 Las 3, 5
9 irse 3
10 versus 4
.. .. ..

Además, un índice invertido práctico también puede registrar más información, como información de frecuencia de documentos, indicando cuántos documentos en la colección de documentos contienen una determinada palabra.

Luego, con el índice invertido, los motores de búsqueda pueden responder fácilmente a las consultas de los usuarios. Por ejemplo, el usuario ingresa una consulta  Facebook , el sistema de búsqueda busca el índice invertido y lee los documentos que contienen la palabra de él Estos documentos son los resultados de búsqueda que se le brindan al usuario.

Preste atención a dos detalles importantes del índice invertido:

  • Todos los términos del índice invertido corresponden a uno o más documentos;
  • Los términos del índice invertido están ordenados en orden lexicográfico ascendente.

Supongo que te gusta

Origin blog.csdn.net/qq_27828675/article/details/115374940
Recomendado
Clasificación