Segmentação de dados por localização
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.
Dica
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.
Consulte Predefinir zonas e faixas de zona para uma collection vazia ou não existente para ver um exemplo.
Este tutorial utiliza Zonas para segmentar dados com base em uma área geográfica.
Veja a seguir alguns exemplos de casos de uso de segmentação de dados por área geográfica:
Um aplicativo que precisa segmentar os dados do usuário por país
Um banco de dados que precisa alocar recursos por país
O diagrama a seguir ilustra um agrupamento fragmentado que usa zonas geográficas para gerenciar e satisfazer os requisitos de segmentação de dados.
Cenário
Um aplicativo de bate-papo financeiro registra mensagens, rastreando o país do usuário de origem. O aplicativo armazena os registros no banco de dados do chat
na coleção de messages
. Os bate-papos contêm informações que devem ser segmentadas por país para que os servidores locais atendam às solicitações de leitura e gravação para os usuários do país. Um grupo de países pode ser atribuído à mesma zona para compartilhar recursos.
Atualmente, o aplicativo tem usuários nos EUA, Reino Unido e Alemanha. O country
campo representa o país do usuário com base em seu ISO 3166-1 Alpha-2 códigos de país de dois caracteres.
Os seguintes documentos representam uma visão parcial de três mensagens de chat:
{ "_id" : ObjectId("56f08c447fe58b2e96f595fa"), "country" : "US", "userid" : 123, "message" : "Hello there", ..., } { "_id" : ObjectId("56f08c447fe58b2e96f595fb"), "country" : "UK", "userid" : 456, "message" : "Good Morning" ..., } { "_id" : ObjectId("56f08c447fe58b2e96f595fc"), "country" : "DE", "userid" : 789, "message" : "Guten Tag" ..., }
Chave de fragmento
A coleção messages
usa o índice composto { country : 1, userid : 1 }
como chave de fragmento.
O campo country
em cada documento permite criar uma zona para cada valor de país distinto.
O campo userid
fornece um componente de alta cardinalidade e baixa frequência para a chave de shard relativa ao country
.
Consulte Escolher uma chave de shard para obter instruções mais gerais sobre como selecionar uma chave de shard.
Arquitetura
O cluster fragmentado tem shards em dois centros de dados — um na Europa e outro na América do Norte.
Zones
Este aplicativo exige uma zona por data center.
EU
- Centro de dados na EuropaOs fragmentos implementados neste centro de dados são atribuídos à zona
EU
.Para cada país usando o centro de dados
EU
para leituras e gravações locais, crie um intervalo de zona para a zonaEU
com:um limite inferior de
{ "country" : <country>, "userid" : MinKey }
um limite superior de
{ "country" : <country>, "userid" : MaxKey }
NA
- Centro de dados na América do NorteOs fragmentos implementados neste centro de dados são atribuídos à zona
NA
.Para cada país usando o centro de dados
NA
para leituras e gravações locais, crie um intervalo de zona para a zonaNA
com:um limite inferior de
{ "country" : <country>, "userid" : MinKey }
um limite superior de
{ "country" : <country>, "userid" : MaxKey }
Operações de Escrita
Com zonas, se um documento inserido ou atualizado corresponder a uma zona configurada, ele só poderá ser escrito em um fragmento dentro dessa zona.
O MongoDB pode escrever documentos que não correspondem a uma zona configurada a nenhum shard no cluster.
Observação
O comportamento descrito acima exige que o cluster esteja em um estado estável, sem partes que violem uma zona configurada. Consulte a seção a seguir sobre o balanceador para obter mais informações.
Ler operações
O MongoDB pode direcionar as consultas para um fragmento específico se a consulta incluir pelo menos o campo country
.
Por exemplo, o MongoDB pode tentar uma operação de leitura direcionada na seguinte consulta:
chatDB = db.getSiblingDB("chat") chatDB.messages.find( { "country" : "UK" , "userid" : "123" } )
Consultas sem o campo country
executam operações de transmissão.
Balancer
O balancer migra chunks para o shard apropriado respeitando as zonas configuradas. Até a migração, os shards podem conter chunks que violam as zonas configuradas. Após a conclusão do balanceamento, os shards devem conter apenas chunks cujos intervalos não violem as zonas atribuídas.
Adicionar ou remover zonas ou faixas de zonas pode resultar em migrações de chunks. Dependendo do tamanho do conjunto de dados e do número de chunks que uma zona ou faixa de zonas afeta, essas migrações podem afetar o desempenho do cluster. Considere executar seu balancer durante períodos agendados específicos. Consulte Agendamento da janela de balanceamento para obter um tutorial sobre como definir uma janela de agendamento.
Segurança
Para clusters fragmentados em execução com controle de acesso baseado em role em sistemas autogerenciados, autentique como um usuário com pelo menos o role clusterManager
no banco de banco de dados do admin
.
Procedimento
Você deve estar conectado a um mongos
para criar zonas e intervalos de zonas. Você não pode criar zonas ou intervalos de zonas conectando-se diretamente a um fragmento.
Desativar o balanceador (opcional)
Para reduzir os impactos no desempenho, o balanceador pode ser desabilitado em todo o cluster fragmentado para garantir que nenhuma migração ocorra durante a configuração das novas zonas.
Use para parar o balanceador para o sh.stopBalancer()
cluster.
sh.stopBalancer()
Use sh.isBalancerRunning()
para verificar se o processo do balancer está em execução no momento. Aguarde até que as rodadas de balanceamento atuais tenham sido concluídas antes de prosseguir.
Adicionar cada shard à zona apropriada
Adicione cada fragmento no centro de dados da América do Norte à zona NA
.
sh.addShardTag(<shard name>, "NA")
Adicione cada fragmento no centro de dados europeu à zona EU
.
sh.addShardTag(<shard name>, "EU")
Você pode revisar as zonas atribuídas a qualquer fragmento específico executando sh.status()
.
Definir faixas para cada zona
Para valores de chave de fragmento em que country : US
, defina um intervalo de chaves de fragmento e associe-o à zona NA
usando o método sh.addTagRange()
. Este método requer:
O namespace completo da coleção de destino.
O limite inferior inclusivo do intervalo.
O limite superior exclusivo do intervalo.
O nome da zona.
sh.addTagRange( "chat.messages", { "country" : "US", "userid" : MinKey }, { "country" : "US", "userid" : MaxKey }, "NA" )
Para valores de chave de fragmento em que country : UK
, defina um intervalo de chaves de fragmento e associe-o à zona EU
usando o método sh.addTagRange()
. Este método requer:
O namespace completo da coleção de destino.
O limite inferior inclusivo do intervalo.
O limite superior exclusivo do intervalo.
O nome da zona.
sh.addTagRange( "chat.messages", { "country" : "UK", "userid" : MinKey }, { "country" : "UK", "userid" : MaxKey }, "EU" )
Para valores de chave de fragmento em que country : DE
, defina um intervalo de chaves de fragmento e associe-o à zona EU
usando o método sh.addTagRange()
. Este método requer:
O namespace completo da coleção de destino.
O limite inferior inclusivo do intervalo.
O limite superior exclusivo do intervalo.
O nome da zona.
sh.addTagRange( "chat.messages", { "country" : "DE", "userid" : MinKey }, { "country" : "DE", "userid" : MaxKey }, "EU" )
Os valores MinKey
e MaxKey
são reservados para comparações. MinKey
sempre se compara como menor do que todos os outros valores possíveis, enquanto MaxKey
sempre se compara como maior do que todos os outros valores possíveis. Os intervalos configurados capturam cada usuário para cada device
.
Tanto country : UK
quanto country : DE
são atribuídos à zona EU
. Isso associa qualquer documento com UK
ou DE
como o valor de country
ao centro de dados da Europa.
Ativar o Balanceador (Opcional)
Se o balanceador tiver sido desativado nas etapas anteriores, reative-o na conclusão deste procedimento para reequilibrar o cluster.
Utilize o sh.enableBalancing()
, especificando o namespace da coleção, para iniciar o balanceador.
sh.enableBalancing("chat.message")
Use sh.isBalancerRunning()
para verificar se o processo do balancer está em execução no momento.
Revise as alterações
Na próxima vez que o balanceador for executado, ele dividirá as partes quando necessário e as migrações entre os fragmentos, respeitando as zonas configuradas.
Assim que o balanceamento terminar:
os fragmentos na zona
NA
só devem conter documentos comcountry : US
, eOs fragmentos na zona
EU
só devem conter documentos comcountry : UK
oucountry : DE
.
Um documento com um valor para country
diferente de US
, UK
ou DE
pode residir em qualquer fragmento no cluster.
Para confirmar a distribuição de bloco, execute sh.status()
.
Atualizando zonas
O aplicativo requer as seguintes atualizações:
Os documentos com
country : UK
agora devem ser associados ao novo centro de dadosUK
. Quaisquer dados no centro de dadosEU
devem ser migradosO aplicativo de bate-papo agora oferece suporte a usuários no México. Documentos com
country : MX
devem ser roteados para o centro de dadosNA
.
Execute os seguintes procedimentos para atualizar os intervalos de zona.
Desativar o balanceador (opcional)
Para reduzir os impactos no desempenho, o balanceador pode ser desabilitado em todo o cluster fragmentado para garantir que nenhuma migração ocorra durante a configuração das novas zonas ou a remoção das antigas.
Use para parar o balanceador para o sh.stopBalancer()
cluster.
sh.stopBalancer()
Use sh.isBalancerRunning()
para verificar se o processo do balancer está em execução no momento. Aguarde até que as rodadas de balanceamento atuais tenham sido concluídas antes de prosseguir.
Adicionar a nova UK
zona
Adicione cada fragmento no centro de dados UK
à zona UK
.
sh.addShardTag("<shard name>", "UK")
Você pode revisar as zonas atribuídas a qualquer fragmento específico executando sh.status()
.
Remover o intervalo de zonas antigo
Remova o intervalo de zona antigo associado ao país UK
utilizando o método sh.removeTagRange()
. Esse método requer:
O namespace completo da coleção de destino.
O limite inferior inclusivo do intervalo.
O limite superior exclusivo do intervalo.
sh.removeTagRange( "chat.messages", { "country" : "UK", "userid" : MinKey }, { "country" : "UK", "userid" : MaxKey } )
Adicionar novos intervalos de zona
Para valores de chave de fragmento em que country : UK
, defina um intervalo de chaves de fragmento e associe-o à zona UK
usando o método sh.addTagRange()
. Este método requer:
O namespace completo da coleção de destino.
O limite inferior inclusivo do intervalo.
O limite superior exclusivo do intervalo.
O nome da zona.
sh.addTagRange( "chat.message", { "country" : "UK", "userid" : MinKey }, { "country" : "UK", "userid" : MaxKey }, "UK" )
Para valores de chave de fragmento em que country : MX
, defina um intervalo de chaves de fragmento e associe-o à zona NA
usando o método sh.addTagRange()
. Este método requer:
O namespace completo da coleção de destino.
O limite inferior inclusivo do intervalo.
O limite superior exclusivo do intervalo.
O nome da zona.
sh.addTagRange( "chat.messages", { "country" : "MX", "userid" : MinKey }, { "country" : "MX", "userid" : MaxKey }, "NA" )
Os valores MinKey
e MaxKey
são valores especiais reservados para comparações. MinKey
sempre se compara como menor do que todos os outros valores possíveis, enquanto MaxKey
sempre se compara como maior do que todos os outros valores possíveis. Isso garante que os dois intervalos capturem todo o espaço de valores possível de userid
.
Ativar o Balanceador (Opcional)
Se o balanceador tiver sido desativado nas etapas anteriores, reative-o na conclusão deste procedimento para reequilibrar o cluster.
Us sh.enableBalancing()
, especificando o namespace da collection, para iniciar o balanceador
sh.enableBalancing("chat.messages")
Use sh.isBalancerRunning()
para verificar se o processo do balancer está em execução no momento.
Revisar as alterações
Na próxima vez que o balanceador for executado, ele dividirá as partes quando necessário e as migrações entre os fragmentos, respeitando as zonas configuradas.
Antes de equilibrar:
shards na zona
EU
contêm apenas documentos em quecountry : DE
oucountry : UK
, edocumentos onde
country : MX
possa ser armazenado em qualquer fragmento no cluster fragmentado.
Após o balanceamento:
shards na zona
EU
contêm apenas documentos em quecountry : DE
,fragmentos na zona
UK
só contêm documentos ondecountry : UK
, eshards na zona
NA
contêm apenas documentos em quecountry : US
oucountry : MX
.
Um documento com um valor para country
diferente de US
, MX
, UK
ou DE
pode residir em qualquer fragmento no cluster.
Para confirmar a distribuição de bloco, execute sh.status()
.