Temos um conjunto de réplicas do MongoDB instalado em servidores Windows, com uma tarefa de backup agendada. O MongoDB está configurado para usar o registro no diário.
O trabalho executa db.fsyncLock()
via script no MongoDB (servidor principal), executa um instantâneo do sistema de arquivos Kaminario e executa db.syncUnlock()
via script.
O bloqueio / desbloqueio são separados, portanto, não usam a mesma conexão.
O problema é que o db.fsyncUnlock()
nem sempre funciona, deixando o banco de dados bloqueado para gravações até que seja manualmente desbloqueado via shell.
Tentamos realizar snapshots sem usar fsyncLock()
, no entanto, nossos testes mostraram que:
Restaurando um único banco de dados, resultando em dados com "buracos" (alguns dos tópicos de gravação tiveram alterações não confirmadas seguidas por alterações confirmadas)
Restaurando toda a instância do banco de dados, a restauração falhou devido a um bloqueio e um diário ausente, apesar de o diário estar ativado e presente
Considerando que, com fsyncLock()
, os testes foram aprovados. Os testes foram realizados com writeConcern
= 2
, pois queremos garantir a persistência em caso de falha no MongoDB.
Minhas perguntas são:
a. Como garantir o sucesso do fsyncUnlock()
após realizar o snapshot?
b. Existe alguma maneira de garantir um backup consistente sem usar fsyncLock()
?
Cruzou em DBA.SE .
Editar:
Após uma investigação mais aprofundada, parece que o problema foi com o snapshot pendurado, não o desbloqueio. No entanto, isso ainda não explica o fsync que requer o bloqueio.