Fragmentos y réplicas en Elasticsearch

Resuelto LuckyLuke asked hace 11 años • 9 respuestas

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

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

LuckyLuke avatar Mar 29 '13 07:03 LuckyLuke
Aceptado

Intentaré explicarte con un ejemplo real ya que la respuesta y las respuestas que obtuviste no parecen ayudarte.

Cuando descarga elasticsearch y lo inicia, crea un nodo de 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 también se crea automáticamente cuando indexa el primer documento), puede definir de cuántos fragmentos estará compuesto. Si no especifica un número, tendrá el número predeterminado de fragmentos: 5 primarios. ¿Qué significa?

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

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

Cada vez que indexe un documento, elasticsearch decidirá qué fragmento principal 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 procesamiento paralelo en una sola máquina, pero el punto es que si iniciamos otra instancia de elasticsearch en el mismo clúster, los fragmentos se distribuirán de manera uniforme en el clúster.

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

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

Dado que los dos fragmentos restantes se movieron al nodo recién iniciado:

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

¿Por qué pasó esto? Porque elasticsearch es un motor de búsqueda distribuido y de esta manera 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 ahí 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, 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 principal se copiará a otro fragmento que contendrá los mismos datos. Las réplicas se utilizan para aumentar el rendimiento de la búsqueda y para la conmutación por error. Nunca se asignará un fragmento de réplica en el mismo nodo donde está el principal relacionado (sería más o menos como colocar 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 ocurre con el segundo nodo, que contendrá una copia de los fragmentos primarios del primer nodo:

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

Con una configuración como esta, si un nodo deja de funcionar, aún tendrá el índice completo. 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 hizo "number_of_replicas":1, las réplicas ya no se pueden asignar ya que nunca se asignan en el mismo nodo donde está su principal. Es por eso que tendrá 5 fragmentos sin asignar, las réplicas y el estado del clúster será YELLOWen lugar de GREEN. No se pierden 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 se había ido, 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 es necesario sincronizarlo 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 será GREEN.

Espero que esto te aclare las cosas.

javanna avatar Mar 29 '2013 15:03 javanna

Casco:

  1. Al ser un servidor de búsqueda distribuido, ElasticSearchutiliza un concepto llamado Sharddistribuir 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 unsingle 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 desde un solo nodo.
  4. Para solucionar este problema, Elasticsearchofrece la posibilidad 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 en shardsy los fragmentos se asignan en nodessucluster
  7. A medida que clustercrece o se reduce, Elasticsearchlos fragmentos migrarán automáticamente entre ellos nodespara que clusterpermanezcan equilibrados.
  8. Un fragmento puede ser a primary shardo a replica shard.
  9. Cada documento en su índice pertenece a single primary shard, por lo que la cantidad de fragmentos primarios que tiene determina la cantidad máxima de datos que su índice puede contener.
  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 del hardware.
  2. Elasticsearchle permite hacer una o más copias de los fragmentos de su índice en lo que se denominan fragmentos de réplica, o replicaspara abreviar.
  3. Un indextambién se puede replicar cero (es decir, sin 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. Una vez creado el índice, puede cambiar el número de réplicas dinámicamente en cualquier momento, excepto cannot change the number of shards después.
  6. De forma predeterminada, a cada índice Elasticsearchse le asignan 5 fragmentos primarios, 1 replicalo que 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 avatar Apr 18 '2018 06:04 Vino

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 replica count == 1significa que el clúster debe tener la copia principal y una copia replicada del fragmento disponibles para estar en estado verde.

Para que se creen réplicas, debe tener al menos 2 nodos en su clúster.

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

ppearcy avatar Mar 29 '2013 05:03 ppearcy