Mengosongkan segmen WAL di Postgres


9

Kami memiliki basis data Postgres yang relatif rendah dengan pengaturan pengarsipan terus-menerus untuk mengompres setiap segmen WAL dan mengirimkannya ke S3. Karena ini adalah sistem bervolume rendah, ia mencapai archive_timeoutsetiap 10 menit atau lebih dan mengarsipkan segmen WAL yang sebagian besar tidak digunakan, yang digunakan untuk mengompres dengan sangat baik karena sebagian besar hanya nol.

Namun, Postgres mendaur ulang segmen WAL untuk menghindari biaya pengalokasian file baru di setiap sakelar WAL, yang berguna dalam situasi beban tinggi tetapi itu berarti bahwa setelah ledakan aktivitas yang lebih berat dari normal, file segmen WAL kami sekarang penuh sampah dari segmen sebelumnya dan tidak kompres dengan baik sekali. Kami menyimpan banyak salinan dari semua sampah ini.

Apakah ada cara untuk mengurangi jumlah ruang yang kami gunakan untuk menyimpan arsip WAL kami? Beberapa kemungkinan suboptimal:

  1. Mencegah Postgres dari mendaur ulang segmen WAL, jadi itu dimulai dengan file yang memusatkan perhatian setiap kali. Dokumen tidak menunjukkan bahwa ada opsi untuk melakukan ini, tetapi saya mungkin melewatkannya.

  2. Buat Postgres nol file segmen WAL ketika mulai / selesai menggunakannya. Sekali lagi, dokumen sepertinya tidak menyarankan ini mungkin.

  3. Secara eksternal nol atau hapus beberapa file segmen WAL saat sedang tidak digunakan. Apakah ada cara aman untuk menentukan file mana ini?

  4. Nol bagian yang tidak terpakai dari segmen sebelum pengarsipan menggunakan output dari pg_xlogdumpuntuk menemukan di mana sampah dimulai. Mungkin, meskipun saya tidak suka itu. Setidaknya dengan melakukan ini dalam perintah arsip Anda dapat yakin bahwa Postgres tidak akan menggunakan kembali file.

  5. Hanya arsip bagian yang digunakan dari file segmen, sekali lagi dengan menginterpretasikan output dari pg_xlogdumpentah bagaimana, dan kemudian pad dengan nol selama pengembalian. Juga terdengar mungkin meskipun saya tidak terlalu menyukainya.


Masalah menarik. Bolehkah saya bertanya untuk pengarsipan berkelanjutan apa yang Anda gunakan?
dezso

@dezso Meskipun churn rendah, itu dianggap Sangat Penting untuk mengurangi risiko kehilangan data ini sejauh mungkin dan untuk memiliki jejak audit dari perubahan yang dibuat. Pengarsipan WAL adalah garis pertahanan terakhir (ada mekanisme lain juga dalam permainan) sehingga menjaganya tetap murah akan baik.
Dave Turner

Jawaban:


5

Mulai dalam versi 9.4, sekarang secara otomatis nol ujung ekor file WAL. (Sebenarnya hanya sebagian besar nol, ada beberapa header blok yang tidak mendapatkan nol, tetapi hasilnya masih sangat kompresibel).

Di versi 9.2, ada program bernama pg_clearxlogtailyang dapat Anda gunakan. Anda dapat menambahkannya ke dalam archive_command Anda sebelum langkah kompresi.

Jika Anda menggunakan 9.3, Anda kurang beruntung.

Perhatikan bahwa pos pemeriksaan tidak secara inheren menyebabkan sakelar file log. Mungkin ini archive_timeout yang menyebabkan sakelar.


Doh. Ya, kita berada di 9.3, jadi telah menyelinap melalui celah antara dua solusi. Dan ya, maaf, Anda benar archive_timeoutpenyebabnya. Mengoreksi OP, terima kasih.
Dave Turner
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.