Preparación de la entrevista del motor de búsqueda

1. Instrucciones básicas

Un estándar de facto en la industria es que los motores de búsqueda distribuidos generalmente usan elasticsearch y solr, pero es cierto que en los últimos dos años, en general, todos han usado los es más fáciles de usar. ¿Qué podría preguntar el entrevistador sobre este contenido?

(1) ¿Puedes hablar sobre el principio de la arquitectura distribuida de es (cómo es que es realiza la arquitectura distribuida)?

(2) ¿Cuál es el principio de funcionamiento de es escribir datos? ¿Cuál es el principio de funcionamiento de los datos de consulta es?

(3) ¿Cómo pueden los es mejorar el rendimiento de las consultas cuando la cantidad de datos es grande (miles de millones de niveles)?

(4) ¿Cuál es la arquitectura de implementación del clúster de producción de es? ¿Cuál es la cantidad aproximada de datos para cada índice? ¿Cuántos fragmentos hay para cada índice?

2. Diseño de la arquitectura del motor de búsqueda distribuido

1. Preguntas de la entrevista

¿Puede hablarme sobre el principio de la arquitectura distribuida es (cómo se realiza es la arquitectura distribuida)?

2. El análisis psicológico del entrevistador

En la búsqueda, Lucene es la biblioteca de búsqueda más popular. Hace unos años, la industria generalmente preguntaba, ¿conoces a Lucene? ¿Conoce el principio del índice invertido? Ya está disponible, porque muchos proyectos ahora usan directamente el motor de búsqueda distribuido basado en Lucene-elasticsearch, conocido como es.

Y ahora la búsqueda distribuida se ha convertido básicamente en la configuración estándar de los sistemas java en la mayoría de las industrias de Internet, y la más popular es es. Cuando es no era popular en los últimos años, todo el mundo generalmente usaba solr. Pero en los últimos dos años, la mayoría de empresas y proyectos han comenzado a cambiar a es.

Por lo tanto, las entrevistas en Internet definitivamente le hablarán acerca de los motores de búsqueda distribuidos, y definitivamente hablarán acerca de E. Si realmente no lo sabe, entonces está realmente fuera.

Si el entrevistador le hace la primera pregunta, generalmente le preguntará, ¿puede presentar el diseño de arquitectura distribuida de es? Solo mire su comprensión básica de la arquitectura de motores de búsqueda distribuidos.

3. Análisis de las preguntas de la entrevista

El concepto de diseño de elasticsearch es un motor de búsqueda distribuido, y la capa inferior en realidad se basa en lucene. La idea central es iniciar múltiples instancias de proceso es en múltiples máquinas para formar un clúster es.

La unidad básica para almacenar datos en es es el índice. Por ejemplo, si desea almacenar algunos datos de pedidos en es, debe crear un índice en es, order_idx, y todos los datos de pedidos se escriben en este índice, un índice Es casi equivalente a una tabla en mysql. índice -> tipo -> mapeo -> documento -> campo.

Index, una tabla en mysql; type, no se puede comparar con mysql. Puede haber varios tipos en un índice. Los campos de cada tipo son los mismos, pero hay algunas pequeñas diferencias.

Por ejemplo, hay un índice, que es el índice de pedidos, que contiene datos de pedidos. Es como decir que construyes una mesa en mysql. Algunos pedidos son pedidos de bienes físicos, como una prenda de vestir o un par de zapatos; algunos pedidos son pedidos de bienes virtuales, como una tarjeta de juego y la recarga de la factura del teléfono. Para los dos pedidos, la mayoría de los campos son los mismos, pero una pequeña cantidad de campos puede ser ligeramente diferente.

Por lo tanto, se crearán dos tipos en el índice de pedidos, uno es el tipo de pedido de producto físico y el otro es el tipo de pedido de producto virtual. La mayoría de los campos de estos dos tipos son iguales y algunos de los campos son diferentes.

En muchos casos, puede haber un tipo en un índice, pero si es cierto que hay varios tipos en un índice, puede pensar que el índice es una tabla de categorías y que cada tipo específico representa un mysql específico. mesa.

