PostgreSQL: Dapatkah saya melakukan pg_start_backup () pada db yang sedang berjalan dan berjalan?

19

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

  1. pg_start_backup(),
  2. rsync ${PGDATA}/ tuan budak,
  3. 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?

Daniel
sumber
Sudahkah Anda memeriksa dokumen ? Dikatakan "Secara default, pg_start_backup dapat memakan waktu lama untuk menyelesaikannya. Ini karena ia melakukan pos pemeriksaan, dan I / O yang diperlukan untuk pos pemeriksaan akan tersebar selama periode waktu yang signifikan, secara default setengah dari antar-pos pemeriksaan Anda interval (lihat parameter konfigurasi checkpoint_completion_target). Ini biasanya yang Anda inginkan, karena meminimalkan dampak pada pemrosesan permintaan. " Apa artinya ini dalam praktek (dan dalam kasus Anda) tidak cukup jelas.
dezso

Jawaban:

11

pg_start_backupakan 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 pemeriksaan pg_start_backupakan 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 nicedan ionicemembantu 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 menjalankan pg_stop_backupsistem 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_backupdan pg_stop_backupuntuk 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 CHECKPOINTlalu 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
  • Picu snapshot dari semua tablespace, datadir utama, dan volume xlog
  • pg_stop_backup
  • Salin WAL hingga arsip terakhir dari pg_stop_backup
  • Salin data dari volume snapshotted

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.

Craig Ringer
sumber
Setelah memahami bahwa pg_start_backup () sebagian besar adalah "sesuatu dari pos pemeriksaan terkendali", kami memperoleh kepercayaan diri untuk sekadar mencoba dan melihat. Tampaknya dampak pada aplikasi yang berjalan diabaikan. (master datadir utama pada SSD) :-) Gagasan "belum teruji & mungkin tidak aman" yang Anda usulkan sedikit di atas tingkat kompetensi kami, dan keinginan untuk berpetualang.
Daniel
Oh, dan kami tidak mencoba rsync pada percobaan pertama. Karena kami sebenarnya ingin melihat beban tambahan pada master. Karena kita tidak pernah membutuhkan rsync run kedua, semuanya baik-baik saja. Kami belajar sesuatu dari itu.
Daniel
7

Ini adalah penggalian kuburan tetapi saya harus memperbaiki sesuatu di sini.

Jawaban sebelumnya menyatakan:

Anda dapat menggunakan nice dan ionice untuk membantu membatasi dampak I / O (tetapi tidak dampak cache); Namun, ada biaya untuk itu. Pencadangan akan memakan waktu lebih lama, dan sampai Anda menyelesaikan pencadangan dan menjalankan pg_stop_backup sistem Anda - seperti yang saya mengerti - mengakumulasikan WAL yang tidak dapat dihapus, mengakumulasi hutang pos pemeriksaan untuk pos pemeriksaan BESAR pada akhir pencadangan, dan mengumpulkan tabel dan indeks kembung 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.

Itu tidak benar. Sistem akan menjaga jumlah WAL yang tercantum dalam konfigurasi Anda (lihat dokumentasi online ). Jadi pada dasarnya, semakin tinggi nilai antara:

  • (2 + checkpoint_completion_ratio) * checkpoint_segments + 1
  • wal_keep_segments

Mari kita bayangkan kasus ini:

  • cadangan Anda membutuhkan waktu lama, karena ada ratusan pertunjukan untuk disalin
  • Anda memiliki retensi WAL kecil (checkpoint_segments ke 3, misalnya)
  • Anda tidak memiliki pengaturan pengarsipan WAL

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 ()".

pg_start_backup 
-----------------
B/D0020F18
(1 row)

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.

sterfield
sumber
3
Pengamatan yang sangat bagus. Ini bisa dihindari dengan pg_basebackup --xlog-method=streamjika saya tidak salah.
tomorrow__
2
Ya, sejak PG 9.2, Anda dapat mengalirkan WAL dengan cadangan basis. Ini akan membuka streaming kedua, jadi Anda harus memiliki max_wal_sendersset minimum ke 2. Ini adalah cara yang bagus untuk menghindari masalah "WAL yang hilang" di akhir cadangan.
sterfield
4

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.

Riki_tiki_tavi
sumber