Fragmentos e réplicas no Elasticsearch

303

Estou tentando entender o que é fragmento e réplica no Elasticsearch, mas não consegui entender. Se eu baixar o Elasticsearch e executar o script, pelo que sei, iniciei um cluster com um único nó. Agora, este nó (meu PC) possui 5 fragmentos (?) E algumas réplicas (?).

Quais são eles, tenho 5 duplicatas do índice? Se sim, por quê? Eu poderia precisar de alguma explicação.

LuckyLuke
fonte
1
Dê uma olhada aqui: stackoverflow.com/questions/12409438/…
javanna 29/03
Mas, no entanto, a questão permanece sem resposta.
luckyluke
Eu pensei que a resposta que você obteve e a resposta vinculada acima deveriam esclarecer as coisas. O que não está claro então?
Javanna # 29/13
Não entendo o que é um fragmento e réplicas. Não entendo por que existem muitos shards e réplicas em um nó.
LuckyLuke
1
Todo índice pode ser dividido em shards para poder distribuir dados. O shard é a parte atômica de um índice, que pode ser distribuído pelo cluster se você adicionar mais nós.
Javanna

Respostas:

966

Tentarei explicar com um exemplo real, pois as respostas e respostas que você recebeu não parecem ajudá-lo.

Quando você baixa o elasticsearch e o inicia, cria um nó elasticsearch que tenta ingressar em um cluster existente, se disponível, ou cria um novo. Digamos que você criou seu próprio novo cluster com um único nó, aquele que você acabou de iniciar. Não temos dados, portanto, precisamos criar um índice.

Quando você cria um índice (um índice é criado automaticamente quando você também indexa o primeiro documento), você pode definir de quantos shards ele será composto. Se você não especificar um número, ele terá o número padrão de shards: 5 primárias. O que isso significa?

Isso significa que a elasticsearch criará 5 shards principais que conterão seus dados:

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

Toda vez que você indexa um documento, a elasticsearch decide qual fragmento primário deve conter esse documento e o indexa lá. Os shards primários não são uma cópia dos dados, são os dados! Ter vários shards ajuda a tirar proveito do processamento paralelo em uma única máquina, mas o ponto principal é que, se iniciarmos outra instância de elasticsearch no mesmo cluster, os shards serão distribuídos de maneira uniforme pelo cluster.

O nó 1 conterá, por exemplo, apenas três fragmentos:

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

Desde que os dois shards restantes foram movidos para o nó recém-iniciado:

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

Por que isso acontece? Como o elasticsearch é um mecanismo de pesquisa distribuído, você pode usar vários nós / máquinas para gerenciar grandes quantidades de dados.

Todo índice de pesquisa elástica é composto de pelo menos um fragmento primário, pois é onde os dados são armazenados. Porém, todo shard tem um custo, portanto, se você tiver um único nó e nenhum crescimento previsível, fique com um único shard primário.

Outro tipo de fragmento é uma réplica. O padrão é 1, o que significa que todo shard primário será copiado para outro shard que conterá os mesmos dados. As réplicas são usadas para aumentar o desempenho da pesquisa e o failover. Um shard de réplica nunca será alocado no mesmo nó em que o primário relacionado está (seria como colocar um backup no mesmo disco que os dados originais).

De volta ao nosso exemplo, com 1 réplica, teremos o índice inteiro em cada nó, pois dois shards de réplica serão alocados no primeiro nó e conterão exatamente os mesmos dados que os shards primários no segundo nó:

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

O mesmo para o segundo nó, que conterá uma cópia dos shards primários no primeiro nó:

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

Com uma configuração como esta, se um nó cair, você ainda terá o índice inteiro. Os shards de réplica se tornarão primários automaticamente e o cluster funcionará corretamente, apesar da falha do nó, da seguinte maneira:

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

