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.
Você pode usar a fragmentação de zona para distribuir coleções em um cluster fragmentado e designar quais fragmentos armazenam dados para cada coleção. Você pode distribuir coleções com base nas propriedades do fragmento, como recursos físicos e memória disponível, para garantir que cada coleção seja armazenada no fragmento ideal para esses dados.
Pré-requisitos
Para concluir este tutorial, você deve:
Implementar um cluster fragmentado. Este tutorial usa um cluster fragmentado com três fragmentos.
Conecte-se a um
mongos. Você não pode criar zonas ou intervalos de zonas conectando-se diretamente a um fragmento.Autentique-se como um usuário com pelo menos a função
clusterManagerno banco de dadosadmin. Para visualizar as permissões do usuário, utilize o métododb.getUser().
Cenário
Você tem um banco de dados de dados denominado shardDistributionDB que contém duas collections fragmentadas:
bigData, que contém uma grande quantidade de dados.manyIndexes, que contém muitos índices grandes.
Você deseja limitar cada coleção a um subconjunto de fragmentos para que cada coleção possa usar os diferentes recursos físicos dos fragmentos.
Arquitetura
O cluster fragmentado tem três fragmentos. Cada fragmento tem recursos físicos exclusivos:
Nome do fragmento | Recursos físicos |
|---|---|
| Alta capacidade de memória |
| Armazenamento instantâneo rápido |
| Alta capacidade de memória e armazenamento rápido |
Zones
Para distribuir coleções com base em recursos físicos, use zonas de fragmento. Uma zona de fragmentos associa as coleções a um subconjunto específico de fragmentos, que restringe os fragmentos que armazenam os dados da coleção. Neste exemplo, você precisa de duas zonas de fragmento:
Nome da zona | Descrição | collection nesta zona |
|---|---|---|
| Servidores com alta capacidade de memória. | As collections que exigem mais memória, como as collections com índices grandes, devem estar nos shards |
| Servidores com pendrives para velocidades de armazenamento elevadas. | Coleções grandes que exigem recuperação de dados rápida devem estar nos fragmentos |
Chave de fragmento
Neste tutorial, a chave de shard que você usará para fragmentar cada collection é { _id: "hashed" }. Você configurará as zonas de fragmento antes de fragmentar as coleções. Como resultado, os dados de cada coleção só existem nos fragmentos na zona correspondente.
Com a fragmentação com hash, se você fragmentar as coleções antes de configurar as zonas, o MongoDB atribuirá os partes uniformemente entre todos os fragmentos quando a fragmentação estiver habilitada. Isso significa que as partes podem ser atribuídas temporariamente a um fragmento pouco adequado para lidar com os dados desse parte.
Balancer
O balanceador migra os partes para o devido fragmento, respeitando as zonas configuradas. Quando o balanceamento estiver concluído, os fragmentos conterão apenas partes cujos intervalos correspondam à zona atribuídas.
Importante
Desempenho
Adicionar, remover ou alterar zonas ou faixas de zonas pode resultar em migrações de partes. Dependendo do tamanho do conjunto de dados e do número de partes que uma zona ou faixa de zonas afeta, essas migrações podem impactar o desempenho do cluster. Pense em executar o balanceador durante janelas agendadas específicas. Para saber como definir uma janela de agendamento, consulte Agendar a janela de balanceamento.
Passos
Use o procedimento a seguir para configurar zona de fragmentos e distribuir collection com base nos recursos físicos do fragmento.
Adicione cada shard à zona apropriada.
Para configurar os shards em cada zona, utilize o comando addShardToZone .
Adicione shard0 e shard2 à zona HI_RAM:
sh.addShardToZone("shard0", "HI_RAM") sh.addShardToZone("shard2", "HI_RAM")
Adicione shard1 e shard2 à zona FLASH:
sh.addShardToZone("shard1", "FLASH") sh.addShardToZone("shard2", "FLASH")
Adicione intervalos de zona para as collection relevantes.
Para associar uma faixa de chaves de shard a uma zona, use sh.updateZoneKeyRange().
Neste cenário, você deseja associar todos os documento em uma collection à zona apropriada. Para associar todos os documentos de collection a uma zona, especifique o seguinte intervalo de zona:
um limite inferior de
{ "_id" : MinKey }um limite superior de
{ "_id" : MaxKey }
Para a coleção bigData, defina:
O namespace para
shardDistributionDB.bigData,O limite inferior para
MinKey,O limite superior para
MaxKey,A zona para
FLASH
sh.updateZoneKeyRange( "shardDistributionDB.bigData", { "_id" : MinKey }, { "_id" : MaxKey }, "FLASH" )
Para a coleção manyIndexes, defina:
O namespace para
shardDistributionDB.manyIndexes,O limite inferior para
MinKey,O limite superior para
MaxKey,A zona para
HI_RAM
sh.updateZoneKeyRange( "shardDistributionDB.manyIndexes", { "_id" : MinKey }, { "_id" : MaxKey }, "HI_RAM" )
Fragmente as coleções.
Para fragmentar ambas as coleções (bigData e manyIndexes), especifique uma chave de fragmento de { _id: "hashed" }.
Execute os seguintes comandos:
sh.shardCollection( "shardDistributionDB.bigData", { _id: "hashed" } ) sh.shardCollection( "shardDistributionDB.manyIndexes", { _id: "hashed" } )
Revise as alterações.
Para visualizar a distribuição de partes e as zona de fragmento, utilize o método sh.status():
sh.status()
Na próxima vez que o balanceador for executado, ele dividirá os blocos quando necessário e migra os blocos entre os fragmentos, respeitando as zonas configuradas. O tempo que o balanceador leva para ser concluído depende de vários fatores, incluindo o número de shards, memória disponível e IOPS.
Quando o balanceamento terminar:
Parte para documento na collection
manyIndexesresidem emshard0eshard2Partes de documentos na coleção
bigDataresidem emshard1eshard2.
Saiba mais
Para saber mais sobre fragmentação e balanceamento, consulte as seguintes páginas: