Fragmentação
Nesta página
- Cluster fragmentado
- Chaves de fragmentação
- Partes
- 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
- Fluxos de alterações
- 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 implantaçã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 mostrar coleções na IU para implantações hospedadas no MongoDB Atlas.
Cluster fragmentado
Observação
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 clientes e o cluster fragmentado.servidores de configuração: os servidores de configuração armazenam metadados e definições de configuração para o cluster. Os servidores de configuração devem ser implantados como um conjunto de réplicas (CSRS).
O gráfico a seguir descreve a interação de componentes em um cluster fragmentado:
O MongoDB fragmenta os dados no nível da coleção, distribuindo os dados da coleção entre os fragmentos no cluster.
Chaves de fragmentação
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.
Os documentos em coleções fragmentadas podem não ter os campos da chave de fragmento. Os campos de chave de fragmento ausentes são tratados como tendo valores nulos ao distribuir os documentos entre fragmentos, mas não ao rotear queries. Para obter mais informações, consulte Campos de chave de fragmento ausentes.
Você seleciona a chave de fragmento ao compartilhar uma coleção.
A partir do MongoDB 5.0, você pode reestruturar uma coleção alterando a chave de fragmento de uma coleção.
Você pode refinar uma chave de fragmento adicionando um ou mais campos de sufixo à chave de fragmento existente.
O valor da chave de fragmento de um documento determina sua distribuição entre os fragmentos. Você pode atualizar o valor da chave de fragmento de um documento, a menos que seu campo de chave de fragmento seja o campo _id
imutável. Para obter mais informações, consulte Alterar o valor da chave de fragmento de um documento.
Índice de chave fragmentada
Para fragmentar uma coleção preenchida, a coleção deve ter um índice que comece com a chave de 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.
Estratégia Chave de shard
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 encontrar gargalo na 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.
Partes
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.
Balanceador e distribuição uniforme de dados
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.
Vantagens do compartilhamento
Leituras / Gravações
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.
Capacidade de armazenamento
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.
Alta disponibilidade
A implantaçã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 fragmentados 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.
Considerações antes da fragmentação
Requisitos e complexidade da infraestrutura de cluster fragmentados exigem planejamento, execução e manutenção cuidadosos.
Embora você possa refragmentar sua coleção posteriormente, é importante considerar cuidadosamente sua escolha de chave de fragmento 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 implantação do cluster fragmentado.
Coleções Fragmentadas e Não Fragmentadas
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 podem estar localizadas em qualquer fragmento, mas não podem se espalhar por fragmentos.
Conectando-se a um cluster fragmentado
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.
Você pode se conectar a um mongos
da mesma forma que se conecta a um mongod
usando o mongosh
ou um driverdo MongoDB.
Observação
A partir do MongoDB 8.0, você só pode executar determinados comandos em shards. Se você tentar se conectar diretamente a um fragmento e executar um comando não suportado, o MongoDB retornará um erro:
"You are connecting to a sharded cluster improperly by connecting directly to a shard. Please connect to the cluster via a router (mongos)."
Para executar um comando de banco de dados de dados não suportado diretamente em um shard, você deve se conectar a mongos
ou ter a função directShardOperations
somente de manutenção.
Estratégia de fragmentação
O MongoDB oferece suporte a duas estratégias de fragmentação para distribuir dados em clusters compartilhados.
Fragmentação em hash
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.
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.
Fragmentação com intervalos
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.
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.
Zonas em Clusters Fragmentados
As zonas podem ajudar a melhorar a localização dos dados para clusters fragmentados que abrangem vários data centers.
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.
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 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.
Agrupamentos em fragmentação
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.
Fluxos de alterações
Os change streams estão disponíveis para conjuntos de réplicas e clusters fragmentados. Os change streams 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.
Transações
Com a introdução das transação distribuídas, as transações multidocumento 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.
Saiba mais
E-Book sobre agregações práticas do MongoDB
Para obter mais informações sobre como a fragmentação funciona com as agregações, leia o capítulo sobre fragmentação no e-book Agregações práticas do MongoDB.