Replikasi yang kami buat telah rusak ("segmen WAL yang diminta telah dihapus" selama downtime) Kami tidak dapat dengan mudah menghentikan master lagi.
Bisakah kita melakukannya
pg_start_backup()
,rsync ${PGDATA}/
tuan budak,pg_stop_backup()
... selagi postgresql master masih di bawah beban penuh? (Atau akan pg_start_backup()
mengarah ke
- kunci meja,
- Blok I / O,
- ketidakkonsistenan,
- alarm kebakaran,
- respons db lambat
Dengan kata lain, akan pg_start_backup()
mempengaruhi aplikasi kita?
postgresql
replication
Daniel
sumber
sumber
Jawaban:
pg_start_backup
akan melakukan pos pemeriksaan, seperti catatan dezso. Ini memang memiliki dampak, tetapi basis data Anda melakukan pemeriksaan secara teratur, dan harus melakukannya agar berfungsi, sehingga jelas bukan masalah bagi Anda. Sebuah pos pemeriksaan awal berarti bahwa lebih sedikit data yang telah terakumulasi, yang berarti bahwa jika sesuatu dari suatu pos pemeriksaanpg_start_backup
akan berdampak lebih rendah dari biasanya.Di mana Anda perlu khawatir adalah langkah rsync atau setara
pg_basebackup
. I / O baca dari ini tidak akan terlalu buruk karena itu berurutan, tapi itu mungkin masih akan secara signifikan merusak kinerja I / O database Anda, dan itu juga akan cenderung mendorong data panas keluar dari cache RAM dalam mendukung kurang data -digunakan, menyebabkan meronta-ronta cache sebagai data yang lebih dibutuhkan kemudian dibaca kembali.Anda dapat menggunakan
nice
danionice
membantu membatasi dampak I / O (tetapi bukan dampak cache); Namun, ada biaya untuk itu. Pencadangan akan memakan waktu lebih lama, dan sampai Anda menyelesaikan pencadangan dan menjalankanpg_stop_backup
sistem Anda - seperti yang saya mengerti - mengakumulasi WAL tidak dapat menghapus, mengakumulasi hutang pos pemeriksaan untuk pos pemeriksaan BESAR pada akhir pencadangan, dan mengakumulasi tabel dan indeks mengasapi karena tidak dapat membersihkan baris mati. Jadi Anda benar-benar tidak mampu untuk membuat cadangan selamanya, terutama jika Anda memiliki tabel churn yang sangat tinggi.Pada akhirnya, sulit untuk mengatakan apakah Anda dapat menggunakan dengan aman
pg_start_backup
danpg_stop_backup
untuk cadangan panas di lingkungan Anda. Kebanyakan orang bisa, tetapi jika Anda dekat dengan apa yang bisa dilakukan perangkat keras Anda, memiliki persyaratan waktu yang ketat, tidak mampu menanggung risiko kios, dan memiliki meja churn yang sangat tinggi serta meja yang sangat besar, itu mungkin menyusahkan .Sayangnya, Anda cukup perlu mengujinya dan melihatnya.
Jika Anda bisa, mungkin perlu mengeluarkan
CHECKPOINT
lalu mengambil snapshot atom dari volume basis data Anda alih-alih menggunakan LVM, alat SAN Anda, EBS, atau apa pun yang Anda aktifkan. Jika Anda dapat melakukan ini, Anda dapat menyalin foto itu di waktu luang Anda. Pendekatan ini tidak cocok untuk mengambil cadangan dasar untuk PITR / siaga hangat / siaga panas, tetapi sangat baik untuk salinan cadangan statis, dan dampaknya jauh lebih rendah pada sistem. Anda hanya dapat melakukan ini jika snapshot Anda bersifat atomik dan seluruh basis data Anda termasuk WAL ada dalam satu volume.Satu kemungkinan yang belum saya selidiki adalah menggabungkan dua pendekatan. Terpikir oleh saya bahwa seseorang mungkin ( belum diuji dan mungkin salah dan tidak aman , saya belum tahu):
pg_start_backup
pg_stop_backup
pg_stop_backup
Intinya, idenya adalah untuk mengurangi berapa lama DB harus menunda pos pemeriksaannya dengan mengambil poin-in-time dari setiap volume yang dapat Anda salin di waktu luang Anda.
sumber
Ini adalah penggalian kuburan tetapi saya harus memperbaiki sesuatu di sini.
Jawaban sebelumnya menyatakan:
Itu tidak benar. Sistem akan menjaga jumlah WAL yang tercantum dalam konfigurasi Anda (lihat dokumentasi online ). Jadi pada dasarnya, semakin tinggi nilai antara:
Mari kita bayangkan kasus ini:
kemudian setelah memulai "pg_start_backup ()", file WAL Anda akan diputar selama cadangan Anda. Ketika cadangan Anda selesai, Anda kemudian akan mencoba mengembalikannya di mesin basis data lain. Mesin saat peluncuran akan meminta setidaknya file WAL yang dihasilkan ketika Anda mengeluarkan "pg_start_backup ()".
Basis data tidak akan menerima untuk boot sampai Anda memberikan file WAL "0000000x0000000B000000D0" (di mana x adalah TimelineID Anda ). File WAL ini adalah minimum untuk sistem untuk boot. Tentu saja, dengan hanya file ini, Anda akan kehilangan data, karena sisa data terletak di file WAL yang tidak Anda miliki, tetapi setidaknya, Anda akan memiliki mesin database yang berfungsi.
Jadi Anda harus melakukan pengarsipan WAL, atau Anda harus menyimpan file WAL yang dibutuhkan sendiri, tetapi Postgresql tidak akan melakukannya untuk Anda.
sumber
pg_basebackup --xlog-method=stream
jika saya tidak salah.max_wal_senders
set minimum ke 2. Ini adalah cara yang bagus untuk menghindari masalah "WAL yang hilang" di akhir cadangan.Adapun pengalaman saya dengan PostgreSQL itu adalah operasi yang relatif aman kecuali jika Anda memiliki dampak kinerja yang sangat besar pada saat itu. Jika Anda memilikinya maka lebih baik berhenti sementara menulis dari semua klien Anda.
Saya hanya punya satu kasus kritis saat menyinkronkan master saya ke slave di bawah beban dan itu disebabkan oleh OOM killer (ya, Anda benar-benar harus benar-benar menonaktifkan OOM Killer pada node database, saya tidak mengetahuinya hari itu).
Jadi saya telah memulihkan database dari backup malam dan memberikan postgres semua segmen WAL dari direktori pg_archive untuk replay (cukup salin ke dalam folder pg_xlog). Semuanya berjalan baik tetapi downtime tidak bisa dihindari, tentu saja.
sumber