Fragmentos y réplicas en Elasticsearch

Estoy tratando de entender qué fragmento y réplica está en Elasticsearch, pero no logro entenderlo. Si descargo Elasticsearch y ejecuto el script, a partir de lo que sé, comencé 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.

Trataré de explicar con un ejemplo real ya que la respuesta y las respuestas que recibes 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. Digamos que usted creó su propio clúster 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 al indexar también el primer documento) puede definir la cantidad de fragmentos de los que estará compuesto. Si no especifica un número, tendrá la cantidad predeterminada de fragmentos: 5 primarios. Qué significa eso?

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

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

Cada vez que indexe 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 varios fragmentos ayuda a aprovechar el parallel processing en una sola máquina, pero el punto es que si iniciamos otra instancia de búsqueda elástica 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 manera puede hacer uso de múltiples nodos / máquinas para administrar grandes cantidades de datos.

Cada índice 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 tiene un crecimiento previsible, simplemente quédese con un solo fragmento primario.

Otro tipo de fragmento es una réplica. El valor predeterminado es 1, lo que significa que cada fragmento primario se copiará a otro fragmento que contendrá los mismos datos. Las réplicas se utilizan para boost el rendimiento de la búsqueda y para el fail-over. Nunca se asignará un fragmento de réplica en el mismo nodo donde está el primario relacionado (sería 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 3 fragmentos de réplica se asignarán en el primer nodo y contendrán exactamente los mismos datos que los 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 falla, todavía tiene el índice completo. Los fragmentos de réplica se convertirán automáticamente en primarios y el clúster funcionará correctamente a pesar de la falla del nodo, de la siguiente manera:

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

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

Tan pronto como el nodo que ha salido vuelva a estar activo, volverá a unirse 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 volverá GREEN .

Espero que esto aclare las cosas para ti.

Si realmente no te gusta verlo amarillo. puede establecer que la cantidad de réplicas sea cero:

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

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

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

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

Para que se creen 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

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

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 falla el nodo maestro actual.

En ElasticSearch, en el nivel superior indexamos los documentos en índices. Cada índice tiene una cantidad de fragmentos que distribuye internamente los datos y dentro de los fragmentos se encuentran los segmentos Lucene, que es el almacenamiento central de los datos. Entonces, si el índice tiene 5 fragmentos, significa que los datos se han distribuido a través de los fragmentos y no existen los mismos datos en los fragmentos.

Tenga 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 frente a un índice y tipos para diferentes conjuntos de datos?

Casco:

  1. Servidor de búsqueda distribuido, ElasticSearch utiliza el concepto llamado Shard para distribuir documentos de índice en todos los nodos.
  2. Un index puede potencialmente almacenar una gran cantidad de datos que pueden exceder los límites de hardware de un single node
  3. Por ejemplo, un único índice de mil millones de documentos que ocupan 1 TB de espacio en disco puede no ajustarse en el disco de un solo nodo o ser demasiado lento para atender solicitudes de búsqueda desde un solo nodo.
  4. Para resolver este problema, Elasticsearch proporciona la capacidad de subdividir su índice en varias piezas llamadas shards .
  5. Cuando crea un índice, puede simplemente definir la cantidad de shards que desea.
  6. Documents se almacenan en shards y los fragmentos se asignan a los nodes de su cluster
  7. A medida que su cluster crece o se reduce, Elasticsearch migrará automáticamente los fragmentos entre los nodes para que el cluster permanezca equilibrado.
  8. Un fragmento puede ser un primary shard o un replica shard .
  9. Cada documento en su índice pertenece a un single primary shard , por lo que la cantidad de fragmentos primarios que tiene determina la cantidad máxima de datos que puede contener su índice
  10. Un replica shard es solo una copia de un fragmento primario.

Réplica:

  1. Replica shard es la copia de primary Shard , para evitar la pérdida de datos en caso de falla del hardware.
  2. Elasticsearch permite hacer una o más copias de los fragmentos de su índice en lo que se llaman réplicas de fragmentos, o replicas para abreviar.
  3. Un index también se puede replicar cero (es decir, sin réplicas) o más veces.
  4. La number of shards y réplicas se puede definir por índice en el momento en que se crea el índice.
  5. Después de crear el índice, puede cambiar el número de réplicas dinámicamente en cualquier momento, pero no cannot change the number of shards después de los hechos.
  6. De forma predeterminada, a cada índice en Elasticsearch se le asignan 5 fragmentos primarios y 1 replica que significa que si tiene al menos dos nodos en el 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.

Explicaré esto usando escenarios de palabras reales. Imagina que eres un sitio web de comercio electrónico. A medida que te vuelves más popular, más vendedores y productos agregan a tu sitio web. Se dará cuenta de que la cantidad de productos que puede necesitar para indexar ha crecido y que es demasiado grande para caber en un disco duro de un nodo. Incluso si se adapta al 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 funciona elasticsearch.

Entonces elasticsearch divide los documentos en el índice en múltiples nodos en el clúster. Cada división del documento se llama fragmento. Cada nodo que lleva una pieza de un documento tendrá solo un subconjunto del documento. supongamos que tiene 100 productos y 5 fragmentos, cada fragmento tendrá 20 productos. Esta fusió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 un 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 boost las réplicas de tolerancia a fallas, ingrese a la imagen. Mediante la búsqueda elástica dearea crea una única réplica de cada fragmento. Estas réplicas siempre se crean en otro nodo donde el fragmento primario no reside. Por lo tanto, para que el sistema sea tolerante a fallas, es posible que tenga que boost la cantidad de nodos en su clúster y también depende del número de fragmentos de su índice. La fórmula general para calcular el número de nodos necesarios en función de las réplicas y los 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 la tolerancia a fallas.

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

puede configurar la cantidad 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 } } '