Fragmentos y réplicas en Elasticsearch

303

Estoy tratando de entender qué fragmento y réplica hay en Elasticsearch, pero no pude entenderlo. Si descargo Elasticsearch y ejecuto el script, por lo que sé, he comenzado un clúster con un solo nodo. Ahora este nodo (mi PC) tiene 5 fragmentos (?) Y algunas réplicas (?).

¿Qué son? ¿Tengo 5 duplicados del índice? Si es así, ¿por qué? Podría necesitar alguna explicación.

LuckyLuke
fuente
1
Eche un vistazo aquí: stackoverflow.com/questions/12409438/…
javanna
Pero, sin embargo, la pregunta sigue sin respuesta.
LuckyLuke
Pensé que la respuesta que obtuviste y la respuesta vinculada anterior debería aclarar las cosas. ¿Qué no está claro entonces?
javanna
No entiendo qué es un fragmento y sus réplicas. No entiendo por qué hay muchos fragmentos y réplicas en un nodo.
LuckyLuke
1
Cada índice se puede dividir en fragmentos para poder distribuir datos. El fragmento es la parte atómica de un índice, que se puede distribuir sobre el clúster si agrega más nodos.
javanna

Respuestas:

966

Trataré de explicar con un ejemplo real, ya que la respuesta y las respuestas que recibiste no parecen ayudarte.

Cuando descarga elasticsearch y lo inicia, crea un nodo elasticsearch que intenta unirse a un clúster existente si está disponible o crea uno nuevo. Supongamos que creó su propio clúster nuevo con un solo nodo, el que acaba de iniciar. No tenemos datos, por lo tanto, necesitamos crear un índice.

Cuando crea un índice (un índice se crea automáticamente cuando indexa también el primer documento), puede definir cuántos fragmentos estará compuesto. Si no especifica un número, tendrá el número predeterminado de fragmentos: 5 primarios. Qué significa eso?

Significa que elasticsearch creará 5 fragmentos primarios que contendrán sus datos:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Cada vez que indexa un documento, Elasticsearch decidirá qué fragmento primario debe contener ese documento y lo indexará allí. Los fragmentos primarios no son una copia de los datos, ¡son los datos! Tener múltiples fragmentos ayuda a aprovechar el procesamiento paralelo en una sola máquina, pero el punto es que si comenzamos otra instancia de Elasticsearch en el mismo clúster, los fragmentos se distribuirán de manera uniforme sobre el clúster.

El nodo 1 contendrá, por ejemplo, solo tres fragmentos:

 ____    ____    ____ 
| 1  |  | 2  |  | 3  |
|____|  |____|  |____|

Como los dos fragmentos restantes se han movido al nodo recién iniciado:

 ____    ____
| 4  |  | 5  |
|____|  |____|

¿Por qué pasó esto? Debido a que elasticsearch es un motor de búsqueda distribuido y de esta forma, puede utilizar múltiples nodos / máquinas para administrar grandes cantidades de datos.

Cada índice de Elasticsearch se compone de al menos un fragmento primario, ya que es donde se almacenan los datos. Sin embargo, cada fragmento tiene un costo, por lo tanto, si tiene un solo nodo y no hay un crecimiento previsible, simplemente quédese con un único fragmento primario.

Otro tipo de fragmento es una réplica. El valor predeterminado es 1, lo que significa que cada fragmento primario se copiará en otro fragmento que contendrá los mismos datos. Las réplicas se utilizan para aumentar el rendimiento de búsqueda y para la conmutación por error. Nunca se asignará un fragmento de réplica en el mismo nodo donde está el primario relacionado (sería casi como poner una copia de seguridad en el mismo disco que los datos originales).

Volviendo a nuestro ejemplo, con 1 réplica tendremos el índice completo en cada nodo, ya que se asignarán 2 fragmentos de réplica en el primer nodo y contendrán exactamente los mismos datos que los fragmentos primarios en el segundo nodo:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4R |  | 5R |
|____|  |____|  |____|  |____|  |____|

Lo mismo para el segundo nodo, que contendrá una copia de los fragmentos primarios en el primer nodo:

 ____    ____    ____    ____    ____
| 1R |  | 2R |  | 3R |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Con una configuración como esta, si un nodo se cae, todavía tiene todo el índice. Los fragmentos de réplica se convertirán automáticamente en primarios y el clúster funcionará correctamente a pesar del fallo del nodo, de la siguiente manera:

 ____    ____    ____    ____    ____
