Como posso atualizar perfeitamente a versão principal de um banco de dados do AWS RDS postgres?

13

Esta manhã, participei da atualização de um banco de dados PostgreSQL no AWS RDS. Queríamos passar da versão 9.3.3 para a versão 9.4.4. "Testamos" a atualização em um banco de dados intermediário, mas o banco de dados intermediário é muito menor e não usa o Multi-AZ. Acabou que este teste foi bastante inadequado.

Nosso banco de dados de produção usa o Multi-AZ. No passado, fizemos pequenas atualizações de versão e, nesses casos, o RDS atualiza o modo de espera primeiro e depois o promove como mestre. Portanto, o único tempo de inatividade ocorrido é de aproximadamente 60s durante o failover.

Assumimos que o mesmo aconteceria com a atualização da versão principal, mas como estávamos errados.

Alguns detalhes sobre nossa configuração:

  • db.m3.large
  • IOPS provisionado (SSD)
  • 300 GB de armazenamento, dos quais 139 GB são usados
  • Tivemos excelentes atualizações do sistema operacional RDS, queríamos fazer um lote com essa atualização para minimizar o tempo de inatividade

Aqui estão os eventos do RDS registrados enquanto realizamos a atualização:

insira a descrição da imagem aqui

A CPU do banco de dados foi atingida no máximo entre 08:44 e 10:27. Muito desse tempo pareceu ser ocupado pelo RDS tirando um instantâneo de pré e pós-atualização.

Os documentos da AWS não alertam para essas repercussões, embora, ao lê-las, fique claro que uma falha óbvia em nossa abordagem é que não criamos uma cópia do banco de dados de produção na configuração do Multi-AZ e tentamos atualizá-lo como um teste

Em geral, foi muito frustrante porque o RDS nos deu muito pouca informação sobre o que estava fazendo e quanto tempo provavelmente levaria. (Mais uma vez, fazer um teste teria ajudado ...)

Além disso, queremos aprender com esse incidente, então aqui estão nossas perguntas:

  • Esse tipo de coisa é normal ao fazer uma atualização de versão principal no RDS?
  • Se quiséssemos fazer uma grande atualização de versão no futuro com um tempo de inatividade mínimo, como procederíamos? Existe algum tipo de maneira inteligente de usar a replicação para torná-la mais transparente?
Jonleighton
fonte
Após a atualização, notamos que o postgres estava tentando fazer uma varredura seqüencial em algumas tabelas com milhões de registros, onde deveria ter usado um índice (atingindo o tempo limite da consulta). Um manual ANALYZEpara atualizar as estatísticas resolveu. Se alguém tiver alguma idéia sobre isso, também seria ótimo.
21816 jonleighton

Respostas:

4

Essa é uma boa pergunta,
trabalhar no ambiente de nuvem às vezes é complicado.

Você pode usar o pg_dumpall -f dump.sqlcomando, que irá despejar todo o banco de dados em um formato de arquivo SQL. De uma maneira que você possa reconstruí-lo do zero, apontando para outro ponto de extremidade. Usando psql -h endpoint-host.com.br -f dump.sqlpara breve.

Mas, para fazer isso, você precisará de alguma instância do EC2 com algum espaço razoável no disco (para ajustar o despejo do banco de dados). Além disso, você precisará instalar yum install postgresql94.x86_64para poder executar comandos de despejo e restauração.

Veja exemplos em PG Dumpall DOC .

Lembre-se de que, para manter a integridade de seus dados, é recomendável (em alguns casos, obrigatório) que você desligue os sistemas que se conectam ao banco de dados durante esta janela de manutenção.

Além disso, se você precisa acelerar as coisas, considere o uso pg_dumpao invés pg_dumpall, tirando proveito do paralelismo ( -j njobsparâmetro), quando você determinar o número de CPUs envolvidos no processo, por exemplo, -j 8vai usar até 8 CPUs. Por padrão o comportamento de pg_dumpallou pg_dumpé usado apenas 1. A única vantagem usando pg_dumpem vez pg_dumpallé que você precisará executar o comando para cada banco de dados que você tem, e também despejar os papéis (grupos e usuários) separados.

Veja exemplos em PG Dump DOC e PG Restore DOC .

Vinnix
fonte
Para usar o recurso paralelo, você precisará usar:pg_dump -h host -U user -W pass -Fc -f output_file.dmp -j 8 database_name
Vinnix 10/10
... e restaurar usando paralelismo:pg_restore -h host -d database_name -U user -W pass -C -Fc -j 8 output_file.dmp
Vinnix 10/10
Você não pode simplesmente criar uma nova instância rds a partir de um instantâneo do seu ambiente de produção?
Learner