Cara membuat pg_dump lebih sedikit sumber daya serakah

8

Saya telah mengkonfigurasi cron untuk memanggil pg_dump setiap hari menggunakan aturan berikut:

# xyz database backups:
00 01 * * * root umask 077 && pg_dump --user=xyz_system xyz | gzip > /var/xyz/backup/db/xyz/`date -u +\%Y\%m\%dT\%H\%M\%S`.gz

Pada dasarnya, ini berhasil. Basis data tumbuh relatif cepat dan eksponensial (namun eksponennya tidak terlalu besar). Saat ini dump gzipped membutuhkan sekitar 160MB. Ketika database dibuang, sistem mulai merangkak. Rata-rata beban yang saya lihat menggunakan topperintah adalah tentang 200, 200, 180. Pada dasarnya server tidak responsif.

Pertanyaan pertama adalah bagaimana menentukan di mana bottleneck berada. Apakah kinerja yang buruk disebabkan oleh operasi I / O yang berat? Apakah ini disebabkan oleh masalah penguncian tabel? Mungkin itu masalah memori? Output dari pg_dumpperintah disalurkan ke gzipperintah. Apakah berurutan, yaitu seluruh dump ditempatkan di memori (masalah swapping?) Dan kemudian dikompresi atau bersamaan (yaitu gzip memampatkan apa yang didapat dan menunggu lebih banyak)? Mungkinkah itu disebabkan oleh beberapa faktor lain?

Pertanyaan kedua adalah bagaimana membuat operasi dumping kurang mengganggu fungsi-fungsi utama sistem. Sejauh yang saya mengerti hal-hal, dump tidak dapat mengambil terlalu banyak waktu karena integritas database. Ada kunci menulis tabel, dll. Apa yang bisa saya buat untuk membatasi masalah (atau menunda, mempertimbangkan pertumbuhan basis data).

Pertanyaan ketiga : Apakah sudah waktunya untuk mempelajari tentang konfigurasi basis data yang lebih maju? Sistem berfungsi dengan baik, ketika backup database tidak dilakukan, tapi mungkin masalah dumping db adalah gejala pertama dari masalah yang masuk?

Dariusz Walczak
sumber

Jawaban:

13

Wow. Jumlah pertanyaan yang luar biasa. Saya akan mencoba beberapa alamat, tetapi jawaban ini belum lengkap.

cara menentukan kemacetan.

Gunakan topdulu untuk melihat apa yang terjadi selama pembuangan. Periksa proses penggunaan CPU, status proses. Dberarti "menunggu I / O".

Apakah kinerja yang buruk disebabkan oleh operasi I / O yang berat?

Ya, kemungkinan besar.

Apakah ini disebabkan oleh masalah penguncian tabel?

Mungkin. Anda dapat menggunakan pg_stat_activitytampilan sistem untuk melihat apa yang terjadi di postgres selama dump.

Mungkin itu masalah memori?

Sangat tidak mungkin.

Output dari perintah pg_dump disalurkan ke perintah gzip. Apakah berurutan, yaitu seluruh dump ditempatkan di memori (masalah swapping?)

Tidak. Gzip adalah kompresor blok yang bekerja dalam mode aliran, ia tidak menyimpan semua input dalam memori.

dan kemudian dikompresi atau bersamaan (yaitu gzip kompres apa yang didapatnya dan menunggu lebih banyak)?

Ya, kompres blok demi blok, keluaran dan menunggu lebih.

Mungkinkah itu disebabkan oleh beberapa faktor lain?

Iya.

Sejauh yang saya mengerti hal-hal, dump tidak dapat mengambil terlalu banyak waktu karena integritas database. Ada kunci menulis tabel, dll. Apa yang bisa saya buat untuk membatasi masalah (atau menunda, mempertimbangkan pertumbuhan basis data).

Durasi dump tidak berpengaruh pada integritas dump. Integritas dipastikan dengan menggunakan satu transaksi dengan tingkat isolasi baca berulang oleh semua proses pg_dump. Tidak ada kunci tulis tabel.

Apakah sudah waktunya untuk mempelajari tentang konfigurasi basis data yang lebih maju? Sistem berfungsi dengan baik, ketika backup database tidak dilakukan, tapi mungkin masalah dumping db adalah gejala pertama dari masalah yang masuk?

Tidak pernah terlalu terlambat. Mulai dengan http://wiki.postgresql.org/wiki/Performance_Optimization .

filiprem
sumber
FWIW, saya punya masalah dengan pg_dump100% CPU dan itu dari gzip. Menentukan pg_dump --compress=0diselesaikan untuk saya di Ubuntu 16.04. Backup juga sangat cepat setelah itu. Watch out for kompresi gzip dalam wadah; mungkin tidak melakukan apa yang Anda harapkan.
Ligemer
5

Saya sarankan Anda untuk melihat pengarsipan postgresql secara terus menerus . Berikut ini kelebihan menggunakan pg_dump:

  1. Tidak perlu melakukan backup penuh setiap kali. Satu cadangan penuh sudah cukup di awal, tetapi disarankan untuk memiliki cadangan penuh setiap beberapa hari misalnya.
  2. Sangat cepat untuk memulihkan ketika ukuran DB bertambah.
  3. Kemampuan untuk mengembalikan ke beberapa titik lain (Point-In-Time Recovery).
  4. Anda akan melakukan pencadangan tambahan setiap jam (sekitar 30 menit). Ini dapat dikonfigurasi dan tergantung juga pada aktivitas pembaruan.

Namun, ada beberapa kekurangan (yang mungkin tidak menjadi masalah dalam kebanyakan kasus):

  1. Biasanya dibutuhkan lebih banyak ruang karena ini adalah cadangan biner. Folder DB dapat dikompresi.
  2. Anda tidak dapat mengembalikannya pada arsitektur yang berbeda (data biner).
Khaled
sumber