| 1  |  | 2  |  | 3  |  | 4  |  | 5  |
|____|  |____|  |____|  |____|  |____|

Como lo ha hecho "number_of_replicas":1, las réplicas ya no se pueden asignar, ya que nunca se asignan en el mismo nodo donde está su primario. Es por eso que tendrá 5 fragmentos no asignados, las réplicas y el estado del clúster será en YELLOWlugar de GREEN. Sin pérdida de datos, pero podría ser mejor ya que algunos fragmentos no se pueden asignar.

Tan pronto como se haga una copia de seguridad del nodo que quedaba, se unirá nuevamente al clúster y las réplicas se asignarán nuevamente. El fragmento existente en el segundo nodo se puede cargar, pero deben sincronizarse con los otros fragmentos, ya que las operaciones de escritura probablemente ocurrieron mientras el nodo estaba inactivo. Al final de esta operación, el estado del clúster se convertirá GREEN.

Espero que esto te aclare las cosas.

javanna
fuente
57
Impresionante explicación, ¡gracias por tomarte tu tiempo para armarlo! :)
LuckyLuke
66
Esa es, con mucho, la mejor explicación del concepto de fragmento / réplica. Muchas gracias :)
Frank Förster
1
@javanna Gran explicación, ¿puedes hablar un poco sobre los clústeres múltiples y cómo funcionan?
raffian
3
¿Puedo sugerirle que explique más qué sucedería cuando el nodo que cayó vuelva a aparecer nuevamente?
c0dem4gnetic
1
¿Enseñas? Porque deberías totalmente. Tú Molas. Pero como preguntó @Animesh Pandey, también tengo curiosidad por saber qué sucede con dos réplicas, o 1 réplica con 3 nodos.
frostymarvelous
24

Un índice se divide en fragmentos para distribuirlos y escalarlos.

Las réplicas son copias de los fragmentos y proporcionan confiabilidad si se pierde un nodo. A menudo hay confusión en este número porque el conteo de réplicas == 1 significa que el clúster debe tener la copia principal y una copia replicada del fragmento disponible para estar en estado verde.

Para poder crear réplicas, debe tener al menos 2 nodos en su clúster.

Puede encontrar las definiciones aquí más fáciles de entender: http://www.elasticsearch.org/guide/reference/glossary/

Saludos cordiales, Paul

propiedad
fuente
Esto es lo que dice cada documento: el índice se divide en fragmentos, pero ¿qué contiene realmente el índice?
Alex Pryiomka
@AlexPryiomka, el índice contiene datos
Gaurav
Entonces, ¿es básicamente lo mismo que la replicación de partición en el mundo kafka?
Beatrice
19

Si realmente no te gusta verlo amarillo. puede establecer el número de réplicas en cero:

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

Tenga en cuenta que debe hacer esto solo en su cuadro de desarrollo local.

jyu
fuente
10

Casco:

  1. Al ser un servidor de búsqueda distribuido, ElasticSearchutiliza el concepto llamado Shardpara distribuir documentos de índice en todos los nodos.
  2. Un indexpotencialmente puede almacenar una gran cantidad de datos que pueden exceder los límites de hardware de unasingle node
  3. Por ejemplo, un índice único de mil millones de documentos que ocupan 1 TB de espacio en disco puede no caber en el disco de un solo nodo o puede ser demasiado lento para atender solicitudes de búsqueda de un solo nodo solo.
  4. Para resolver este problema, Elasticsearchproporciona la capacidad de subdividir su índice en varias partes llamadas shards.
  5. Cuando crea un índice, simplemente puede definir el número shards que desea.
  6. Documentsse almacenan shardsy los fragmentos se asignan nodesen sucluster
  7. A medida que clustercrezca o se reduzca, Elasticsearchmigrará automáticamente fragmentos entre ellos nodespara que los clusterrestos se equilibren.
  8. Un fragmento puede ser a primary shardo a replica shard.
  9. Cada documento en su índice pertenece a un single primary shard, por lo que el número de fragmentos primarios que tiene determina la cantidad máxima de datos que puede contener su índice
  10. A replica shardes solo una copia de un fragmento primario.

