Backups incrementais do Mongodb

26

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 oploge percebi que era muito fácil desenvolver algo para reproduzir o log, mas acontece que eu não precisei fazer mongorestoreo 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

  1. bloqueia gravações em um membro secundário db.fsyncLock()
  2. Tire uma foto rápida
  3. Gravar última posição do oplog

    db.oplog.rs.find().sort({$natural:-1}).limit(1).next().ts
  4. Desbloquear gravações db.fsyncUnlock()

Procedimento de backup incremental

  1. bloqueia gravações em um membro secundário
  2. 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) } }'
    
  3. Registrar a posição mais recente do oplog (da mesma maneira que para backups completos)

  4. Desbloquear gravações

Procedimento de restauração de backup completo

  1. parar todas as instâncias de mongod
  2. copie o instantâneo para o diretório de dados da caixa que será o principal, mas certifique-se de excluir tudo local*e mongod.lock essa técnica de restauração é chamada reconfigurar quebrando o espelho
  3. Iniciar primário
  4. reconfigurar replicaset
  5. inicie os secundários sem dados, faça a sincronização inicial. Ou copie os dados do novo primário com um novo localbanco 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.bsonmas teremos que renomeá-lo, então aqui estão as etapas:

  1. altere o diretório para o backup: cd /mnt/mongo-test_backup/1/local
  2. exclua o arquivo json rm *.json
  3. renomeie o arquivo bson mv oplog.rs.bson oplog.bson
  4. 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.

Tiago
fonte
2
Qual versão do Mongo você está usando? Se você estiver usando o wiredtiger, o primeiro item que você referenciou com db.fsyncLock () é um problema. O MongoDB Inc afirma "Com o WiredTiger, o comando fsync com a opção de bloqueio não pode garantir que os arquivos de dados não sejam alterados. Como resultado, não use esses métodos para garantir consistência com a finalidade de criar backups". link
SDillon 24/07
11
@SDillon usando 3.0.4, mas não usando WiredTiger, pelo menos ainda não. Quando decidimos usá-lo, em vez de bloquear as gravações, teremos que parar o mongod todos juntos. É um ponto justo, obrigado #
244 Tiago Tiago
Eu encontrei o seguinte ferramenta para backup incremental github.com/EqualExperts/Tayra espero que isso vai ajudar
Ahmad Abuhasna
11
"Alterado na versão 3.2: o comando fsync com a opção lock pode garantir que os arquivos de dados não sejam alterados para instâncias do MongoDB usando os mecanismos de armazenamento MMAPv1 ou WiredTiger, fornecendo consistência para fins de criação de backups."
Segurança
A maneira normal (e absolutamente mais fácil) de fazer backups incrementais é usar LVM e instantâneos. docs.mongodb.com/manual/tutorial/…
JJussi

Respostas:

3

Para responder sua pergunta. Não! Não há falha na sua lógica e deve funcionar sem problemas. No entanto, se os snapshots do LVM puderem ser usados, é a melhor maneira de fazer backups.

JJussi
fonte
Como você faz backups incrementais de um instantâneo LVM? Obrigado!
TanisDLJ
Os instantâneos do LVM são incrementais por natureza. Instantâneo são momentos no tempo e existem apenas alterações registradas.
JJussi
Apenas um instantâneo tirado sim, é incremental. Mas se você arquivar o instantâneo, haverá um backup completo. Você não pode arquivar backups incrementais diferentes como a duplicidade, por exemplo. E você não pode simplesmente começar a criar instantâneos a cada 30 minutos para backups incrementais, pois isso prejudicaria o desempenho.
TanisDLJ