Zones
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.
Veja alguns padrões de sistemas comuns onde zonas podem ser aplicadas:
Isole um subconjunto específico de dados em um conjunto específico de shards.
Garanta que os dados mais relevantes residam em shards geograficamente mais próximos dos servidores de aplicativos.
Direcione dados para os shards com base no hardware/desempenho do hardware do shard.
A imagem a seguir ilustra um cluster fragmentado com três fragmentos e duas zonas. A zona A
representa um intervalo com um limite inferior de 1
e um limite superior de 10
. A zona B
representa um intervalo com um limite inferior de 10
e um limite superior de 20
. Os fragmentos Alpha
e Beta
têm a zona A
. O fragmento Beta
também possui a zona B
. O fragmento Charlie
não tem zonas associadas a ele. O aglomerado está em estado constante e nenhum pedaço viola qualquer uma das zonas.
Comportamento e operações
Faixas
Cada zona abrange uma ou mais faixas de valores de chave de shard para uma collection. Cada faixa coberta por uma zona sempre inclui seu limite inferior e exclui seu limite superior. As zonas não podem compartilhar as faixas, nem podem ter faixas sobrepostas.
Por exemplo, considere uma chave de shard no {"x": 1}
. O cluster tem as seguintes faixas de zona:
{ "x" : 5 } --> { "x" : 10 } // Zone A { "x" : 10} --> { "x" : 20 } // Zone B
Um documento com um valor da chave de shard de
7
é encaminhado para a zona A.Um documento com um valor da chave de shard de
10
é encaminhado para a zona B.
Chaves de shard com hash e faixas de zona
Para collections cuja chave de shard inclui um campo hashed, as faixas de zonas e a distribuição de dados nesse campo estão em valores hashed. A zona contém documentos cujo valor da chave de shard hashed está dentro da faixa definida. Uma faixa de zonas em um campo hashed não tem o mesmo comportamento previsível de roteamento de documentos que uma faixa de zonas em um campo sem hash.
Por exemplo, considere uma chave de shard no {"x" : "hashed"}
. A faixa a seguir representa o intervalo com hash entre 5
e 10
:
{ "x": NumberLong("4470791281878691347") } --> { "x": NumberLong("7766103514953448109") } // Zone A
Um documento com um valor de chave de shard de
1
é roteado para a Zona A, uma vez que o valor com hash de1
se enquadrar na faixa definida.Um documento com um valor de chave de shard de
15
é roteado para a Zona A, uma vez que o valor com hash de15
se enquadrar na faixa definida.Um documento com um valor da chave de shard de
8
não será roteado para a Zona A, pois o valor de hash de8
não se enquadra no intervalo definido.
mongosh
fornece o convertShardKeyToHashed()
para computar o valor pós-hash do parâmetro especificado.
Um uso válido das faixas de zona em um campo com hash é restringir os dados para uma collection ao shard ou shards em uma única zona. Crie uma faixa de zona que abranja todo o intervalo dos possíveis valores de chave de shard com hash usando MinKey
como limite inferior e MaxKey
como limite superior.
Para definir as faixas, o MongoDB fornece o comando updateZoneKeyRange
e os métodos auxiliares associados sh.updateZoneKeyRange()
e sh.addShardTag()
.
você pode executar o comando de banco de dados do updateZoneKeyRange
e seus auxiliares sh.updateZoneKeyRange()
e sh.addTagRange()
em uma coleção não compartilhada ou uma coleção não existente.
A eliminação de uma coleção exclui seus intervalos de zonas/tags associados.
Distribuição inicial de chunk
Ao definir as zonas e as faixas de zonas antes de fragmentar uma collection vazia ou não existente, a operação de collection de shards cria chunks para as faixas de zonas definidas, bem como quaisquer chunks adicionais para cobrir todo a faixa dos valores da chave de shard e executa uma distribuição inicial de shards com base nas faixas de zonas. Essa criação e distribuição inicial de chunks permite uma configuração mais rápida da fragmentação por zonas. Após a distribuição inicial, o balancer gerenciará a distribuição de chunks dali para a frente.
MongoDB oferece suporte à fragmentação de coleção em índices compostos com hash. Ao fragmentar uma coleção vazia ou inexistente usando uma chave de fragmento composta com hash, aplicam-se requisitos adicionais para que o MongoDB execute a criação e a distribuição inicial da parte.
Consulte Predefinir zonas e faixas de zona para uma collection vazia ou inexistente para obter um exemplo.
Balancer
O balancer tenta distribuir uniformemente os chunks de uma collection fragmentada em todos os shards do cluster.
Para cada chunk para migração, o balancer verifica cada shard de destino possível para qualquer zona configurada. Se a faixa do chunk se enquadrar em uma zona, o balancer migra o chunk para um shard dentro dessa zona. Os chunks que não se enquadram em uma zona podem existir em qualquer shard no cluster e são migrados normalmente.
Durante as rodadas de balanceamento, se o balancer detectar que qualquer chunk viola as zonas configuradas para um determinado shard, o balancer migra esses chunks para um shard onde não existe conflito.
Depois de associar uma zona a um shard ou shards e configurar a zona com uma faixa de chave de shard para uma coleção fragmentada, o cluster pode levar algum tempo para migrar os dados afetados para a coleção fragmentada. Isso depende da divisão de chunks e da distribuição atual de dados no cluster. Quando o balanceamento estiver concluído, as leituras e escritas de documentos em uma determinada zona serão roteadas apenas para o shard ou shards dentro dessa zona.
Uma vez configurado, o balancer respeita as zonas durante as futuras rodadas de balanceamento.
Chave de fragmento
Você deve usar os campos contidos na chave de shard ao definir uma nova faixa para uma zona cobrir. Se estiver usando uma chave de shard composta, a faixa deve incluir o prefixo da chave de shard.
Por exemplo, dada uma chave de shard { a : 1, b : 1, c : 1 }
, criar ou atualizar uma faixa para cobrir valores de b
requer a inclusão de a
como o prefixo. Criar ou atualizar uma faixa para cobrir valores de c
requer a inclusão de a
e b
como o prefixo.
Não é possível criar faixas utilizando campos não incluídos na chave de shard. Por exemplo, se você quisesse usar zonas para dividir os dados com base na localização geográfica, a chave de shard precisaria do primeiro campo para conter os dados geográficos.
Ao escolher uma chave de shard para uma collection, considere quais campos você deseja utilizar para configurar as zonas. Consulte Escolher uma chave de shard para ver as considerações sobre como escolher uma chave de shard.
Limites da zona de shard
As faixas de zona estão sempre inclusas no limite inferior e exclusivas do limite superior.