EC2 - Como fazer backup correto dos dados do PostgreSQL?

9

Aqui está a configuração: 1 pequena instância EC2 do Amazon Linux (suportada pelo EBS) com 3 volumes adicionais. Este é um servidor da Web e um servidor de banco de dados. Um volume para código, um para o diretório de dados do PostgreSQL (8.4) e um volume para armazenar arquivos WAL do PostgreSQL.

(1) O volume com arquivos WAL também terá um backup base do diretório de dados, que é copiado após a execução de um pg_start_backup (). Em seguida, ele armazenará a saída do arquivo contínuo do PostgreSQL (arquivos WAL). Para capturar instantaneamente este volume, há algum ponto em emitir uma sincronização e congelar o sistema de arquivos (usando xfs_freeze se for XFS ou dmsetup se for EXT4)? Ou posso apenas tirar uma foto ao vivo? Os arquivos WAL serão enviados a uma taxa de um por minuto. É possível que um instantâneo possa ser iniciado enquanto um único arquivo WAL está sendo copiado e resulta em dados corrompidos?

(2) O volume que contém o diretório de dados do PostgreSQL ativo também será copiado para uma boa medida (diariamente). Antes de fazer uma captura instantânea deste volume, emito um pg_dump e o arquivo SQL resultante é mantido no diretório de dados. Existe algum ponto em tomar precauções para garantir que os dados reais do banco de dados sejam consistentes? Seria correto supor que a captura de uma captura instantânea ao vivo (a) faça backup dos arquivos de configuração (postgresql.conf, pg_hba.conf, pg_ident.conf) e (b) faça o backup do arquivo de despejo SQL. O backup dessas duas coisas, arquivo de despejo sql e arquivos de configuração, seria o principal ponto de captura instantânea deste volume. O banco de dados não é muito grande, então não me importo com o fato de os arquivos de dados incharem esse instantâneo. E, nesse caso, eu posso apenas fazer um instantâneo ao vivo - correto?

(2a) Seria melhor manter o diretório de dados no volume raiz e ter um script de backup que copie o arquivo sql dump, bem como os arquivos de configuração em outro volume, e faça uma captura instantânea desse volume assim que a cópia for concluída?

(3) Quanto ao volume com código, novamente existe algum ponto em sincronizar e congelar o sistema de arquivos? Ou apenas uma captura instantânea ao vivo pode ser tirada? Esses dados devem ser razoavelmente "estáticos".

(4) Esse é um esquema de backup sólido? O backup do volume raiz não é feito regularmente, pois manterei uma imagem da máquina depois de ter sido instalada e configurada.

obrigado


fonte

Respostas:

13

Veja o manual fino . Se meu conselho entrar em conflito com o seu 'de alguma forma, está certo.

  1. Uma sincronização não é uma má idéia, a menos que sua ferramenta de cópia fsync () seja cada arquivo WAL que ele grava e o diretório em que está antes de copiar o próximo. Um último arquivo WAL incompleto não importa muito; na pior das hipóteses, você apenas exclui-o. A página geralmente engasga com um WAL incompleto - embora não haja soma de verificação feita, então você podetenha muita sorte e tente aplicar dados de lixo que, por pura e insana chance, pareciam registros reais do WAL. Na sua posição, eu estaria sincronizando o volume antes de um instantâneo para garantir que quaisquer buffers sujos não escritos na RAM atingissem a imagem do sistema de arquivos no disco. Um congelamento ajudaria a evitar WALs parcialmente escritos, mas não fatais, por isso não é uma ideia terrível, mas não é vital. O que é vital é ter uma linha do tempo intacta até o ponto de recuperação. Pessoalmente, escrevo meus WALs em um nome de arquivo temporário e os renomeio para seu nome final apenas uma vez totalmente copiados; se você fizer isso, não precisará congelar.

  2. Parece correto. Um instantâneo ao vivo é como fazer um teste de pull pull em um sistema ao vivo com cache de gravação. Seu banco de dados deve se recuperar bem quando restaurado a partir de um instantâneo ativo, o mesmo que após o plug-pull. Eu recomendo que você automatize testes de restaurações a partir de instantâneos. (Nota: Um teste de restauração de captura instantânea não é um substituto completo para o teste de pull pull porque não leva em conta o possível disco, controlador de raid, etc. cache de gravação). Não apenas os arquivos de configuração e o dump, mas o próprio banco de dados deve ficar bem após o seu instantâneo. Considere sincronizar o volume antes da captura instantânea para garantir que todos os dados de despejo etc tenham atingido o disco.

    2a Pode economizar espaço em disco. Pouca diferença caso contrário. Você manterá os instantâneos por muito mais tempo sem toda a rotatividade do banco de dados ativo.

  3. Por que capturar instantaneamente seu volume de código? Uma cópia simples no nível do arquivo pode muito bem. Certamente um instantâneo ao vivo deve ser.

  4. Este não é um esquema de backup sólido. Ele falha em uma área crítica: não há testes e validação de restauração sendo executados. Você deve sempre testar seus backups regularmente para garantir que você possa realmente restaurá-los.

    Pessoalmente, recomendo que você use a remessa WAL ou envie dumps do banco de dados para um host diferente , de preferência um que não esteja no Amazon EC2 ou pelo menos em uma região diferente. Este host deve executar testes de restauração automatizados, enviar relatórios a você dos resultados e também deve ser verificado manualmente.

    Embora seus snapshots (contendo despejos) estejam no S3 e estejam seguros lá, isso não significa que eles estarão acessíveis quando você precisar deles com urgência. As reivindicações de durabilidade da Amazon são tranquilizadoras, mas seus dados ainda podem ser seguros e completamente inacessíveis para você durante uma interrupção temporária do serviço S3.

Craig Ringer
fonte
2
+1, especialmente para fazer backup de dados em outra máquina que não esteja no Amazon EC2. Elimine o máximo possível de pontos únicos de falha.
Mike Sherrill 'Cat Recall'
11
Informação útil, obrigado. A única coisa que não entendo é por que você diz "todos os dados de backup ainda estão na mesma máquina". As capturas instantâneas do EBS são armazenadas no S3, que garante 99.999999999% de durabilidade (armazene 10.000 objetos e espere uma falha em 10 milhões de anos). Meu entendimento é que ele é copiado para vários data centers na mesma região; você pode copiar manualmente para outras regiões. Nada de errado em tirar uma cópia fora da AWS para manter a independência do provedor, é claro.
Mark Berry
2
@ MarkBerry Você está certo - presumo que não entendi essa parte da explicação quando escrevi isso. Vou alterar a resposta.
Craig Ringer
Eu tinha uma pergunta de acompanhamento bastante detalhada que decidi postar como uma nova pergunta: dba.stackexchange.com/q/68461/41155 .
Mark Berry