Menu Docs

Página inicial do DocsDesenvolver aplicaçõesManual do MongoDB

Fragmentação

Nesta página

  • Cluster fragmentado
  • Chaves de fragmentação
  • Pedaços
  • Balanceador e distribuição uniforme de dados
  • Vantagens do compartilhamento
  • Considerações antes da fragmentação
  • Coleções Fragmentadas e Não Fragmentadas
  • Conectando-se a um cluster fragmentado
  • Estratégia de Fragmentação
  • Zonas em Clusters Fragmentados
  • Agrupamentos em Fragmentação
  • Change Streams
  • Transações
  • Saiba mais

A fragmentação é um método para distribuir dados em várias máquinas. O MongoDB usa fragmentação para oferecer suporte a implantações com conjuntos de dados muito grandes e operações de alto rendimento.

Sistemas de banco de dados com grandes conjuntos de dados ou aplicativos de alto rendimento podem desafiar a capacidade de um único servidor. Por exemplo, altas taxas de query podem esgotar a capacidade da CPU do servidor. Tamanhos de conjuntos de trabalho maiores que a RAM do sistema sobrecarregam a capacidade de E/S das unidades de disco.

Existem dois métodos para abordar o crescimento do sistema: dimensionamento vertical e horizontal.

O dimensionamento vertical envolve o aumento da capacidade de um único servidor, como o uso de uma CPU mais potente, a adição de mais RAM ou o aumento da quantidade de espaço de armazenamento. Limitações na tecnologia disponível podem impedir que uma única máquina seja suficientemente poderosa para uma determinada carga de trabalho. Além disso, os provedores baseados na nuvem têm tetos rígidos com base nas configurações de hardware disponíveis. Como resultado, existe um máximo prático para a dimensionamento vertical.

O Dimensionamento Horizontal envolve a divisão do conjunto de dados e da carga do sistema em vários servidores, acrescentando servidores adicionais para aumentar a capacidade conforme necessário. Embora a velocidade ou a capacidade geral de uma única máquina possa não ser alta, cada máquina lida com um subconjunto da carga de trabalho geral, o que pode proporcionar melhor eficiência do que um único servidor de alta velocidade e alta capacidade. A expansão da capacidade da implementação requer apenas a adição de servidores adicionais conforme necessário, o que pode representar um custo geral mais baixo do que o hardware de ponta para uma única máquina. A desvantagem é o aumento da complexidade da infraestrutura e da manutenção da implantação.

O MongoDB oferece suporte à dimensionamento horizontal por meio do compartilhamento.

Você pode coleções de fragmentos na interface do usuário para sistemas hospedados no MongoDB Atlas.

Um cluster fragmentado do MongoDB consiste nos seguintes componentes:

  • fragmento: cada fragmento contém um subconjunto dos dados fragmentados. Cada fragmento deve ser implantado como um conjunto de réplicas.

  • mongos: o mongos atua como um roteador de query, fornecendo uma interface entre os aplicativos do cliente e o cluster fragmentado. mongos pode suportar leituras protegidas para minimizar latências.

  • servidores de configuração: os servidores de configuração armazenam metadados e definições de configuração para o cluster. A partir do MongoDB 3.4, os servidores de configuração devem ser distribuídos como um conjunto de réplicas (CSRS).

O gráfico a seguir descreve a interação de componentes em um cluster fragmentado:

Diagrama de um cluster fragmentado de amostra para fins de produção. Contém exatamente 3 servidores de configuração, 2 ou mais roteadores de consulta ``mongos`` e pelo menos 2 fragmentos. Os fragmentos são conjuntos de réplicas.

O MongoDB fragmenta os dados no nível da coleção, distribuindo os dados da coleção entre os fragmentos no cluster.

O MongoDB usa a chave de fragmento para distribuir os documentos da coleção entre fragmentos. A chave de fragmento consiste em um campo ou vários campos nos documentos.

documento em collection fragmentadas podem não ter os campo da chave de fragmento. Os campo de chave de fragmento ausentes são tratados como tendo valores nulos ao distribuir os documento entre fragmentos, mas não ao rotear query. Para obter mais informações, consulte Campos de chave de fragmento ausentes.

Você seleciona a chave de fragmento ao compartilhar uma coleção.

O valor da chave de fragmento de um documento determina sua distribuição entre os fragmentos.

  • A partir do MongoDB 4,2, você pode atualizar o valor da chave de fragmentação de um documento, a menos que seu campo chave de fragmentação seja o campo _id imutável. Consulte Alterar o Valor da Chave de Fragmentação de um Documento para obter mais informações.

  • No MongoDB 4.0 e anterior, o valor de campo da chave de fragmento de um documento é imutável.

Para fragmentar uma coleção preenchida, a coleção deve ter um índice que comece com a tecla fragmento. Ao dividir uma coleta vazia, o MongoDB cria o índice de suporte se a coleção ainda não tiver um índice apropriado para a chave de fragmento especificada. Consulte Shard Key Indexes.

A escolha da chave de fragmentação afeta o desempenho, a eficiência e a escalabilidade de um cluster fragmentado. Um cluster com o melhor hardware e infraestrutura possível pode ser gargalo pela escolha da chave de fragmentação. A escolha da chave de fragmentação e seu índice de suporte também podem afetar a estratégia de fragmentação que seu cluster pode usar.

Dica

Veja também:

O MongoDB particiona dados fragmentados em chunks. Cada chunk tem uma faixa inferior inclusiva e uma faixa superior exclusiva com base na chave do fragmento.

Em uma tentativa de obter uma distribuição uniforme de dados em todos os shards no cluster, um balancer é executado em segundo plano para migrar faixas entre os shards.

Dica

Veja também:

O MongoDB distribui a carga de trabalho de leitura e gravação entre os fragmentos no cluster fragmentado, permitindo que cada fragmento processe um subconjunto de operações de cluster. As cargas de trabalho de leitura e gravação podem ser dimensionadas horizontalmente em todo o cluster com a adição de mais fragmentos.

Para consultas que incluem a chave de fragmento ou o prefixo de uma chave de fragmento composta, mongos pode direcionar a consulta para um fragmento ou conjunto de fragmentos específico. Essas operações direcionadas geralmente são mais eficientes do que a transmissão para cada fragmento no cluster.

mongos pode suportar leituras protegidas para minimizar latências.

A fragmentação distribui os dados entre os fragmentos do cluster, permitindo que cada fragmento contenha um subconjunto do total de dados do cluster. À medida que o conjunto de dados cresce, fragmentos adicionais aumentam a capacidade de armazenamento do cluster.

A implementação de servidores de configuração e fragmentos como conjuntos de réplica fornecem maior disponibilidade.

Mesmo que um ou mais conjuntos de réplicas fragmentadas fiquem completamente indisponíveis, o cluster fragmentado pode continuar realizando leituras e gravações parciais. Ou seja, embora os dados nos fragmentos indisponíveis não possam ser acessados, as leituras ou gravações direcionadas aos fragmentos disponíveis ainda podem ser bem-sucedidas.

Requisitos e complexidade da infraestrutura de cluster fragmentados exigem planejamento, execução e manutenção cuidadosos.

Uma vez que uma coleção tenha sido fragmentada, o MongoDB não fornece nenhum método para desfazer a fragmentação de uma coleção fragmentada.

Embora você possa reestruturar sua coleção posteriormente, é importante considerar cuidadosamente sua escolha de chave de fragmentação para evitar problemas de escalabilidade e desempenho.

Para entender os requisitos operacionais e restrições para compartilhar sua coleção, consulte Restrições Operacionais em Clusters Compartilhados.

Se as consultas não incluírem a chave de fragmentação ou o prefixo de uma chave de fragmentação composta , mongos executará uma operação de transmissão, consultando todos os fragmentos no cluster fragmentado. Essas consultas de dispersão/coleta podem ser operações de longa duração.

A partir do MongoDB 5.1, ao iniciar, reiniciar ou adicionar um servidor de shard com sh.addShard(), o CWWC (Cluster Wide Write Concern) deve ser definido.

Se o CWWC não estiver definido e o estilhaço estiver configurado de forma que a preocupação de gravação padrão seja { w : 1 } o servidor de estilhaços falhará ao iniciar ou será adicionado e retornará um erro.

Consulte cálculos de write concern padrão para mais detalhes sobre como o write concern padrão é calculado.

Observação

Se você tiver um contrato de suporte ativo com o MongoDB, considere a possibilidade de entrar em contato com o representante da sua conta para obter assistência com o planejamento e a implementação do cluster fragmentado.

Um banco de dados pode ter uma mistura de coleções fragmentadas e não fragmentadas. As coleções fragmentadas são particionadas e distribuídas entre os fragmentos no cluster. As coleções não fragmentadas são armazenadas em um fragmento primário. Cada banco de dados tem seu próprio fragmento primário.

Diagrama de um fragmento primário. Um fragmento primário contém coleções não fragmentadas, bem como pedaços de documentos de coleções fragmentadas. Fragmento A é o fragmento primário.

Você deve se conectar a um roteador mongos para interagir com qualquer coleção no cluster fragmentado. Isso inclui coleções fragmentadas e não fragmentadas. Os clientes nunca devem se conectar a um único fragmento para realizar operações de leitura ou escrita.

Diagrama de aplicativos/drivers que emitem consultas aos mongos para coleta sem fragmentação, bem como para coleta com fragmentação. Servidores de configuração não exibidos.

Você pode se conectar a um mongos da mesma forma que se conecta a um mongod usando o mongosh ou um driverdo MongoDB .

O MongoDB oferece suporte a duas estratégias de fragmentação para distribuir dados em clusters compartilhados.

A fragmentação em hash envolve o cálculo de um hash do valor do campo chave do fragmento. Em seguida, cada bloco recebe um intervalo com base nos valores da chave do fragmento com hash.