Como você possui "number_of_replicas":1, as réplicas não podem mais ser atribuídas, pois nunca são alocadas no mesmo nó onde está o principal. É por isso que você terá 5 shards não atribuídos, as réplicas e o status do cluster em YELLOWvez deGREEN . Sem perda de dados, mas poderia ser melhor, pois alguns shards não podem ser atribuídos.

Assim que o nó restante for copiado, ele ingressará no cluster novamente e as réplicas serão atribuídas novamente. O shard existente no segundo nó pode ser carregado, mas eles precisam ser sincronizados com os outros shards, pois as operações de gravação provavelmente ocorreram enquanto o nó estava inoperante. No final desta operação, o status do cluster se tornará GREEN.

Espero que isso esclareça as coisas para você.

javanna
fonte
57
Explicação impressionante, obrigado por dedicar seu tempo para montá-lo! :)
LuckyLuke 29/03
6
Essa é de longe a melhor explicação do conceito de fragmento / réplica. Muito obrigado :)
Frank Förster
1
@ javanna Ótima explicação, pode falar um pouco sobre vários clusters e como eles funcionam?
raffian
3
Posso sugerir que explique melhor o que aconteceria quando o nó desativado voltasse a funcionar?
C0dem4gnetic #
1
Você ensina? Porque você totalmente deveria. Você é demais. Mas, como @Animesh Pandey perguntou, também estou curioso para saber o que acontece com duas réplicas, ou uma réplica com três nós.
Frostymarvelous
24

Um índice é dividido em shards para distribuí-los e escalar.

As réplicas são cópias dos shards e fornecem confiabilidade se um nó for perdido. Freqüentemente há confusão nesse número porque o número de réplicas == 1 significa que o cluster deve ter a cópia principal e replicada do shard disponível para estar no estado verde.

Para que as réplicas sejam criadas, você deve ter pelo menos 2 nós em seu cluster.

Você pode encontrar aqui as definições mais fáceis de entender: http://www.elasticsearch.org/guide/reference/glossary/

Atenciosamente, Paul

empatia
fonte
É o que todo documento diz - o índice é dividido em shards, mas o que o índice realmente contém?
Alex Pryiomka
@AlexPryiomka, Index contém dados
Gaurav
Então é basicamente o mesmo que replicação de partição no mundo kafka?
beatrice 22/04
19

Se você realmente não gosta de vê-lo amarelo. você pode definir o número de réplicas como zero:

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

Observe que você deve fazer isso apenas na sua caixa de desenvolvimento local.

jyu
fonte
10

Fragmento:

  1. Sendo servidor de pesquisa distribuído, ElasticSearchusa o conceito chamado Shardpara distribuir documentos de índice em todos os nós.
  2. Um indexpode potencialmente armazenar uma grande quantidade de dados que pode exceder os limites de hardware de umsingle node
  3. Por exemplo, um único índice de um bilhão de documentos que ocupa 1 TB de espaço em disco pode não caber no disco de um único nó ou pode ser muito lento para atender a solicitações de pesquisa de um único nó.
  4. Para resolver esse problema, Elasticsearchfornece a capacidade de subdividir seu índice em várias partes chamadasshards .
  5. Ao criar um índice, você pode simplesmente definir o número shards desejado.
  6. Documentssão armazenados shardse os shards são alocados nodesno seucluster
  7. Conforme você clustercresce ou diminui, Elasticsearchmigrará automaticamente os fragmentos entre eles, nodespara que os clusterrestos sejam equilibrados.
  8. Um fragmento pode ser um primary shardou um replica shard.
  9. Cada documento em seu índice pertence a um single primary shard, portanto, o número de shards primários que você determina determina a quantidade máxima de dados que seu índice pode conter
  10. A replica shardé apenas uma cópia de um fragmento primário.

