Menu Docs

Segmenting Data by Application or Customer

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.

Overview of zones used for supporting data segmentation

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

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.

The application requires adding shard to a zone associated to a specific client.

The sharded cluster deployment currently consists of four shards.

Diagram of Data Segmentation Architecture using zones

For this application, there are two client zones.

Diagram of zones used for supporting data segmentation
Robot client ("robot")
This zone represents all documents where client : robot.
FruitOS client ("fruitos")
This zone represents all documents where 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

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.

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 .

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.

1

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.

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")

Run sh.status() to review the zone configured for the sharded cluster.

3

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.

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.

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