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

Hardware em níveis autogerenciado para SLA ou SLO variável

Nesta página

  • Cenário
  • Operações de Escrita
  • Ler operações
  • Balancer
  • Segurança
  • 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 usa Zonas para rotear documentos com base na data de criação para fragmentos zonados para oferecer suporte a documentos recentes ou para fragmentos zonados para oferecer suporte a documentos arquivados.

Veja a seguir alguns exemplos de casos de uso de segmentação de dados com base no Contrato de nível de serviço (SLA) ou no Objetivo de nível de serviço (SLO):

  • Um aplicativo exige o acesso de baixa latência a documentos inseridos/atualizados recentemente

  • Um aplicativo exige priorizar o acesso de baixa latência a um intervalo ou subconjunto de documentos

  • Um aplicativo que se beneficia ao garantir que intervalos ou subconjuntos específicos de dados sejam armazenados em servidores com hardware adequado aos SLAs para acessar esses dados

O diagrama a seguir ilustra um cluster fragmentado que usa zonas baseadas em hardware para satisfazer SLAs ou SLOs de acesso a dados.

Diagrama da arquitetura de cluster fragmentado para SLA hierárquico

Um aplicativo de compartilhamento de fotos requer acesso rápido às fotos carregadas nos últimos 6 meses. A aplicação armazena a localização de cada imagem juntamente com seus metadados no reconhecimento de data center do photoshare na collection do data .

Os seguintes documentos representam fotos carregadas por um único usuário:

{
"_id" : 10003010,
"creation_date" : ISODate("2012-12-19T06:01:17.171Z"),
"userid" : 123,
"photo_location" : "example.net/storage/usr/photo_1.jpg"
}
{
"_id" : 10003011,
"creation_date" : ISODate("2013-12-19T06:01:17.171Z"),
"userid" : 123,
"photo_location" : "example.net/storage/usr/photo_2.jpg"
}
{
"_id" : 10003012,
"creation_date" : ISODate("2016-01-19T06:01:17.171Z"),
"userid" : 123,
"photo_location" : "example.net/storage/usr/photo_3.jpg"
}

Observe que apenas o documento com _id : 10003012 foi carregado no ano passado (em junho de 2016).

A collection de fotos utiliza o índice { creation_date : 1 } como a chave de fragmento.

O campo creation_date em cada documento permite criar zonas na data de criação.

A implantação do cluster fragmentado consiste atualmente em três fragmentos.

Diagrama da arquitetura de cluster fragmentado para SLA hierárquico

O aplicativo exige a adição de cada shard a uma zona com base em sua camada de hardware. Cada camada de hardware representa uma configuração de hardware específica projetada para satisfazer um determinado SLA ou SLO.

Diagrama da arquitetura de cluster fragmentado para SLA hierárquico
Nível rápido ("recente")

Essas são as máquinas de desempenho mais rápido, com grandes quantidades de RAM, discos SSD rápidos e CPUs poderosas.

A zona exige um intervalo com:

  • um limite inferior de { creation_date : ISODate(YYYY-mm-dd)}, onde o Ano, o Mês e a Data especificados por YYYY-mm-dd estão dentro dos últimos 6 meses.

  • um limite superior de { creation_date : MaxKey }.

Nível de arquivamento ("arquivo")

Essas máquinas usam menos RAM, discos mais lentos e CPUs mais básicas. No entanto, eles têm uma quantidade maior de armazenamento por servidor.

A zona exige um intervalo com:

  • um limite inferior de { creation_date : MinKey }.

  • um limite superior de { creation_date : ISODate(YYYY-mm-dd)}, onde o Ano, o Mês e a Data correspondem aos valores utilizados para o limite inferior da camada recent .

Observação

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

À medida que o desempenho precisa aumentar, adicionar fragmentos adicionais e associá-los à zona apropriada com base em sua camada de hardware permite que o cluster seja dimensionado horizontalmente.

Ao definir os intervalos de zonas com base em períodos de tempo, pese os benefícios de atualizações pouco frequentes para os intervalos de zonas em relação à quantidade de dados que deve ser migrada em uma atualização. Por exemplo, a definição de um limite de 1 ano para que os dados sejam considerados "recentes" provavelmente abrange mais dados do que a definição de um limite de 1 mês. Embora sejam necessárias mais migrações ao girar em uma escala de 1 mês, a quantidade de documentos que deve ser migrada é menor do que a rotação em uma escala de 1 ano.

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 nobalanceador para obter mais informações.

O MongoDB pode direcionar as query para um fragmento específico se a query incluir a chave do fragmento.

Por exemplo, o MongoDB pode tentar uma operação de leitura direcionada na seguinte query porque inclui creation_date no documento de query:

photoDB = db.getSiblingDB("photoshare")
photoDB.data.find( { "creation_date" : ISODate("2015-01-01") } )

Se o documento solicitado estiver dentro do intervalo de zona recent , o MongoDB roteará essa query para os fragmentos dentro dessa zona, garantindo uma leitura mais rápida em comparação com uma operação de leitura de transmissão em todo o cluster

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 ou faixas de zonas. Você não pode criar zonas ou intervalos de zonas conectando-se diretamente a um fragmento.

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

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

Adicione shard0001 à zona recent .

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

Adicione shard0002 à zona archive .

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

Você pode revisar a zona atribuída a qualquer fragmento específico executando sh.status().

3

Defina o intervalo para fotos recentes e associe-o à zona recent usando o método sh.addTagRange() . Esse método requer:

  • O namespace completo da coleção de destino.

  • O limite inferior inclusivo do intervalo.

  • O limite superior exclusivo do intervalo.

  • a zona.

sh.addTagRange(
"photoshare.data",
{ "creation_date" : ISODate("2016-01-01") },
{ "creation_date" : MaxKey },
"recent"
)

Defina o intervalo para fotos mais antigas e associe-o à zona archive usando o método sh.addTagRange() . Esse método requer:

  • O namespace completo da coleção de destino.

  • O limite inferior inclusivo do intervalo.

  • O limite superior exclusivo do intervalo.

  • a zona.

sh.addTagRange(
"photoshare.data",
{ "creation_date" : MinKey },
{ "creation_date" : ISODate("2016-01-01") },
"archive"
)

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

4

Reative o balancer para reequilibrar o cluster.

Us sh.enableBalancing(), especificando o namespace da collection, para iniciar o balanceador

sh.enableBalancing("photoshare.data")

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á e migrará os blocos entre os fragmentos, respeitando as zonas configuradas.

Após o balanceamento terminar, os fragmentos na zona recent só devem conter documentos com creation_date maior ou igual a ISODate("2016-01-01"), enquanto os fragmentos na zona archive só devem conter documentos com creation_date menor que ISODate("2016-01-01").

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

Para atualizar os intervalos de fragmentos, execute as seguintes operações como parte de uma tarefa cron ou outro procedimento agendado:

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

Remova o antigo intervalo de zona recent 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(
"photoshare.data",
{ "creation_date" : ISODate("2016-01-01") },
{ "creation_date" : MaxKey }
)

Remova o antigo intervalo de zona archive 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(
"photoshare.data",
{ "creation_date" : MinKey },
{ "creation_date" : ISODate("2016-01-01") }
)

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

3

Defina o intervalo para fotos recentes e associe-o à zona recent usando o método sh.addTagRange() . Esse método requer:

  • O namespace completo da coleção de destino.

  • O limite inferior inclusivo do intervalo.

  • O limite superior exclusivo do intervalo.

  • a zona.

sh.addTagRange(
"photoshare.data",
{ "creation_date" : ISODate("2016-06-01") },
{ "creation_date" : MaxKey },
"recent"
)

Defina o intervalo para fotos mais antigas e associe-o à zona archive usando o método sh.addTagRange() . Esse método requer:

  • O namespace completo da coleção de destino.

  • O limite inferior inclusivo do intervalo.

  • O limite superior exclusivo do intervalo.

  • a zona.

sh.addTagRange(
"photoshare.data",
{ "creation_date" : MinKey },
{ "creation_date" : ISODate("2016-06-01") },
"archive"
)

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

4

Reative o balancer para reequilibrar o cluster.

Us sh.enableBalancing(), especificando o namespace da collection, para iniciar o balanceador

sh.enableBalancing("photoshare.data")

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.

Antes do balanceamento, os fragmentos na zona recent só continham documentos com creation_date maior ou igual a ISODate("2016-01-01"), enquanto os fragmentos na zona archive só continham documentos com creation_date menor que ISODate("2016-01-01").

Após o balanceamento terminar, os fragmentos na zona recent só devem conter documentos com creation_date maior ou igual a ISODate("2016-06-01"), enquanto os fragmentos na zona archive só devem conter documentos com creation_date menor que ISODate("2016-06-01").

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

Voltar

Distribuir