Réplica:

  1. Replica shard é a cópia de primary Shard , para evitar perda de dados em caso de falha de hardware.
  2. Elasticsearchpermite que você faça uma ou mais cópias dos shards do seu índice no que é chamado shards de réplica, ou replicasabreviado.
  3. Um indextambém pode ser replicado zero (ou seja, sem réplicas) ou mais vezes.
  4. As number of shardsréplicas e podem ser definidas por índice no momento em que o índice é criado.
  5. Depois que o índice é criado, você pode alterar o número de réplicas dinamicamente a qualquer momento, mas cannot change the number of shards depois disso.
  6. Por padrão, cada índice Elasticsearché alocado 1 replicacom 5 shards primários e isso significa que, se você tiver pelo menos dois nós no cluster, seu índice terá 5 shards primários e outros 5 shards de réplica (1 réplica completa) para um total de 10 shards por índice.
Vino
fonte
6

Um índice é dividido em shards para distribuí-los e escalar.

Réplicas são cópias dos fragmentos.

Um nó é uma instância em execução de pesquisa elástica que pertence a um cluster.

Um cluster consiste em um ou mais nós que compartilham o mesmo nome de cluster. Cada cluster possui um único nó principal que é escolhido automaticamente pelo cluster e que pode ser substituído se o nó principal atual falhar.

Pruthvi Kumar
fonte
Eu tenho três AWS ec2instâncias, cada uma com elasticsearch instalado. Significa que temos três nós aqui? Se todos esses nós tiverem a mesma cluster.name: testpropriedade definida, ele criará um nome de Cluster testcom três nós?
TheCoder
5

Vou explicar isso usando cenários reais de palavras. Imagine que você está executando um site de comércio eletrônico. À medida que você se torna mais popular, mais vendedores e produtos são adicionados ao seu site. Você perceberá que o número de produtos que talvez você precise indexar aumentou e é muito grande para caber em um disco rígido de um nó. Mesmo que ele se encaixe no disco rígido, a execução de uma pesquisa linear em todos os documentos em uma máquina é extremamente lenta. um índice em um nó não aproveitará a configuração do cluster distribuído no qual a elasticsearch trabalha.

Portanto, a elasticsearch divide os documentos no índice entre vários nós no cluster. Cada divisão do documento é chamada de fragmento. Cada nó que possui um fragmento de um documento terá apenas um subconjunto do documento. suponha que você tenha 100 produtos e 5 fragmentos, cada fragmento terá 20 produtos. Esse compartilhamento de dados é o que torna possível a pesquisa de baixa latência na pesquisa elástica. a pesquisa é realizada paralelamente em vários nós. Os resultados são agregados e retornados. No entanto, os fragmentos não fornecem tolerância a falhas. Ou seja, se qualquer nó que contém o fragmento estiver inativo, a integridade do cluster ficará amarela. Isso significa que alguns dados não estão disponíveis.

Para aumentar a tolerância a falhas, as réplicas são exibidas. Por padrão, a pesquisa elástica cria uma única réplica de cada fragmento. Essas réplicas são sempre criadas em outro nó em que o shard primário não está residindo. Portanto, para tornar o sistema tolerante a falhas, talvez seja necessário aumentar o número de nós no cluster e isso também depende do número de shards do seu índice. A fórmula geral para calcular o número de nós exigido com base em réplicas e shards é "número de nós = número de shards * (número de réplicas + 1)". A prática padrão é ter pelo menos uma réplica para tolerância a falhas.

A configuração do número de shards é uma operação estática, o que significa que você deve especificá-lo quando estiver criando um índice. Qualquer alteração após esse processo requer reindexação completa dos dados e levará tempo. Porém, configurar o número de réplicas é uma operação dinâmica e também pode ser feita a qualquer momento após a criação do índice.

você pode configurar o número de shards e réplicas para o seu índice com o comando abaixo.

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

Não é uma resposta, mas outra referência para os principais conceitos do ElasticSearch, e acho que eles são bastante claros como complemento à resposta de @ javanna.

Estilhaços

Um índice pode potencialmente armazenar uma grande quantidade de dados que podem exceder os limites de hardware de um único nó. Por exemplo, um único índice de um bilhão de documentos que ocupa 1 TB de espaço em disco pode não caber no disco de um único nó ou pode ser muito lento para atender a solicitações de pesquisa de um único nó.

Para resolver esse problema, o Elasticsearch fornece a capacidade de subdividir seu índice em várias partes chamadas shards. Ao criar um índice, você pode simplesmente definir o número de shards que deseja. Cada shard é em si um "índice" totalmente funcional e independente que pode ser hospedado em qualquer nó do cluster.

O sharding é importante por dois motivos principais:

  • Permite dividir / dimensionar horizontalmente o volume do seu conteúdo.
  • Permite distribuir e paralelizar operações entre shards (potencialmente em vários nós), aumentando assim o desempenho / taxa de transferência .

Réplicas

Em um ambiente de rede / nuvem em que as falhas podem ser esperadas a qualquer momento, é muito útil e altamente recomendável ter um mecanismo de failover no caso de um fragmento / nó de alguma forma ficar offline ou desaparecer por qualquer motivo. Para esse fim, o Elasticsearch permite que você faça uma ou mais cópias dos shards do seu índice no que é chamado shards de réplica ou réplicas, abreviado.

A replicação é importante por dois motivos principais:

  • Ele fornece alta disponibilidade no caso de um fragmento / nó falhar. Por esse motivo, é importante observar que um shard de réplica nunca é alocado no mesmo nó que o shard original / primário do qual foi copiado.
  • Ele permite expandir o volume / taxa de transferência de pesquisa, pois as pesquisas podem ser executadas em todas as réplicas em paralelo.
Hearen
fonte
1

No ElasticSearch, no nível superior, indexamos os documentos em índices. Cada índice possui um número de shards que distribui internamente os dados e existem shards dentro dos segmentos Lucene, que é o armazenamento principal dos dados. Portanto, se o índice tiver 5 shards, significa que os dados foram distribuídos pelos shards e não existem os mesmos dados nos shards.

Assista ao vídeo que explica o núcleo do ES https://www.youtube.com/watch?v=PpX7J-G2PEo

Artigo sobre vários índices ou vários shards Pesquisa elástica, vários índices versus um índice e tipos para diferentes conjuntos de dados?

Prakash Ghanshani
fonte
1

O Elasticsearch é incrivelmente escalável, com todo o crédito atribuído à sua arquitetura distribuída. Isso é possível devido ao Sharding. Agora, antes de avançarmos mais, consideremos um caso de uso simples e muito comum. Suponhamos que você tenha um índice que contenha muitos documentos e, por uma questão de simplicidade, considere que o tamanho desse índice é de 1 TB (ou seja, a soma dos tamanhos de cada documento desse índice é de 1 TB ) Além disso, suponha que você tenha dois nós, cada um com 512 GB de espaço disponível para armazenar dados. Como pode ser visto claramente, todo o nosso índice não pode ser armazenado em nenhum dos dois nós disponíveis e, portanto, precisamos distribuir nosso índice entre esses nós.

Em casos como este, em que o tamanho de um índice excede os limites de hardware de um único nó, o Sharding vem em socorro. O sharding resolve esse problema dividindo os índices em pedaços menores e esses pedaços são nomeados como shards.

Ayush Jain
fonte
0

Em seus termos mais simples, shardnada mais é do que parte de um índice armazenado no disco em uma pasta separada:

Fragmentos do Elasticsearch

Esta captura de tela mostra o diretório inteiro do Elasticsearch.

Como você pode ver, todos os dados entram no datadiretório.

Ao inspecionar o índice C-mAfLltQzuas72iMiIXNw, vemos que ele possui cinco shards (pastas 0para 4).

Por outro lado, o JH_A8PgCRj-GK0GeQ0limw índice possui apenas um shard ( 0pasta).

Fragmentos do Elasticsearch

A privisualização do número total de shards.

Ahmad
fonte