Hardware em níveis autogerenciado para SLA ou SLO variável
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.
Cenário
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).
Chave de fragmento
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.
Arquitetura
A implantação do cluster fragmentado consiste atualmente em três fragmentos.
Zones
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.
- 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 porYYYY-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 camadarecent
.
À 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.
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 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
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
para criar zonas ou faixas de zonas. 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 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 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()
.
Definir faixas para cada zona
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.
Habilite o balanceador
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.
Revisar as alterações
Na próxima vez que o balanceador for executado, ele dividirá e migrará partes 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()
.
Atualizando intervalos de zona
Para atualizar os intervalos de fragmentos, execute as seguintes operações como parte de uma tarefa cron ou outro procedimento agendado:
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.
Remover os intervalos de zonas de fragmentação antigos
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.
Adicione o novo intervalo de zona para cada zona
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.
Habilite o balanceador
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.
Revisar as alterações
Na próxima vez que o balanceador for executado, ele dividirá as partes quando necessário e as migrações 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()
.