Foi-me dada a tarefa de configurar backups incrementais para o replicaset do MongoDB; como ponto de partida, é claro, eu pesquisei no Google e não consegui encontrar nada nos documentos do MongoDB; no entanto, encontrei essa pergunta no Stack Overflow, que incentivou o desenvolvimento de minha própria solução. como não achou Tayra muito ativo.
Eu li oplog
e percebi que era muito fácil desenvolver algo para reproduzir o log, mas acontece que eu não precisei fazer mongorestore
o mesmo por mim.
Agora eu tenho uma solução funcional com scripts bash e foi bastante fácil, é por isso que pergunto aqui se há alguma falha na minha lógica ou talvez algo que me morda no futuro.
Abaixo como eu implementei isso:
Procedimento de backup completo
- bloqueia gravações em um membro secundário
db.fsyncLock()
- Tire uma foto rápida
Gravar última posição do oplog
db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts
Desbloquear gravações
db.fsyncUnlock()
Procedimento de backup incremental
- bloqueia gravações em um membro secundário
Despeje o oplog da posição registrada do oplog no backup completo (ou no incremental mais recente):
mongodump --host <secondary> -d local -c oplog.rs -o /mnt/mongo-test_backup/1 --query '{ "ts" : { $gt : Timestamp(1437725201, 50) } }'
Registrar a posição mais recente do oplog (da mesma maneira que para backups completos)
- Desbloquear gravações
Procedimento de restauração de backup completo
- parar todas as instâncias de
mongod
- copie o instantâneo para o diretório de dados da caixa que será o principal, mas certifique-se de excluir tudo
local*
emongod.lock
essa técnica de restauração é chamada reconfigurar quebrando o espelho - Iniciar primário
- reconfigurar replicaset
- inicie os secundários sem dados, faça a sincronização inicial. Ou copie os dados do novo primário com um novo
local
banco de dados
Restaurar backup incremental
Quando criamos o backup incremental, ele foi armazenado da seguinte maneira:
/mnt/mongo-test_backup/1/local/oplog.rs.bson
/mnt/mongo-test_backup/1/local/oplog.rs.metadata.json
Estamos inseridos, oplog.rs.bson
mas teremos que renomeá-lo, então aqui estão as etapas:
- altere o diretório para o backup:
cd /mnt/mongo-test_backup/1/local
- exclua o arquivo json
rm *.json
- renomeie o arquivo bson
mv oplog.rs.bson oplog.bson
restaure-o:
mongorestore -h <primary> --port <port> --oplogReplay /mnt/mongo-test_backup/1/local
Eu tenho tudo script, posso cometer no GitHub mais tarde.
A questão é se existe alguma falha na lógica? Estou um pouco desconfiado, pois o procedimento é bastante direto e ainda não consegui encontrá-lo documentado em nenhum lugar.