Distribuir coleções utilizando zonas
Nesta página
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
clusterManager
no 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 |
---|---|
shard0 | Alta capacidade de memória |
shard1 | Armazenamento instantâneo rápido |
shard2 | 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 |
---|---|---|
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 . |
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
manyIndexes
residem emshard0
eshard2
Partes de documentos na coleção
bigData
residem emshard1
eshard2
.
Saiba mais
Para saber mais sobre fragmentação e balanceamento, consulte as seguintes páginas: