Diferença entre sharding e replicação no MongoDB

77

Estou confuso sobre o sharding e a replicação de como eles funcionam .. De acordo com a definição

Replicação: Uma réplica definida no MongoDB é um grupo de processos mongod que mantêm o mesmo conjunto de dados.

Sharding: O sharding é um método para armazenar dados em várias máquinas.

Pelo meu entendimento, se houver dados de 75 GB, em seguida, por replicação (3 servidores), ele armazenará dados de 75 GB em cada servidor, significa 75 GB no Servidor-1, 75 GB no servidor-2 e 75 GB no servidor-3 .. (corrija-me se estiver errado) .. e ao compartilhar, ele será armazenado como dados de 25 GB no servidor-1, dados de 25 Gb no servidor-2 e dados de 25 GB no servidor-3. (Certo?) ... mas então encontrei esta linha em o tutorial

Os fragmentos armazenam os dados. Para fornecer alta disponibilidade e consistência de dados, em um cluster sharded de produção, cada shard é um conjunto de réplicas

Como o conjunto de réplicas é de 75GB, mas o shard é de 25GB, então como eles podem ser equivalentes ... isso me faz confundir muito ... acho que estou perdendo algo ótimo nisso. Por favor, me ajude com isto.

Saad Saadi
fonte

Respostas:

111

Um conjunto de réplicas significa que você possui várias instâncias do MongoDB, cada uma espelhando todos os dados uma da outra. Um conjunto de réplicas consiste em um mestre (também chamado de "primário") e um ou mais escravos (também conhecido como secundário). As operações de leitura podem ser atendidas por qualquer escravo, para que você possa aumentar o desempenho da leitura adicionando mais escravos ao conjunto de réplicas (desde que seu aplicativo cliente seja capaz de realmente usar diferentes membros do conjunto). Porém, as operações de gravação sempre ocorrem no mestre do conjunto de réplicas e são propagadas para os escravos, para que as gravações não fiquem mais rápidas quando você adicionar mais escravos.

Conjuntos de réplicas também oferecem tolerância a falhas. Quando um dos membros do conjunto de réplicas cai, os outros assumem o controle. Quando o mestre cair, os escravos elegerão um novo mestre. Por esse motivo , é sugerido que a implantação produtiva sempre use o MongoDB como um conjunto de réplicas de pelo menos três servidores, dois deles contendo dados (o terceiro é um "árbitro" sem dados, necessário para determinar um novo mestre quando um dos escravos cai).

Um cluster sharded significa que cada shard do cluster (que também pode ser um conjunto de réplicas) cuida de uma parte dos dados. Cada solicitação, tanto de leitura quanto de gravação, é atendida pelo cluster em que os dados residem. Isso significa que o desempenho de leitura e gravação pode ser aumentado adicionando mais shards a um cluster. Qual documento reside em qual fragmento é determinado pela chave de fragmento de cada coleção. Ele deve ser escolhido de forma que os dados possam ser distribuídos uniformemente em todos os clusters e para que fique claro para as consultas mais comuns em que a chave de fragmento reside (exemplo: quando você consulta frequentemente user_name, sua chave de fragmento deve incluir o campo user_namepara que cada consulta possa ser delegada apenas ao fragmento que possui esse documento).

A desvantagem é que a tolerância a falhas sofre. Quando um fragmento do cluster fica inoperante, qualquer dado nele fica inacessível. Por esse motivo, cada membro do cluster também deve ser um conjunto de réplicas. Isso não é necessário. Quando você não se importa com alta disponibilidade, um shard também pode ser uma instância única do mongod sem replicação . Mas para uso em produção, você sempre deve usar replicação .

Então, o que isso significa para o seu exemplo?

                            Sharded Cluster             
             /                    |                    \
      Shard A                  Shard B                  Shard C
        / \                      / \                      / \
+-------+ +---------+    +-------+ +---------+    +-------+ +---------+
|Primary| |Secondary|    |Primary| |Secondary|    |Primary| |Secondary|
|  25GB |=| 25GB    |    | 25 GB |=| 25 GB   |    | 25GB  |=| 25GB    |   
+-------+ +---------+    +-------+ +---------+    +-------+ +---------+

Quando você deseja dividir seus dados de 75 GB em 3 shards de 25 GB cada, precisa de pelo menos 6 servidores de banco de dados organizados em três conjuntos de réplicas. Cada conjunto de réplicas consiste em dois servidores que possuem os mesmos 25 GB de dados.

Você também precisa de servidores para os árbitros dos três conjuntos de réplicas, bem como do roteador mongos e do servidor de configuração do cluster. Os árbitros são muito leves e são necessários apenas quando um membro do conjunto de réplicas é desativado, para que eles possam compartilhar o mesmo hardware com outra coisa. Mas o roteador Mongos e o servidor de configuração devem ser redundantes e em seus próprios servidores.

Philipp
fonte
2
Muito obrigado pela resposta detalhada ... mais uma pergunta ... se o primário estiver desativado enquanto uma operação de gravação ou leitura estiver sendo executada ... 1) qual é o atraso na seleção do primário dos secundários e 2) durante esse atraso, onde os dados serão armazenados temporariamente?
Saad Saadi #
4
@SaadSaadi O processo primário de eleição está descrito na documentação . Leva entre 10 e 12 segundos para os secundários perceberem que o primário está inoperante. As eleições primárias em si normalmente levam apenas milissegundos. O conjunto de réplicas é somente leitura enquanto não houver primário. Qualquer tentativa dos aplicativos de gravar dados durante esse período falhará.
Philipp
1
@ Philipp: Apenas dois comentários: (1) a chave do shard não pode ser modificada (ou seja, você não pode shard usando uma chave diferente) e (2) pode ler nos nós secundários do conjunto de réplicas, mas a consistência depende da preocupação com a gravação (em para ser consistente, a opção w deve ser igual ao conjunto de réplicas sth, o que não é viável, pois cada fragmento pode ter tamanhos diferentes de conjuntos de réplicas deliberadamente ou devido a falhas no nó).
Mike Argyriou
@ Philipp, você pode responder a perguntas de acompanhamento adicionais em dba.stackexchange.com/questions/208482/… ?
precisa saber é o seguinte
18
  • O sharding particiona o conjunto de dados em partes discretas.
  • A replicação duplica o conjunto de dados.

Essas duas coisas podem ser empilhadas, pois são diferentes. Usando os dois meios, você dividirá seu conjunto de dados em vários grupos de réplicas. Em outras palavras, você replica shards; um conjunto de dados sem fragmentos é um único 'fragmento'.

Um cluster Mongo com três shards e três réplicas teria 9 nós.

  • 3 conjuntos de réplicas de 3 nós.
  • Cada conjunto de réplicas contém um único fragmento.
sysadmin1138
fonte
Para um arquivo grande, ele é armazenado em um fragmento ou em vários fragmentos (assim, entre os nós)?
26416 Tony
Observe que no MongoDB 3.4 ou superior, você também precisará de servidores mongoDB para configuração e um servidor adicional para atuar como roteador mongos. Isso eleva o total do cluster 3x3 no seu exemplo para 13 servidores no total.
dthrasher
9

Ao compartilhar , você divide sua coleção em várias partes.
Replicar seu banco de dados significa que você espelha seu conjunto de dados.

dificultar
fonte
4

Em termos de funcionalidade entregue. O sharding fornece escalabilidade e paralelismo. A replicação fornece disponibilidade

Ashish Kumar
fonte
Não, apenas replicação também fornece escalabilidade e paralelismo, dado que as leituras são muito mais frequentes do que as escritas
Kristóf Szalay