Página inicial do Docs → Desenvolver aplicações → Manual do MongoDB
Faça backup de um cluster fragmentado com snapshots do sistema de arquivos
Nesta página
Visão geral
Este documento descreve um procedimento para fazer backup de todos os componentes de um cluster fragmentado. Este procedimento usa snapshots do sistema de arquivos para capturar uma cópia da instância mongod
.
Importante
Para fazer backup de um cluster fragmentado, você deve interromper todas as gravações no cluster.
Para obter mais informações sobre backups no MongoDB e backups de clusters fragmentados em particular, consulte Métodos de backup do MongoDB e Backup e restauração de clusters fragmentados.
Considerações
Transações entre shards
Para fazer um backup com um snapshot do sistema de arquivos, primeiro você deve parar o balancer, parar as gravações e parar quaisquer operações de transformação de esquema no cluster.
O MongoDB fornece operações de backup e restauração que podem ser executadas com o balancer e as transações em execução por meio dos seguintes serviços:
Mecanismo de armazenamento criptografado (somente MongoDB Enterprise)
Para mecanismos de armazenamento criptografado que usam o modo de criptografia AES256-GCM
, AES256-GCM
exige que cada processo use um valor de bloco de contador exclusivo com a chave.
Para mecanismo de armazenamento criptografado configurado com cifra AES256-GCM
:
- Restauração a partir de um hot backup
- A partir da versão 4.2, se você restaurar a partir de arquivos obtidos via backup "quente" (ou seja, o
mongod
está em execução), o MongoDB pode detectar chaves "sujas" na inicialização e rolar automaticamente a chave do banco de dados para evitar a reutilização IV (Initialization Vector).
- Restaurando a partir do Cold Backup
No entanto, se você restaurar a partir de arquivos obtidos via backup "frio" (ou seja, o
mongod
não está em execução), o MongoDB não poderá detectar chaves "sujas" na inicialização, e a reutilização do IV anulará as garantias de confidencialidade e integridade.A partir do 4,2, para evitar a reutilização das chaves após restaurar de um snapshot de sistema de arquivos frio, o MongoDB adiciona uma nova opção de linha de comando
--eseDatabaseKeyRollover
. Quando iniciada com a opção--eseDatabaseKeyRollover
, a instânciamongod
rola as chaves de banco de dados configuradas comAES256-GCM
cifra e sai.
Dica
Em geral, se estiver usando backups baseados em sistema de arquivos para o MongoDB Enterprise 4.2+, use o recurso de backup "hot", se possível.
Para as versões 4.0 e anteriores do MongoDB Enterprise, se você usar
AES256-GCM
modo de criptografia, não faça cópias de seus arquivos de dados ou restaure a partir de snapshots do sistema de arquivos ("quente" ou "frio").
Balancer
É essencial que você interrompa o balancer antes de capturar um backup.
Se o balanceador estiver ativo enquanto você captura backups, os artefatos de backup poderão estar incompletos ou ter dados duplicados, pois os blocos podem migrar durante a gravação de backups.
Precisão
Neste procedimento, você interromperá o balancer de cluster e fará um backup do banco de dados de configuração e, em seguida, fará backups de cada shard no cluster usando uma ferramenta de snapshot do sistema de arquivos. Se você precisar de um snapshot exato do sistema de arquivos, precisará interromper todas as gravações antes de tirar os snapshots do sistema de arquivos; caso contrário, o snapshot apenas aproximará um momento no tempo.
Consistência
Para fazer backup de um cluster fragmentado, você deve usar o comando fsync
ou o método db.fsyncLock()
para interromper as gravações no cluster. Isso garante que os arquivos de dados não sejam alterados durante o backup.
Snapshots com Amazon EBS em uma configuração RAID 10
Se a sua implementação depender do Elastic Block Storage (EBS) da Amazon com RAID configurado em sua instância, será impossível obter um estado consistente em todos os discos usando a ferramenta de instantâneo da plataforma. Como alternativa, você pode fazer um dos seguintes procedimentos:
Liberte todas as gravações em disco e crie um bloqueio de escrita para garantir um estado consistente durante o processo de backup.
Se você escolher essa opção, consulte Fazer backup de instâncias com arquivos do diário em volume separado ou sem registro no diário.
Configure o LVM para executar e manter seus arquivos de dados MongoDB em cima do RAID dentro do seu sistema.
Se você escolher essa opção, realize a operação de backup do LVM descrita em Criar um snapshot.
Compatibilidade de versão
Este procedimento requer uma versão do MongoDB que suporte o bloqueio de sincronização do mongos
.
A partir do MongoDB 5.0.22 os comandos fsync
e fsyncUnlock
podem ser executados em mongos
para realizar o bloqueio e desbloquear um cluster fragmentado.
Passos
Para fazer um backup autogerenciado de um cluster fragmentado, conclua as seguintes etapas:
Encontre uma janela de backup
Migrações de chunk, refragmentação e operações de migração de esquema podem causar inconsistências nos backups. Para encontrar um bom horário para executar um backup, monitore o uso do aplicativo e do banco de dados e encontre um horário em que é improvável que essas operações ocorram.
Para obter mais informações, consulte Janela de agendamento de backup para clusters fragmentados.
Pare o balanceador
Para evitar que migrações de chunks interrompam o backup, use o método sh.stopBalancer()
para parar o balancer:
sh.stopBalancer()
Se uma rodada de balanceamento estiver em andamento, a operação aguardará a conclusão do balanceamento.
Para confirmar que o balanceador está parado, use o método sh.getBalancerState()
:
sh.getBalancerState()
false
O comando retorna false
quando o balanceador está parado.
Bloquear o cluster
As gravações no banco de dados podem causar inconsistências de backup. Bloqueie seu cluster fragmentado para proteger o banco de dados contra gravações.
Para bloquear um cluster fragmentado, use o método db.fsyncLock()
:
db.getSiblingDB("admin").fsyncLock()
Execute o seguinte pipeline de agregação no mongos
e no mongod
primário dos servidores de configuração. Para confirmar a trava, certifique-se de que o campo fysncLocked
retorne true
e o campo fsyncUnlocked
retorne false
.
db.getSiblingDB("admin").aggregate( [ { $currentOp: { } }, { $facet: { "locked": [ { $match: { $and: [ { fsyncLock: { $exists: true } }, { fsyncLock: true } ] } }], "unlocked": [ { $match: { fsyncLock: { $exists: false } } } ] } }, { $project: { "fsyncLocked": { $gt: [ { $size: "$locked" }, 0 ] }, "fsyncUnlocked": { $gt: [ { $size: "$unlocked" }, 0 ] } } } ] )
[ { fsyncLocked: true }, { fsyncUnlocked: false } ]
Faça backup do servidor de configuração primário
Observação
O backup de um servidor de configuração faz backup dos metadados do cluster fragmentado. Você só precisa fazer backup de um servidor de configuração, pois todos eles contêm os mesmos dados. Execute esta etapa no membro principal do CSRS.
Para criar um snapshot do sistema de arquivos do servidor de configuração, siga o procedimento em Criar um snapshot.
Faça backup dos shards primários
Execute um snapshot do sistema de arquivos no membro principal de cada shard, usando o procedimento encontrado em Backup e restauração com snapshots do sistema de arquivos.
Desbloqueie o cluster
Após a conclusão do backup, você poderá desbloquear o cluster para permitir que as gravações sejam retomadas.
Para desbloquear o cluster, use o método db.fsyncUnlock()
:
db.getSibling("admin").fsyncUnlock()
Execute o seguinte pipeline de agregação no mongos
e no mongod
primário dos servidores de configuração. Para confirmar o desbloqueio, certifique-se de que o campo fysncLocked
retorne false
e o campo fsyncUnlocked
retorne true
.
db.getSiblingDB("admin").aggregate( [ { $currentOp: { } }, { $facet: { "locked": [ { $match: { $and: [ { fsyncLock: { $exists: true } }, { fsyncLock: true } ] } }], "unlocked": [ { $match: { fsyncLock: { $exists: false } } } ] } }, { $project: { "fsyncLocked": { $gt: [ { $size: "$locked" }, 0 ] }, "fsyncUnlocked": { $gt: [ { $size: "$unlocked" }, 0 ] } } } ] )
[ { fsyncLocked: false }, { fsyncUnlocked: true } ]
Reinicie o Balanceador
Para reiniciar o balancer, use o método sh.startBalancer()
:
sh.startBalancer()
Para confirmar que o balanceador está em execução, use o método sh.getBalancerState()
:
sh.getBalancerState()
true
O comando retorna true
quando o balanceador está em execução.