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

Segmentação de dados por aplicativo ou consumidor

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 mostra como segmentar dados usando zona.

Considere os seguintes cenários em que a segmentação de dados por aplicativo ou cliente pode ser necessária:

  • Um reconhecimento de data center que atende a várias aplicações

  • Um banco de dados que atende a vários clientes

  • Um banco de dados que requer o isolamento de faixas ou subconjuntos de dados de aplicativos ou clientes

  • Um reconhecimento de data center que exige a alocação de recursos para intervalos ou subconjuntos de dados de aplicação ou clientes

Este diagrama ilustra um cluster fragmentado usando zonas para segmentar dados com base no aplicativo ou no cliente. Isso permite que os dados sejam isolados em fragmentos específicos. Além disso, cada fragmento pode ter hardware específico alocado para atender ao requisito de desempenho dos dados armazenados nesse fragmento.

Visão geral das zonas usadas para dar suporte à segmentação de dados

Uma aplicação acompanha a pontuação de um usuário junto com um campo client, armazenando pontuações no reconhecimento de data center gamify na collection users. Cada valor possível de client requer sua própria zona para permitir a segmentação de dados. Também permite ao administrador otimizar o hardware para cada fragmento associado a um client para desempenho e custo.

Os seguintes documentos representam uma visão parcial de dois usuários:

{
"_id" : ObjectId("56f08c447fe58b2e96f595fa"),
"client" : "robot",
"userid" : 123,
"high_score" : 181,
...,
}
{
"_id" : ObjectId("56f08c447fe58b2e96f595fb"),
"client" : "fruitos",
"userid" : 456,
"high_score" : 210,
...,
}

A coleção users usa o índice composto { client : 1, userid : 1 } como chave de fragmento.

O campo client em cada documento permite criar uma zona para cada valor de cliente 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 aplicativo requer a adição de shard a uma zona associada a um client específico.

Atualmente, o sistema de cluster fragmentado consiste em quatro fragmentos.

Diagrama da arquitetura de segmentação de dados usando zonas

Para este aplicativo, existem duas zonas de cliente.

Diagrama de zonas usadas para suportar segmentação de dados
Cliente Robo ("robot")
Esta zona representa todos os documentos onde client : robot.
Cliente FrutoOS ("Frutos")
Esta zona representa todos os documentos onde client : fruitos.

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 client.

Por exemplo, o MongoDB pode tentar uma operação de leitura direcionada na seguinte consulta:

chatDB = db.getSiblingDB("gamify")
chatDB.users.find( { "client" : "robot" , "userid" : "123" } )

Consultas sem o campo client 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 associado ao cluster fragmentado de destino para prosseguir. Você não pode criar zonas ou intervalos de zonas conectando-se diretamente a um fragmento.

1

O balanceador deve ser desabilitado na collection para garantir que nenhuma migração ocorra durante a configuração das novas zona.

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 shard0000 à zona robot .

sh.addShardTag("shard0000", "robot")

Adicione shard0001 à zona robot .

sh.addShardTag("shard0001", "robot")

Adicione shard0002 à zona fruitos .

sh.addShardTag("shard0002", "fruitos")

Adicione shard0003 à zona fruitos .

sh.addShardTag("shard0003", "fruitos")

Execute sh.status() para revisar a zona configurada para o cluster fragmentado.

3

Defina o intervalo para o cliente robot e associe-o à zona robot utilizando o método sh.addTagRange() .

Esse método requer:

  • O namespace completo da collection de destino

  • O limite inferior inclusivo do intervalo

  • O limite superior exclusivo do intervalo

  • O nome da zona

sh.addTagRange(
"gamify.users",
{ "client" : "robot", "userid" : MinKey },
{ "client" : "robot", "userid" : MaxKey },
"robot"
)

Defina o intervalo para o cliente fruitos e associe-o à zona fruitos utilizando o método sh.addTagRange() .

Esse método requer:

  • O namespace completo da collection de destino

  • O limite inferior inclusivo do intervalo

  • O limite superior exclusivo do intervalo

  • O nome da zona

sh.addTagRange(
"gamify.users",
{ "client" : "fruitos", "userid" : MinKey },
{ "client" : "fruitos", "userid" : MaxKey },
"fruitos"
)

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. Os intervalos configurados capturam cada usuário para cada client.

4

Reative o balancer 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 migrará os dados entre os fragmentos respeitando as zonas configuradas.

Após o término do balanceamento, os fragmentos na zona robot conterão apenas documentos com client : robot, enquanto os fragmentos na zona fruitos conterão apenas documentos com client : fruitos.

Você pode confirmar a distribuição de partes executando sh.status().

Voltar

Segmento por localização