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 élreplica node
.coordinating node
Si se encuentraprimary node
y todoreplica node
está hecho, devuelve el resultado de la respuesta al cliente.
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
Dedoc id
ruta Hash, reenvía la solicitud al Nodo correspondiente, esta vez utilizandoround-robin
un algoritmo de sondeo aleatorio , laprimary 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 shard
replica 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 dedocument
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
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 file
archivo 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 real ? NRT
, 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 deleted
documento 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 | 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 | 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.