Bagaimana saya bisa memutakhirkan versi utama dari database postgres AWS RDS secara mulus?

13

Pagi ini saya terlibat dalam meningkatkan basis data PostgreSQL di AWS RDS. Kami ingin beralih dari versi 9.3.3 ke versi 9.4.4. Kami telah "menguji" pemutakhiran pada basis data pementasan, tetapi basis data pementasan keduanya jauh lebih kecil, dan tidak menggunakan Multi-AZ. Ternyata tes ini cukup tidak memadai.

Basis data produksi kami menggunakan Multi-AZ. Kami telah melakukan pemutakhiran versi minor di masa lalu, dan dalam kasus itu RDS akan memutakhirkan siaga terlebih dahulu dan kemudian mempromosikannya ke master. Jadi satu-satunya downtime yang terjadi adalah ~ 60s selama failover.

Kami berasumsi hal yang sama akan terjadi pada peningkatan versi utama, tetapi oh betapa salahnya kami.

Beberapa detail tentang pengaturan kami:

  • db.m3.large
  • IOPS (SSD) yang disediakan
  • Penyimpanan 300 GB, di mana 139 GB digunakan
  • Kami memiliki peningkatan OS RDS yang luar biasa, kami ingin menggunakan upgrade ini untuk meminimalkan waktu henti

Berikut adalah peristiwa RDS yang dicatat saat kami melakukan peningkatan:

masukkan deskripsi gambar di sini

Basis data CPU dimaksimalkan antara sekitar 08:44 dan 10:27. Banyak waktu ini tampaknya ditempati oleh RDS mengambil snapshot pra-upgrade dan pasca-upgrade.

Dokumen AWS tidak memperingatkan dampak semacam itu, meskipun dari membacanya jelas bahwa kelemahan yang jelas dalam pendekatan kami adalah bahwa kami tidak membuat salinan basis data produksi dalam pengaturan Multi-AZ dan mencoba untuk memutakhirkannya sebagai percobaan

Secara umum itu sangat membuat frustrasi karena RDS memberi kami sedikit informasi tentang apa yang dilakukannya dan berapa lama waktu yang diperlukan. (Sekali lagi, melakukan uji coba akan membantu ...)

Selain itu, kami ingin belajar dari kejadian ini jadi inilah pertanyaan kami:

  • Apakah hal semacam ini normal ketika melakukan peningkatan versi utama pada RDS?
  • Jika kami ingin melakukan peningkatan versi utama di masa depan dengan downtime minimal, bagaimana kami melakukannya? Apakah ada semacam cara pintar untuk menggunakan replikasi agar lebih mulus?
Jonleighton
sumber
Setelah pemutakhiran kami perhatikan bahwa postgres mencoba melakukan pemindaian berurutan pada beberapa tabel dengan jutaan catatan, di mana seharusnya menggunakan indeks sebagai gantinya (sehingga memukul batas waktu permintaan kami). Manual ANALYZEuntuk memperbarui statistik menyelesaikannya. Jika ada yang punya wawasan tentang ini, itu akan menjadi besar juga.
jonleighton

Jawaban:

4

Ini adalah pertanyaan yang bagus,
bekerja di lingkungan cloud terkadang rumit.

Anda dapat menggunakan pg_dumpall -f dump.sqlperintah, yang akan membuang seluruh database Anda ke format file SQL, dengan cara yang Anda bisa merekonstruksi dari awal menunjuk ke titik akhir lainnya. Menggunakan psql -h endpoint-host.com.br -f dump.sqlsingkatnya.

Tetapi untuk melakukan itu, Anda akan memerlukan beberapa instance EC2 dengan beberapa ruang yang masuk akal dalam disk (agar sesuai dengan tempat penyimpanan database Anda). Anda juga harus menginstal yum install postgresql94.x86_64untuk dapat menjalankan perintah dump dan restore.

Lihat contoh di PG Dumpall DOC .

Ingat bahwa untuk menjaga integritas data Anda, disarankan (beberapa kasus itu wajib) bahwa Anda mematikan sistem yang terhubung ke database selama jendela pemeliharaan ini.

Juga, jika Anda perlu mempercepat hal-hal, pertimbangkan untuk menggunakan pg_dumpbukan pg_dumpall, dengan mengambil keuntungan dari (paralelisme -j njobs) parameter, ketika Anda menentukan jumlah CPU yang terlibat dalam proses, misalnya -j 8akan menggunakan sampai 8 CPU. Secara default perilaku pg_dumpallatau pg_dumphanya menggunakan 1. Satu-satunya keuntungan dengan menggunakan pg_dumpsebagai gantinya pg_dumpalladalah bahwa Anda harus menjalankan perintah untuk setiap database yang Anda miliki, dan juga membuang ROLES (grup dan pengguna) yang dipisahkan.

Lihat contoh di PG Dump DOC dan PG Restore DOC .

Vinnix
sumber
Untuk menggunakan fitur paralel, Anda perlu menggunakan:pg_dump -h host -U user -W pass -Fc -f output_file.dmp -j 8 database_name
Vinnix
... dan mengembalikan menggunakan paralelisme:pg_restore -h host -d database_name -U user -W pass -C -Fc -j 8 output_file.dmp
Vinnix
Tidak bisakah Anda membuat instance rds baru dari snapshot dari env produksi Anda?
Pelajar