Dica

O MongoDB calcula automaticamente os hashes ao resolver consultas usando índices com hash. Os aplicativos não precisam calcular hashes.

Diagrama da segmentação baseada hasheada

Embora uma variedade de teclas de fragmento possa estar "fechada", é improvável que seus valores de hash estejam no mesmo chunk. A distribuição de dados com base em valores de hash facilita uma distribuição de dados mais uniforme, especialmente em conjuntos de dados onde a chave do fragmento muda monotonicamente.

No entanto, a distribuição com hash significa que as query baseadas em intervalo na chave de fragmento têm menos probabilidade de direcionar um único fragmento, resultando em mais operações de transmissãoem todo o cluster

Consulte Fragmentação com hash para obter mais informações.

A fragmentação por intervalos envolve a divisão de dados em intervalos com base nos valores da chave do fragmento. Em seguida, é atribuído a cada chunk um intervalo com base nos valores da chave do fragmento.

Diagrama do espaço de valor da chave de fragmentação segmentado em intervalos ou blocos.

Um intervalo de chaves de fragmento cujos valores são "próximos" tem maior probabilidade de residir no mesmo chunk. Isso permite operações direcionadas como um mongos pode rotear as operações para apenas os fragmentos que contêm os dados necessários.

A eficiência da fragmentação à distância depende da chave de fragmento escolhida. Chaves de fragmento mal consideradas podem resultar em distribuição desigual de dados, o que pode anular alguns benefícios da fragmentação ou pode causar gargalos de desempenho. Consulte a seleção da chave de fragmentação para fragmentação baseada em intervalo.

Consulte Fragmentação à distância para obter mais informações.

As zonas podem ajudar a melhorar a localização dos dados para clusters fragmentados que abrangem vários centros de dados.

Em clusters fragmentados, você pode criar zonas de dados fragmentados com base na chave de shard. Você pode associar cada zona a um ou mais shards no cluster. Um shard pode se associar a qualquer número de zonas. Em um cluster balanceado, o MongoDB migra os chunks cobertos por uma zona somente para os shards associados à zona.

Cada zona cobre um ou mais intervalos de valores de chave de fragmentação. Cada faixa que uma zona cobre é sempre inclusiva de seu limite inferior e exclusiva de seu limite superior.

Diagrama de distribuição de dados baseado em zonas de um cluster fragmentado
clique para ampliar

Você deve usar os campos contidos na chave de fragmento ao definir um novo intervalo para uma zona cobrir. Se estiver usando uma chave de fragmento composta, o intervalo deve incluir o prefixo da chave de fragmento. Consulte chaves de fragmento em zonas para obter mais informações.

O possível uso de zonas no futuro deve ser levado em consideração ao escolher uma chave de fragmento.

Dica

A partir do MongoDB 4,0,3, A configuração de zonas e intervalos de zonas antes de fragmentar uma coleção vazia ou inexistente permite uma configuração mais rápida da fragmentação em zonas.

Consulte zonas para obter mais informações.

Use o comando shardCollection com a opção collation : { locale : "simple" } para fragmentar uma coleção que tenha um agrupamento padrão. A fragmentação bem-sucedida requer que:

  • A coleção deve ter um índice cujo prefixo é a chave de fragmento

  • O índice deve ter o agrupamento { locale: "simple" }

Ao criar novas coleções com um agrupamento, certifique-se de que essas condições sejam atendidas antes de fragmentar a coleção.

Observação

As queries sobre a coleta fragmentada continuam utilizando o agrupamento padrão configurado para a coleção. Para usar o agrupamento simple do índice de chave de fragmento, especifique {locale : "simple"} no documento de agrupamentoda query.

Consulte shardCollection para mais informações sobre fragmentação e agrupamento.

A partir do MongoDB 3.6, alterar fluxos estão disponíveis para conjuntos de réplica e clusters fragmentados. Os fluxos de alterações permitem que os aplicativos acessem alterações de dados em tempo real sem a complexidade e o risco de afetar o oplog. Os aplicativos podem usar change streams para assinar todas as alterações de dados em uma coleção ou coleções.

A partir do MongoDB 4.2, com a introdução de transações distribuídas, as transações de vários documentos estão disponíveis em clusters fragmentados.

Até que uma transação seja confirmada, as alterações de dados feitas na transação não serão visíveis fora da transação.

No entanto, quando uma transação é gravada em vários fragmentos, nem todas as operações de leitura externas precisam esperar que o resultado da transação confirmada fique visível nos fragmentos. Por exemplo, se uma transação estiver comprometida e escrever 1 estiver visível no fragmento A, mas escrever 2 ainda não estiver visível no fragmento B, uma leitura externa em questão de leitura "local" poderá ler os resultados da escrita 1 sem ver a escrita 2.

Para obter mais informações sobre como a fragmentação funciona com as agregações, leia o capítulo sobre fragmentação na seção Práticas em agregações do MongoDB e-book.

← Estados-membros do conjunto de réplicas