Segmenting Data by Application or Customer
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.
This tutorial shows you how to segment data using Zones.
Consider the following scenarios where segmenting data by application or customer may be necessary:
A database serving multiple applications
A database serving multiple customers
A database that requires isolating ranges or subsets of application or customer data
A database that requires resource allocation for ranges or subsets of application or customer data
This diagram illustrates a sharded cluster using zones to segment data based on application or customer. This allows for data to be isolated to specific shards. Additionally, each shard can have specific hardware allocated to fit the performance requirement of the data stored on that shard.
Cenário
An application tracks the score of a user along with a client
field,
storing scores in the gamify
database under the users
collection.
Each possible value of client
requires its own zone to allow for
data segmentation. It also allows the administrator to optimize the
hardware for each shard associated to a client
for performance and cost.
The following documents represent a partial view of two users:
{ "_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.
The client
field in each document allows creating a zone for each
distinct client value.
The userid
field provides a high cardinality and low frequency
component to the shard key relative to country
.
Consulte Escolher uma chave de shard para obter instruções mais gerais sobre como selecionar uma chave de shard.
Arquitetura
The application requires adding shard to a zone associated to a specific
client
.
The sharded cluster deployment currently consists of four shards.
Zones
For this application, there are two client zones.
- Robot client ("robot")
- This zone represents all documents where
client : robot
. - FruitOS client ("fruitos")
- This zone represents all documents where
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
The behavior described above requires the cluster to be in a steady state with no chunks violating a configured zone. See the following section on the balancer for more information.
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
You must be connected to a mongos
associated to the target
sharded cluster to proceed. You cannot create zones or zone ranges by
connecting directly to a shard.
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 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 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")
Run sh.status()
to review the zone configured for the sharded
cluster.
Definir faixas para cada zona
Define range for the robot
client and associate it to the robot
zone using the sh.addTagRange()
method.
This method requires:
The full namespace of the target collection
The inclusive lower bound of the range
The exclusive upper bound of the range
The name of the zone
sh.addTagRange( "gamify.users", { "client" : "robot", "userid" : MinKey }, { "client" : "robot", "userid" : MaxKey }, "robot" )
Define range for the fruitos
client and associate it to the
fruitos
zone using the sh.addTagRange()
method.
This method requires:
The full namespace of the target collection
The inclusive lower bound of the range
The exclusive upper bound of the range
The name of the zone
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
always compares as lower than
every other possible value, while MaxKey
always compares as
higher than every other possible value. The configured ranges captures every
user for each 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.
Once balancing finishes, the shards in the robot
zone only contain
documents with client : robot
, while shards in the fruitos
zone only
contain documents with client : fruitos
.
Você pode confirmar a distribuição de partes executando sh.status()
.