Réplica:

  1. Replica shardes la copia de primary Shard, para evitar la pérdida de datos en caso de falla de hardware.
  2. Elasticsearchle permite hacer una o más copias de los fragmentos de su índice en lo que se denomina fragmentos de réplica, o replicaspara abreviar.
  3. También indexse puede replicar un cero (lo que significa que no hay réplicas) o más veces.
  4. Las number of shardsréplicas y se pueden definir por índice en el momento en que se crea el índice.
  5. Después de crear el índice, puede cambiar la cantidad de réplicas dinámicamente en cualquier momento, excepto cannot change the number of shards después de los hechos.
  6. De manera predeterminada, a cada índice Elasticsearchse le asignan 5 fragmentos primarios y 1 replicaeso significa que si tiene al menos dos nodos en su clúster, su índice tendrá 5 fragmentos primarios y otros 5 fragmentos de réplica (1 réplica completa) para un total de 10 fragmentos por índice.
Vino
fuente
6

Un índice se divide en fragmentos para distribuirlos y escalarlos.

Las réplicas son copias de los fragmentos.

Un nodo es una instancia en ejecución de búsqueda elástica que pertenece a un clúster.

Un clúster consta de uno o más nodos que comparten el mismo nombre de clúster. Cada clúster tiene un único nodo maestro que el clúster elige automáticamente y que puede reemplazarse si el nodo maestro actual falla.

Pruthvi Kumar
fuente
Tengo tres AWS ec2instancias, cada una tiene elasticsearch instalado. Significa que tenemos tres nodos aquí? Si todos estos nodos tienen el mismo cluster.name: testconjunto de propiedades, ¿formará un nombre de Clúster testque tenga tres nodos?
TheCoder
5

Explicaré esto usando escenarios de palabras reales. Imagina que estás ejecutando un sitio web de comercio electrónico. A medida que se vuelve más popular, más vendedores y productos agregan a su sitio web. Te darás cuenta de que la cantidad de productos que necesitas indexar ha crecido y es demasiado grande para caber en un disco duro de un nodo. Incluso si cabe en el disco duro, realizar una búsqueda lineal a través de todos los documentos en una máquina es extremadamente lento. un índice en un nodo no aprovechará la configuración del clúster distribuido en el que trabaja el elasticsearch.

Entonces elasticsearch divide los documentos en el índice a través de múltiples nodos en el clúster. Cada división del documento se llama fragmento. Cada nodo que lleve un fragmento de un documento tendrá solo un subconjunto del documento. supongamos que tiene 100 productos y 5 fragmentos, cada fragmento tendrá 20 productos. Esta división de datos es lo que hace posible la búsqueda de baja latencia en Elasticsearch. La búsqueda se realiza en paralelo en múltiples nodos. Los resultados se agregan y devuelven. Sin embargo, los fragmentos no proporcionan tolerancia a fallas. Es decir, si algún nodo que contiene el fragmento está inactivo, el estado del clúster se vuelve amarillo. Lo que significa que algunos de los datos no están disponibles.

Para aumentar la tolerancia a fallas, las réplicas entran en escena. Por defecto, la búsqueda elástica crea una única réplica de cada fragmento. Estas réplicas siempre se crean en otro nodo donde el fragmento primario no reside. Entonces, para que el sistema sea tolerante a fallas, es posible que deba aumentar la cantidad de nodos en su clúster y también depende de la cantidad de fragmentos de su índice. La fórmula general para calcular el número de nodos requeridos en base a réplicas y fragmentos es "número de nodos = número de fragmentos * (número de réplicas + 1)". La práctica estándar es tener al menos una réplica para tolerancia a fallas.

Configurar el número de fragmentos es una operación estática, lo que significa que debe especificarlo cuando crea un índice. Cualquier cambio después de eso requerirá una reindexación completa de los datos y llevará tiempo. Pero, configurar el número de réplicas es una operación dinámica y también se puede hacer en cualquier momento después de la creación del índice.

Puede configurar el número de fragmentos y réplicas para su índice con el siguiente comando.

curl -XPUT 'localhost:9200/sampleindex?pretty' -H 'Content-Type: application/json' -d '
{
  "settings":{
    "number_of_shards":2,
    "number_of_replicas":1
  }
}'
Keerthikanth Chowdary
fuente
3

No es una respuesta, sino otra referencia de conceptos básicos para ElasticSearch, y creo que son bastante claros como complemento de la respuesta de @javanna.

Fragmentos

Un índice puede almacenar potencialmente una gran cantidad de datos que pueden exceder los límites de hardware de un solo nodo. Por ejemplo, un índice único de mil millones de documentos que ocupan 1 TB de espacio en disco puede no caber en el disco de un solo nodo o puede ser demasiado lento para atender solicitudes de búsqueda de un solo nodo solo.

Para resolver este problema, Elasticsearch ofrece la capacidad de subdividir su índice en varias piezas llamadas fragmentos. Cuando crea un índice, simplemente puede definir la cantidad de fragmentos que desea. Cada fragmento es en sí mismo un "índice" completamente funcional e independiente que se puede alojar en cualquier nodo del clúster.

El fragmentación es importante por dos razones principales:

  • Le permite dividir / escalar horizontalmente su volumen de contenido.
  • Le permite distribuir y paralelizar operaciones a través de fragmentos (potencialmente en múltiples nodos) aumentando así el rendimiento / rendimiento .

Réplicas

En un entorno de red / nube donde se pueden esperar fallas en cualquier momento, es muy útil y muy recomendable tener un mecanismo de conmutación por error en caso de que un fragmento / nodo de alguna manera se desconecte o desaparezca por cualquier razón. Con este fin, Elasticsearch le permite hacer una o más copias de los fragmentos de su índice en lo que se denomina fragmentos de réplica, o réplicas para abreviar.

La replicación es importante por dos razones principales:

  • Proporciona alta disponibilidad en caso de que falle un fragmento / nodo. Por este motivo, es importante tener en cuenta que un fragmento de réplica nunca se asigna en el mismo nodo que el fragmento original / primario desde el que se copió.
  • Le permite escalar su volumen de búsqueda / rendimiento ya que las búsquedas se pueden ejecutar en todas las réplicas en paralelo.
Hearen
fuente
1

En ElasticSearch, en el nivel superior indexamos los documentos en índices. Cada índice tiene un número de fragmentos que distribuye internamente los datos y dentro de los fragmentos existen los segmentos de Lucene, que es el almacenamiento central de los datos. Entonces, si el índice tiene 5 fragmentos, significa que los datos se han distribuido entre los fragmentos y no existen los mismos datos en los fragmentos.

Cuidado con el video que explica el núcleo de ES https://www.youtube.com/watch?v=PpX7J-G2PEo

Artículo sobre índices múltiples o fragmentos múltiples ¿ Búsqueda elástica, índices múltiples versus un índice y tipos para diferentes conjuntos de datos?

Prakash Ghanshani
fuente
1

Elasticsearch es magníficamente escalable y todo el crédito se destina a su arquitectura distribuida. Se hace posible debido a Sharding. Ahora, antes de seguir adelante, consideremos un caso de uso simple y muy común. Supongamos que tiene un índice que contiene una gran cantidad de documentos, y por simplicidad, considere que el tamaño de ese índice es de 1 TB (es decir, la suma de tamaños de cada documento en ese índice es de 1 TB ) Además, suponga que tiene dos nodos, cada uno con 512 GB de espacio disponible para almacenar datos. Como se puede ver claramente, nuestro índice completo no puede almacenarse en ninguno de los dos nodos disponibles y, por lo tanto, debemos distribuir nuestro índice entre estos nodos.

En casos como este donde el tamaño de un índice excede los límites de hardware de un solo nodo, Sharding viene al rescate. Sharding resuelve este problema dividiendo los índices en piezas más pequeñas y estas piezas se denominan fragmentos.

Ayush Jain
fuente
0

En sus términos más simples, shardno es más que una parte de un índice que se almacena en el disco dentro de una carpeta separada:

Fragmentos de búsqueda elástica

Esta captura de pantalla muestra todo el directorio de Elasticsearch.

Como puede ver, todos los datos van al datadirectorio.

Al inspeccionar el índice C-mAfLltQzuas72iMiIXNw, vemos que tiene cinco fragmentos (carpetas 0para 4).

Por otro lado, el JH_A8PgCRj-GK0GeQ0limwíndice tiene solo un fragmento ( 0carpeta).

Fragmentos de búsqueda elástica

Las privistas el número total de fragmentos.

Ahmad
fuente