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_timeout
setiap 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:
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.
Buat Postgres nol file segmen WAL ketika mulai / selesai menggunakannya. Sekali lagi, dokumen sepertinya tidak menyarankan ini mungkin.
Secara eksternal nol atau hapus beberapa file segmen WAL saat sedang tidak digunakan. Apakah ada cara aman untuk menentukan file mana ini?
Nol bagian yang tidak terpakai dari segmen sebelum pengarsipan menggunakan output dari
pg_xlogdump
untuk 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.Hanya arsip bagian yang digunakan dari file segmen, sekali lagi dengan menginterpretasikan output dari
pg_xlogdump
entah bagaimana, dan kemudian pad dengan nol selama pengembalian. Juga terdengar mungkin meskipun saya tidak terlalu menyukainya.