ANNOUNCEMENT: Voyage AI joins MongoDB to power more accurate and trustworthy AI applications on Atlas.
Learn more
Menu Docs

Distribuir coleções utilizando zonas

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.

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 clusterManager no banco de dados admin. Para visualizar as permissões do usuário, utilize o método db.getUser().

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.

O cluster fragmentado tem três fragmentos. Cada fragmento tem recursos físicos exclusivos:

Nome do fragmento
Recursos físicos

shard0

Alta capacidade de memória

shard1

Armazenamento instantâneo rápido

shard2

Alta capacidade de memória e armazenamento rápido

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

HI_RAM

Servidores com alta capacidade de memória.

As collections que exigem mais memória, como as collections com índices grandes, devem estar nos shards HI_RAM .

FLASH

Servidores com pendrives para velocidades de armazenamento elevadas.

Coleções grandes que exigem recuperação de dados rápida devem estar nos fragmentos FLASH .

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.

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.

Use o procedimento a seguir para configurar zona de fragmentos e distribuir collection com base nos recursos físicos do fragmento.

1

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")
2

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"
)
3

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" }
)
4

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á as partes quando necessário e migrará as partes entre os fragmentos, respeitando as zonas configuradas. O tempo que o balanceador leva para ser concluído depende de vários fatores, incluindo número de fragmentos, memória disponível e IOPS.

Quando o balanceamento terminar:

  • Parte para documento na collection manyIndexes residem em shard0 e shard2

  • Partes de documentos na coleção bigData residem em shard1 e shard2.

Para saber mais sobre fragmentação e balanceamento, consulte as seguintes páginas: