Segmentação de dados por aplicativo ou consumidor
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 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.
Cenário
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, ..., }
Chave de fragmento
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.
Arquitetura
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.
Zones
Para este aplicativo, existem duas zonas de cliente.
- Cliente Robo ("robot")
- Esta zona representa todos os documentos onde
client : robot
. - Cliente FrutoOS ("Frutos")
- Esta zona representa todos os documentos onde
client : fruitos
.
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 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.
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
associado ao cluster fragmentado de destino para prosseguir. Você não pode criar zonas ou intervalos de zonas conectando-se diretamente a um fragmento.
Desabilitar o balancer
O balanceador deve ser desabilitado em todo o cluster fragmentado para garantir que nenhuma migração ocorra durante a configuração das novas zonas.
Use sh.stopBalancer()
para parar o balanceador para o 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 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.
Definir faixas para cada zona
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
.
Habilite o balanceador
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.
Revisar as alterações
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()
.