Restaurando um backup do Compose MongoDB 3.0 no Heroku

Desde março de 2015 , o Compose oferece suporte ao MongoDB 3.0. Um dos recursos mais interessantes do Compose são seus backups automáticos. No entanto, quando precisei restaurar de um backup outro dia, demorou um pouco para a equipe de suporte do Compose resolver e houve algumas surpresas ao longo do caminho.

Minha esperança é que este artigo esteja desatualizado em breve, mas aqui está o que você precisa saber hoje.

A versĂŁo curta

Conforme recomendado pela equipe de suporte do Compose:

  1. Instale o MongoDB 2.6 em sua máquina local
  2. Baixe e extraia o backup
  3. Corre mongodump --dbpath path/to/extracted/dir
  4. Execute mongorestoreusando suas credenciais Heroku no dumpdiretório recém-criado

O restante deste artigo entrará em mais detalhes. Mas, primeiro, algumas informações importantes:

Os backups não são amigáveis ​​ao 3.0

Cenário

Cada um desses downloads está em um formato que não é fácil de importar para o MongoDB 3.0.

Por que MongoDB 2.6?

Fiquei surpreso quando a equipe de suporte do Compose perguntou se eu poderia instalar o MongoDB 2.6.

A versão resumida é que você precisa produzir um conjunto de arquivos BSON / JSON de seu backup para restaurá-lo. O suporte para isso foi removido em 2.8 :

Os 2,8 versões de ferramentas MongoDB, mongodump, mongorestore, mongoexport, mongoimport, mongofiles, e mongooplog, deve conectar-se executando instâncias MongoDB e não pode modificar os arquivos de dados MongoDB (ou seja, com --dbpath), como nas versões anteriores.

1. Instale o MongoDB 2.6

Estou usando o Homebrew no OS X. Achei mais fácil desinstalar o mongodb e instalá-lo usando versões homebrew .

Importante: certifique-se de fazer backup antes de fazer isso.

Instale as versões do Homebrew, se ainda não as tiver:

brew tap homebrew/versions

Desinstale seu MongoDB local:

brew uninstall mongodb

Instale o MongoDB 2.6:

brew install homebrew/versions/mongodb26

(Quando terminar, vocĂŞ pode executar e executar novamente .)brew uninstall homebrew/versions/mongodb26brew install mongodb

2. Baixe e extraia o backup

Extraia o tarball. No meu caso, acabei com um diretĂłrio parecido com este:

.
├── admin.0
├── admin.ns
├── app12345678.0
├── app12345678.1
├── app12345678.2
├── app12345678.3
├── app12345678.4
├── app12345678.ns
├── local.0
├── local.1
├── local.2
├── local.3
├── local.4
├── local.ns
├── mongod.lock
├── raw_parse.txt
└── storage.bson

3. Corra mongodump

Dentro do diretĂłrio acima, execute:

mongodump --dbpath .

Nota: a opção só é suportada no MongoDB 2.6, por isso tivemos que instalá-lo.--dbpath

Isso produzirá um dumpdiretório contendo os dados:

dump
├── admin
│   ├── system.indexes.bson
│   ├── system.users.bson
│   ├── system.users.metadata.json
│   ├── system.version.bson
│   └── system.version.metadata.json
└── app12345678
├── my_collection_name.bson
├── my_collection_name.metadata.json
└── system.indexes.bson

4. Corra mongorestore

Você precisará da MONGOHQ_URLvariável de ambiente do aplicativo Heroku para as credenciais:

heroku config:get MONGOHQ_URL

VocĂŞ deve obter algo assim:

mongodb://heroku:averylongstring@candidate.2.mongolayer.com:5678,candidate.1.mongolayer.com:12345/app12345678

Observe que há dois hosts e portas listados. No meu caso, o correto era aquele listado em segundo lugar, mas você pode verificar novamente observando a seção Admin do painel Compose (procure por “Console Mongo”).

VocĂŞ mongorestoredeve ter esta aparĂŞncia:

mongorestore \
--host candidate.1.mongolayer.com \
--port 12345 \
--db app12345678 \
-u heroku \
-p averylongstring \
dump/app12345678/

Isso irá restaurar todos os arquivos no diretório criado por na etapa acima.dump/app12345678mongodump

É isso aí!

Por que o rigamarole?

Da equipe de suporte:

O motivo dessa mudança é a mudança do MongoDB para sistemas de armazenamento plugáveis. Ainda não decidimos a melhor forma de empacotar backups para esses cenários: com qualquer backup baixado de nós, você pode usar os arquivos extraídos diretamente para levantar uma instância mongo localmente, contra a qual você pode executar operações mongodump / mongorestore. Para o seu caso particular, é mais fácil usar utils anteriores ao 2.8 para criar o tipo de arquivo com o qual o mongorestore pode trabalhar.

Por que não há um botão “restaurar” ao lado de cada backup?

Sugeri isso ao longo do caminho e obtive esta resposta:

Na verdade, temos um botĂŁo de restauração automática para todo e qualquer backup feito em uma implantação … mas apenas para implantações que sĂŁo provisionadas por meio de uma conta direta do Compose.io. O TL; DR sobre o motivo disso Ă© como funciona a integração do programa de parceria Heroku. Simplesmente nĂŁo havia uma maneira razoável e confiável de trazer a mesma funcionalidade de restauração de dados para bancos de dados provisionados pelo Heroku. Tristeza ao redor. Para bancos de dados heroku, usar ferramentas mongodump / mongorestore padrĂŁo Ă© a Ăşnica maneira de restaurar um backup.