Menu Docs
Página inicial do Docs
/
Manual do MongoDB
/ /

Segmentação de dados por localização

Nesta página

  • Cenário
  • Procedimento

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.

Distribuição geográfica do diagrama com base em zonas

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"
...,
}

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.

O cluster fragmentado tem shards em dois centros de dados — um na Europa e outro na América do Norte.

Diagrama de zonas usadas para suportar arquitetura de distribuição geográfica

Este aplicativo exige uma zona por data center.

EU - Centro de dados na Europa

Os 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 zona EU 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 Norte

Os 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 zona NA com:

  • um limite inferior de { "country" : <country>, "userid" : MinKey }

  • um limite superior de { "country" : <country>, "userid" : MaxKey }

Observação

Os valores MinKey e MaxKey são valores especiais reservados para comparações

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.

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.

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.

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 .

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.

1

Para reduzir os impactos no desempenho, o balanceador pode ser desabilitado na coleção para garantir que nenhuma migração ocorra durante a configuração das novas zonas.

Utilize o sh.disableBalancing(), especificando o espaço de nome da coleção, para parar o balanceador.

sh.disableBalancing("chat.message")

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.

2

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().

3

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.

4

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.

5

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 com country : US, e

  • Os fragmentos na zona EU só devem conter documentos com country : UK ou country : 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().

O aplicativo requer as seguintes atualizações:

  • Os documentos com country : UK agora devem ser associados ao novo centro de dados UK. Quaisquer dados no centro de dados EU devem ser migrados

  • O aplicativo de bate-papo agora oferece suporte a usuários no México. Documentos com country : MX devem ser roteados para o centro de dados NA .

Execute os seguintes procedimentos para atualizar os intervalos de zona.

1

Para reduzir os impactos no desempenho, o balanceador pode ser desativado na coleção para garantir que nenhuma migração ocorra durante a configuração das novas zonas ou a remoção das antigas.

Use sh.disableBalancing(), especificando o namespace da collection, para interromper o balancer

sh.disableBalancing("chat.messages")

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.

2

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().

3

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

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.

5

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.

6

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 que country : DE ou country : UK, e

  • documentos 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 que country : DE,

  • fragmentos na zona UK só contêm documentos onde country : UK, e

  • shards na zona NA contêm apenas documentos em que country : US ou country : 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().

Dica

Veja também:

Voltar

Atualizar zona de fragmento