Cada tipo tiene un mapeo. Si crees que un tipo es una tabla específica, el índice representa un tipo de varios tipos que pertenecen al mismo tipo. El mapeo es la definición de estructura de la tabla de este tipo. Creas una tabla en MySQL. Definir la estructura de la tabla, qué campos hay y de qué tipo es cada campo. . .

El mapeo representa la definición de la estructura de la tabla de este tipo, que define el nombre de cada campo en este tipo, qué tipo de campo es y varias configuraciones de este campo.

De hecho, usted escribe una pieza de datos en un tipo en el índice, llamado documento. Un documento representa una fila en una tabla en mysql. Cada documento tiene múltiples campos y cada campo representa este documento. El valor de un campo en.

Luego, crea un índice, que se puede dividir en varios fragmentos, y cada fragmento almacena parte de los datos. Entonces, los datos de este fragmento en realidad tienen varias copias de seguridad, es decir, cada fragmento tiene un fragmento principal, responsable de escribir datos, pero hay varios fragmentos de réplica. Una vez que el fragmento principal escribe los datos, los sincronizará con otros fragmentos de réplica.

A través de esta solución de réplica, los datos de cada fragmento tienen varias copias de seguridad. Si una máquina falla, no importa, hay otras copias de datos en otras máquinas. Alta disponibilidad ahora.

Múltiples nodos en el clúster de es elegirán automáticamente un nodo como nodo maestro. Este nodo maestro está realizando algunas tareas de administración, como mantener la extracción de metadatos de índice, responsable de cambiar la extracción de identidad del fragmento primario y el fragmento de réplica, etc.

Si el nodo principal deja de funcionar, se elegirá un nuevo nodo como nodo principal.

Si el nodo no principal deja de funcionar, el nodo principal transferirá la identidad del fragmento principal en ese nodo inferior al fragmento de réplica en otras máquinas. De prisa, si repara la máquina inactiva, después de reiniciar, el nodo principal controlará la distribución de los fragmentos de réplica que faltan, sincronizará los datos modificados posteriores, etc., para que el clúster vuelva a la normalidad.

De hecho, lo anterior es el diseño de arquitectura más básico de elasticsearch como motor de búsqueda distribuido.

3. Flujo de trabajo para escribir y consultar motores de búsqueda distribuidos

1. Preguntas de la entrevista

¿Cuál es el principio de funcionamiento de es escribir datos? ¿Cuál es el principio de funcionamiento de los datos de consulta es?

2. Análisis psicológico de los entrevistadores

Pregunte esto, de hecho, el entrevistador quiere ver si entiende 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 sabe nada, ¿qué puede esperar de usted? no es.

3. Análisis de las preguntas de la entrevista

es escribir proceso de datos

  • El cliente selecciona un nodo para enviar una solicitud, y este nodo es el nodo coordinador (nodo coordinador)
  • Coordinar el nodo, enrutar el documento y reenviar la solicitud al nodo correspondiente (fragmento primario)
  • El fragmento primario en el nodo real procesa la solicitud y luego sincroniza los datos con el nodo de réplica
  • Nodo de coordinación, si se encuentra que el nodo principal y todos los nodos de réplica están resueltos, el resultado de la respuesta se devuelve al cliente.

es leer proceso de datos

Consultar, OBTENER una pieza de datos, escribir un documento, este documento le asignará automáticamente un ID único global, un ID de documento y también un hash y lo enrutará al fragmento primario correspondiente en función del ID de documento. También puede especificar manualmente la identificación del documento, como la identificación del pedido, la identificación del usuario.

Puede consultar por ID de documento, que será hash de acuerdo con el ID de documento para determinar a qué fragmento está asignado el ID de documento en ese momento, y luego consultar desde ese fragmento.

  • El cliente envía una solicitud a cualquier nodo para convertirse en un nodo de coordenadas
  • El nodo de coordenadas enruta el documento y reenvía la solicitud al nodo correspondiente. En este momento, se utiliza el algoritmo de sondeo aleatorio por turnos, y uno de los fragmentos primarios y todas sus réplicas se selecciona aleatoriamente para equilibrar la carga de solicitudes de lectura.
  • El nodo que recibe la solicitud devuelve el documento al nodo de coordenadas
  • El nodo de coordenadas devuelve el documento al cliente.

es proceso de búsqueda de datos

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

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

La búsqueda se basa en palabras clave de Java y se buscan los documentos que contienen Java. es te devolverá:

java真好玩儿啊,java好难学啊
  • El cliente envía una solicitud a un nodo de coordenadas
  • El nodo coordinador reenvía la solicitud de búsqueda al fragmento primario o fragmento de réplica correspondiente a todos los fragmentos.
  • fase de consulta: cada fragmento devuelve sus propios resultados de búsqueda (de hecho, algunos ID de documentos) 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
  • Fase de recuperación: luego, el nodo de coordinación extrae los datos del documento real de cada nodo de acuerdo con el identificador del documento y finalmente lo devuelve al cliente.

El principio subyacente de escribir datos

1) Escriba primero en el búfer y los datos no se pueden buscar cuando estén en el búfer; al mismo tiempo, escriba los datos en el archivo de registro de translog.

2) Si el búfer está casi lleno, o después de un cierto período de tiempo, los datos del búfer se actualizarán a un nuevo archivo de segmento, pero en este momento los datos no ingresan directamente al archivo de disco del archivo de segmento, sino que primero ingresan al caché del sistema operativo. Este proceso es de actualización.

Cada 1 segundo, es escribe los datos en el búfer en un nuevo archivo de segmento, y se genera un nuevo archivo de disco, el archivo de segmento, cada segundo. Este archivo de segmento 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á. Se crea un archivo de segmento vacío cada segundo. Si hay datos en el búfer, la operación de actualización se ejecuta una vez por segundo de forma predeterminada y se vacía un nuevo archivo de segmento. en.

En el sistema operativo, los archivos de disco en realidad tienen algo llamado caché del sistema operativo, caché del sistema operativo, es decir, antes de que los datos se escriban en los archivos de disco, primero ingresará al caché del sistema operativo y primero ingresará a un caché de memoria a nivel del sistema operativo.

Siempre que los datos en el búfer se actualicen y se vacíen en la caché del sistema operativo, significa que se pueden buscar los datos.

¿Por qué se llama es cuasi tiempo real? NRT, casi en tiempo real, casi en tiempo real. 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.

Puede realizar manualmente una operación de actualización a través de restful api o java api de es, es decir, vaciar manualmente los datos en el búfer en la caché del sistema operativo, para que los datos se puedan buscar inmediatamente.

Siempre que los datos se ingresen en la caché del sistema operativo, el búfer se vaciará, ya que no es necesario retener el búfer y los datos se conservarán en el disco en el translog.

3) Siempre que los datos ingresen al caché del sistema operativo, los datos de este archivo de segmento se pueden buscar externamente.

4) Repita los pasos 1 a 3, nuevos datos ingresan continuamente al búfer y translog, y escribe continuamente los datos del búfer en nuevos archivos de segmento uno tras otro.Cada vez que se completa la actualización, el búfer se vacía y el translog permanece. A medida que avanza este proceso, translog se hará cada vez más grande. Cuando el translog alcanza una cierta longitud, se activa la operación de confirmación.

Los datos en el búfer son buenos, se vacían en el caché del sistema operativo cada 1 segundo y luego se vacía el búfer. Por lo tanto, los datos en este búfer siempre se pueden guardar y no llenarán la memoria del proceso es.

Cada vez que se escribe un dato en el búfer, se escribe un registro en el archivo de registro de translog al mismo tiempo. Por lo tanto, el archivo de registro de translog aumenta constantemente. Cuando el archivo de registro de translog sea lo suficientemente grande, se ejecutará la operación de confirmación.

5) El primer paso en la operación de confirmación es actualizar los datos existentes en el búfer al caché del sistema operativo y borrar el búfer.

6) Escriba un punto de confirmación en un archivo de disco, que identifica todos los archivos de segmento correspondientes a este punto de confirmación.

7) Fsync forzosamente todos los datos actuales en la caché del sistema operativo al archivo de disco.

¿Cuál es la función de los archivos de registro de 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 de la memoria se pierden.

Por lo tanto, la operación correspondiente a los datos debe escribirse en un archivo de registro especial, el archivo de registro de translog, una vez que la máquina está inactiva en este momento, cuando se reinicia nuevamente, es automáticamente leerá los datos en el archivo de registro de translog y los restaurará al búfer de memoria y al sistema operativo. Entra en el caché.

Operación de confirmación : 1. Escriba el punto de confirmación; 2. Vacíe a la fuerza los datos de caché del sistema operativo fsync en el disco; 3. Borre el archivo de registro de translog

8) Borre el translog existente, luego reinicie un translog nuevamente, y la operación de confirmación estará completa. De forma predeterminada, la confirmación se ejecutará automáticamente cada 30 minutos, pero si el translog es demasiado grande, la confirmación también se activará. Todo el proceso de confirmación se denomina operación de vaciado. Podemos realizar manualmente la operación de vaciado, que consiste en vaciar todos los datos de la caché del sistema operativo en el archivo de disco.

No se llama operación de confirmación, operación de descarga. La operación de vaciado en es corresponde a todo el proceso de compromiso. También podemos realizar manualmente la operación de vaciado a través de la es api, vaciar manualmente los datos en el caché del sistema operativo fsync en el disco, registrar un punto de confirmación y borrar el archivo de registro de translog.

9) 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. Cuando la máquina cuelga, se perderán 5 segundos de datos. Pero este rendimiento es mejor, perdiendo hasta 5 segundos de datos. También puede configurar translog para que cada operación de escritura deba sincronizarse directamente con el disco, pero el rendimiento será mucho peor.

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

Si desea no perder datos, puede establecer un parámetro, el documento oficial, Baidu. Cada vez que se escribe un dato, se escribe en el búfer y en el translog del disco al mismo tiempo, pero esto hará que el rendimiento de escritura y el rendimiento de escritura disminuyan en un orden de magnitud. Originalmente, podía escribir 2000 entradas en un segundo, pero ahora solo puede escribir 200 entradas en un segundo. Todo es posible.

10) Si se trata de una operación de eliminación, se generará un archivo .del al confirmar, y un documento determinado se marcará como eliminado. Luego, al buscar, sabrá que el documento ha sido eliminado de acuerdo con el archivo .del.

11) Si se trata de una operación de actualización, marque el documento original como un estado eliminado y luego escriba un nuevo dato.

12) Cada vez que se actualiza el búfer, se genera un archivo de segmento, por lo que por defecto es un archivo de segmento por segundo, y habrá más y más archivos de segmento, en este momento la fusión se ejecutará regularmente.

13) Durante cada fusión, varios archivos de segmento se fusionarán en uno. Al mismo tiempo, el documento identificado como eliminado se eliminará físicamente y luego el nuevo archivo de segmento se escribirá en el disco. Aquí, se escribirá un punto de confirmación. Todos los archivos de segmento nuevos, y luego abra el archivo de segmento para buscar y elimine el archivo de segmento antiguo.

El proceso de escritura en es tiene 4 conceptos básicos subyacentes , actualizar, vaciar, translog y fusionar.

Cuando los archivos de segmento alcanzan un cierto nivel, es activará automáticamente la operación de combinación y combinará varios archivos de segmento en un archivo de segmento.

4. Cómo optimizar el rendimiento de las consultas para motores de búsqueda distribuidos en escenarios con miles de millones de niveles de datos

1. Preguntas de la entrevista

¿Cómo se puede mejorar la eficiencia de las consultas cuando la cantidad de datos es grande (miles de millones de niveles)?

2. El análisis psicológico del entrevistador

Hacer esta pregunta es afirmativa, para decirlo sin rodeos, es para ver si realmente lo ha hecho, ¿por qué? Para decirlo claramente, el rendimiento no es tan bueno como cree. Muchas veces la cantidad de datos es grande, especialmente cuando hay cientos de millones de datos, es posible que se quede estupefacto al descubrir cómo ejecutar una búsqueda de 5 a 10 segundos, lo cual es una trampa. Al buscar por primera vez, son 5 ~ 10 segundos, pero luego será más rápido, tal vez unos cientos de milisegundos.

Estás muy confundido, cada usuario será más lento la primera vez que visites, ¿está más atascado?

Entonces, si no ha jugado a es antes, o simplemente ha jugado la demostración por su cuenta, es fácil confundirse cuando se le hace esta pregunta, lo que demuestra que realmente no juega bien.

3. Análisis de las preguntas de la entrevista

Para ser honesto, la optimización del rendimiento de es no tiene parámetros mágicos (diferentes de MySQL), ¿qué quieres decir? Simplemente no espere ajustar un parámetro a voluntad, puede hacer frente a todos los escenarios de rendimiento lento omnipotente. Puede haber escenarios en los que pueda cambiar los parámetros o ajustar la gramática, pero esto definitivamente no es posible en todos los escenarios.

  • El asesino de la optimización del rendimiento: la memoria caché del sistema de archivos

os cache, el caché del sistema operativo. Los datos que escribe en es en realidad se escriben en el archivo de disco, y el sistema operativo almacena automáticamente los datos en el archivo de disco en la caché del sistema operativo.

El motor de búsqueda de es se basa en gran medida en la caché del sistema de archivos subyacente. Si le da más memoria a la caché del sistema de archivos, intente que la memoria pueda acomodar todos los archivos de datos de índice de archivos del segmento indx, entonces básicamente usa la memoria cuando busca. Será muy alto.

La brecha de rendimiento puede ser grande. Podemos echarle un vistazo bajo presión. Si va al disco, generalmente tomará un segundo. El rendimiento de búsqueda definitivamente está en el segundo nivel, 1 segundo, 5 segundos y 10 segundos. Pero si usas la caché del sistema de archivos, es pura memoria, en general, el rendimiento es un orden de magnitud mayor que el del disco, que es básicamente milisegundos, desde unos pocos milisegundos hasta cientos de milisegundos.

Por ejemplo, su nodo es tiene una máquina con 64G de memoria total. Luego, debe darle es jvm heap32G, por lo que el caché restante del sistema de archivos es solo 32g.

Si tiene archivos de datos de índice de 300G en el disco en este momento, ¿cree que su rendimiento puede ser bueno? La memoria de la memoria caché del sistema de archivos es de solo 32 g, una décima parte de los datos se pueden almacenar en la memoria y el resto está en el disco, y luego realiza una operación de búsqueda, la mayoría de las operaciones son desde el disco y el rendimiento es definitivamente pobre.

En el análisis final, debe hacer que el ES funcione mejor. En el mejor de los casos, la memoria de su máquina puede contener al menos la mitad de sus datos totales.

Por ejemplo, si desea almacenar 1T de datos en es, entonces la memoria de la caché del sistema de archivos de sus múltiples máquinas debe combinarse, al menos 512G, al menos la mitad de los casos, la búsqueda se realiza a través de la memoria y el rendimiento generalmente es correcto A unos segundos, 2 segundos, 3 segundos, 5 segundos.

Si en las mejores circunstancias, solo una pequeña cantidad de datos se almacena en es, es decir, los índices que desea buscar, y la memoria está reservada para la caché del sistema de archivos, que es 100G, entonces debe controlarla dentro de 100gb, que es equivalente a la suya. Casi todos los datos se buscan en la memoria y el rendimiento es muy alto, generalmente en 1 segundo.

Ahora puedes estar pensando de nuevo, hay tantos datos, ¿cómo puedo controlar su tamaño?

Por ejemplo, ahora tiene una fila de datos, id nombre edad ... 30 campos. Pero si busca ahora, solo necesita buscar en función de los tres campos de edad del nombre de identificación.

Si escribe estúpidamente todos los campos de una fila de datos en es, se dirá que el 70% de los datos no se utilizan para la búsqueda, y el resultado es que ocupa el espacio del caché del sistema de archivos en la máquina es. Cuanto mayor sea el volumen de datos de los datos de una sola mano , Hará que el sistema de archivos cahce almacene menos datos en caché.

Simplemente escriba en algunos campos para usarlos para la recuperación en es, por ejemplo, simplemente escriba los tres campos de es id name age, y luego puede almacenar otros datos de campo en mysql, generalmente Se recomienda utilizar una arquitectura de es + hbase (más rápida que MySQL bajo una gran cantidad de datos).

De es a buscar según el nombre y la edad, el resultado puede ser 20 doc ids, y luego de acuerdo con el doc id a hbase para consultar los datos completos correspondientes a cada doc id, averiguarlo y luego volver a la interfaz.

Es mejor que escriba datos en es menor o igual, o ligeramente mayor que la capacidad de memoria del caché del sistema de archivos es. Luego, puede tomar 20 ms para recuperar de es, y luego consultar en hbase de acuerdo con la identificación devuelta por es, y verificar 20 piezas de datos, que también pueden tomar 30 ms. Tal vez esté jugando así, y los datos de 1T se ingresan en es cada vez. La consulta es de 5 a 10 segundos, el rendimiento puede ser muy alto ahora, cada consulta es de 50 ms.

elastcisearch reduce la cantidad de datos y solo coloca unos pocos campos clave para ser usados ​​para la búsqueda, y la cantidad de datos escritos en es es lo más cercana posible al caché del sistema de archivos de la máquina es; otros datos que no se usan para la recuperación se colocan en hbase, o mysql.

  • Calentamiento de datos

Si dice que incluso si sigue la solución anterior, la cantidad de datos escritos por cada máquina en el clúster es es más del doble que la caché del sistema de archivos. Por ejemplo, si escribe 60 g de datos en una máquina, la caché del sistema de archivos será de 30 g. , Todavía quedan 30 g de datos en el disco.

Por ejemplo, por ejemplo, en Weibo, puede enviar una gran v, los datos de muchas personas que generalmente miran una gran cantidad de datos a su propio sistema de back-end por adelantado, de vez en cuando, a su propio sistema de back-end para buscar datos calientes, actualizar Vaya a la caché del sistema de archivos. Cuando los usuarios realmente ven los datos calientes más tarde, buscan directamente desde la memoria y es muy rápido.

Para el comercio electrónico, puede programar con anticipación algunos de los productos que se ven con más frecuencia, como el iPhone X, y datos calientes en segundo plano. Puede visitarlos activamente cada 1 minuto y actualizarlos en la memoria caché del sistema de archivos.

Para aquellos datos que cree que son relativamente calientes y a los que las personas acceden a menudo, es mejor crear un subsistema de precalentamiento de caché especial, es decir, para los datos calientes, lo visitará con anticipación de vez en cuando y dejará que los datos ingresen al caché del sistema de archivos. . De esta manera, espero que el desempeño sea mejor la próxima vez cuando otros visiten.

  • Separación de frío y calor

Con respecto a la optimización del rendimiento y la división de datos, dije antes que una gran cantidad de campos que no se buscan se dividen en otro almacenamiento. Esto es similar a la división vertical de la subtabla de la subbase de datos MySQL que se discutirá más adelante.

es puede hacer una división horizontal similar a mysql, es decir, escribir un índice separado para una gran cantidad de datos de baja frecuencia y poco acceso, y luego escribir un índice separado para datos calientes a los que se accede con frecuencia.

Será mejor que escriba datos fríos en un índice y luego escriba datos calientes en otro índice, para asegurarse de que los datos calientes se mantengan en la caché del sistema operativo del sistema de archivos tanto como sea posible después de que se haya calentado. Lavado.

Verá, suponga que tiene 6 máquinas, 2 índices, uno para datos fríos, uno para datos activos y 3 fragmentos para cada índice. 3 máquinas emiten índice de datos de calor; las otras 3 máquinas emiten índice de datos fríos.

Luego, en este caso, está accediendo al índice de datos activos cuando tiene muchos, y los datos activos pueden representar el 10% del volumen total de datos. En este momento, el volumen de datos es muy pequeño, casi todos los cuales se guardan en la caché del sistema de archivos, y puede garantizar el acceso a los datos activos. El rendimiento es muy alto.

Pero para los datos fríos, está en otro índice, y en una máquina que ya no es la misma que el índice de datos calientes, todos no tienen contacto entre sí. Si alguien accede a datos fríos, es posible que haya una gran cantidad de datos en el disco. En este momento, el rendimiento es deficiente y el 10% de las personas acceden a datos fríos; el 90% de las personas acceden a datos calientes.

  • diseño de modelo de documento

Mira las siguientes dos tablas

Formulario de pedido:

id order_code total_price
1  测试订单    5000

Tabla de entrada de pedidos:

id order_id goods_id purchase_count price
1  1        1        2              2000
2  1        2        5              200

En mysql, ambos son

select * from order join order_item on order.id=order_item.order_id where order.id=1
​
1 测试订单 5000 1 1 1 2 2000
1 测试订单 5000 2 1 2 5 200

Cómo jugar en es, la consulta relacional complicada en es, la sintaxis de consulta complicada, trata de no usarla, una vez que se usa, el rendimiento generalmente no es bueno. Al escribir es, crea dos índices, índice de pedido e índice de artículo de pedido.

El índice de pedido contiene id order_code total_price; el índice orderItem, cuando se escribe en él, la operación de unión se completa, id order_code total_price id order_id goods_id purchase_count price.

Escriba en el sistema es java para completar la asociación y escriba los datos asociados directamente en es. Al realizar una búsqueda, no es necesario utilizar la sintaxis de búsqueda es para completar la combinación para buscar.

El diseño del modelo de documento es muy importante. Hay muchas operaciones. No quiero realizar todo tipo de operaciones complicadas y desordenadas al buscar. Hay tantas operaciones que es compatible con es. No considere usar es para hacer cosas que no son fáciles de operar. Si existe una operación de este tipo, intente completarla cuando el modelo de documento esté diseñado y escrito. Además, para algunas operaciones demasiado complejas, como la combinación, la búsqueda anidada, padre-hijo, intente evitarlo y el rendimiento es muy bajo.

Entonces, ¿cómo realizar muchas operaciones complicadas y desordenadas? Dos ideas, al buscar / realizar consultas, necesita realizar algunas operaciones particularmente complejas que están fuertemente relacionadas con el negocio:

  • Al escribir datos, diseñe el modelo, agregue algunos campos y escriba los datos procesados ​​en los campos agregados
  • Encapsule con el programa java usted mismo, qué puede hacer es, use es para hacerlo, busque los datos, hágalo en el programa java, por ejemplo, nosotros, basados ​​en es, usamos java para encapsular algunas operaciones particularmente complejas
  • Optimización del rendimiento de la paginación

La paginación de es es bastante complicada, ¿por qué? Por ejemplo, si tiene 10 datos por página y desea consultar la página número 100, de hecho, los primeros 1000 datos almacenados en cada fragmento se comprobarán en un nodo de coordinación. Si tiene 5 Un fragmento, luego hay 5000 piezas de datos, y luego el nodo de coordinación fusionará y procesará estas 5000 piezas de datos, y luego obtendrá las 10 piezas finales de datos en la página 100.

Distribuido, desea verificar 10 piezas de datos en la página 100. ¿Es imposible decir que de 5 fragmentos, cada fragmento verificará 2 partes de datos? Finalmente, ¿al nodo de coordinación para fusionar en 10 datos? Debe verificar 1000 piezas de datos de cada fragmento, y luego ordenar, filtrar, etc. de acuerdo con sus necesidades, y finalmente paginar nuevamente para obtener los datos en la página 100 adentro.

Cuando se pasa la página, cuanto más se pasa, más datos devuelve cada fragmento y más tiempo tarda el nodo de coordinación en procesar. Muy engañoso. Entonces, cuando use es para paginación, encontrará que cuanto más se gira hacia atrás, más lento es.

Usando es para paginación, las primeras páginas toman decenas de milisegundos, y después de pasar a 10 páginas, cuando hay docenas de páginas, básicamente toma de 5 a 10 segundos encontrar una página de datos. ¿Cómo se debe manejar esta situación?

1) No permite la paginación profunda / el rendimiento de la paginación profunda predeterminada es miserable

Su sistema no le permite pasar esa página profunda, pm, por defecto, cuanto más profundo es el giro, peor es el rendimiento.

2) Similar a los productos recomendados en la aplicación, que se despliegan continuamente página por página

Al igual que en Weibo, puedes usar scroll api y Baidu tú mismo.

Scroll generará una instantánea de todos los datos al mismo tiempo y luego se moverá a través del cursor cada vez que pase la página para obtener la página siguiente y la página siguiente. El rendimiento será mucho mayor que el rendimiento de paginación mencionado anteriormente.

Para resolver este problema, puede considerar el uso de desplazamiento para el procesamiento. El principio del desplazamiento es en realidad mantener una instantánea de los datos, y luego, dentro de un cierto período de tiempo, si continúa deslizándose hacia atrás para pasar la página, es similar a si actualmente está navegando en Weibo. , Sigue refrescando y volteando hacia abajo. Luego use el desplazamiento para obtener continuamente la siguiente página de datos a través del cursor.Este rendimiento es muy alto, mucho mejor que el cambio de página real de e.

Pero el único punto es que esto es adecuado para escenas que son similares a las páginas desplegables de microblogs y no pueden saltar a ninguna página a voluntad. Al mismo tiempo, este desplazamiento es para mantener una instantánea de los datos durante un período de tiempo, y debe asegurarse de que los usuarios no continúen pasando páginas y vueltas durante varias horas.

No importa cuántas páginas se pasen, el rendimiento es básicamente de milisegundos.

Debido a que la API de desplazamiento solo puede retroceder página por página, no se puede decir. Primero vaya a la página 10, luego vaya a la página 120 y vuelva a la página 58. No puede saltar páginas al azar. Así que ahora muchos productos no le permiten pasar las páginas a voluntad. Las aplicaciones y algunos sitios web lo hacen, solo puede desplazarse hacia abajo y pasar las páginas una por una.

V. Despliegue de motores de búsqueda en el entorno de producción

1. Preguntas de la entrevista

¿Cuál es la arquitectura de implementación del clúster de producción de es? ¿Cuál es la cantidad aproximada de datos para cada índice? ¿Cuántos fragmentos hay para cada índice?

2. El análisis psicológico del entrevistador

Esta pregunta, que incluye el siguiente redis, habla sobre es, redis, subtabla de la subbase de datos mysql y otras tecnologías, ¡se deben hacer entrevistas! ¿Cómo se implementó su entorno de producción? Para decirlo sin rodeos, esta pregunta no tiene contenido técnico, ¡solo depende de si lo ha hecho en un entorno de producción real!

Es posible que algunas personas nunca lo hayan hecho en un entorno de producción, no hayan implementado realmente un clúster es con una máquina en línea, no hayan jugado realmente y no hayan importado decenas o incluso cientos de millones de datos al clúster es. Es posible que no conozca los detalles de algunos de los proyectos de producción que contiene.

Si ha jugado la demostración usted mismo y no ha tocado un clúster ES real, entonces puede estar confundido en este momento, pero no se confunda. Debe responder a esta pregunta a la ligera, indicando que efectivamente lo ha hecho.

3. Análisis de las preguntas de la entrevista

De hecho, este problema está bien. Si lo ha hecho, entonces debe conocer la situación real de su clúster de producción. ¿Cuántas máquinas se han implementado? ¿Cuántos índices hay? ¿Cuántos datos tiene cada índice? ¿Cuántos fragmentos se dan para cada índice? ¡Debes saber!

Pero si no lo ha hecho antes, no lo haga falso. De todos modos, es solo un número. Solo recuérdelo. Luego dígalo brevemente.

  • En el clúster de producción es, implementamos 5 máquinas, cada máquina tiene 6 núcleos 64G y la memoria total del clúster es 320G
  • Los datos incrementales diarios de nuestro clúster es son aproximadamente 20 millones, los datos incrementales diarios son aproximadamente 500 MB y los datos incrementales mensuales son aproximadamente 600 millones, 15G. El sistema ha estado funcionando durante varios meses y la cantidad total de datos en el clúster es es de aproximadamente 100G.
  • Actualmente hay 5 índices en línea (combinados con su propio negocio para ver qué datos tiene puede poner), el volumen de datos de cada índice es de aproximadamente 20G, por lo que dentro de este volumen de datos, asignamos cada índice Hay 8 fragmentos, 3 fragmentos más que los 5 fragmentos predeterminados.

Probablemente solo diga eso.

Supongo que te gusta

Origin blog.csdn.net/qq_22172133/article/details/104195674
Recomendado
Clasificación