Saya akan menambahkan beberapa info dan referensi terbaru ke jawaban bagus @ max-malysh di atas.
Singkatnya, jika Anda melakukan sesuatu pada tuannya, itu perlu direplikasi pada budak. Postgres menggunakan catatan WAL untuk ini, yang dikirim setelah setiap tindakan yang dicatat pada master ke budak. Budak kemudian mengeksekusi aksi tersebut dan keduanya kembali sinkron. Dalam salah satu dari beberapa skenario, Anda bisa mengalami konflik pada budak dengan apa yang masuk dari master dalam tindakan WAL. Di sebagian besar dari mereka, ada transaksi yang terjadi pada budak yang bertentangan dengan apa yang ingin diubah oleh tindakan WAL. Dalam hal ini, Anda memiliki dua opsi:
- Tunda penerapan tindakan WAL sebentar, biarkan budak menyelesaikan transaksi yang bertentangan, lalu terapkan tindakan tersebut.
- Batalkan permintaan yang bertentangan pada budak.
Kami prihatin dengan # 1, dan dua nilai:
max_standby_archive_delay
- ini adalah penundaan yang digunakan setelah pemutusan hubungan yang lama antara master dan slave, saat data sedang dibaca dari arsip WAL, yang bukan merupakan data terkini.
max_standby_streaming_delay
- penundaan digunakan untuk membatalkan kueri ketika entri WAL diterima melalui replikasi streaming.
Umumnya, jika server Anda dimaksudkan untuk replikasi ketersediaan tinggi, Anda ingin mempersingkat nomor ini. Pengaturan default 30000
(milidetik jika tidak ada unit yang diberikan) sudah cukup untuk ini. Namun, jika Anda ingin menyiapkan sesuatu seperti arsip, pelaporan- atau replika baca yang mungkin memiliki kueri yang berjalan sangat lama, Anda dapat menyetelnya ke sesuatu yang lebih tinggi untuk menghindari kueri yang dibatalkan. 900s
Pengaturan yang direkomendasikan di atas sepertinya merupakan titik awal yang baik. Saya tidak setuju dengan dokumen resmi tentang menetapkan nilai tak terbatas -1
sebagai ide yang bagus - yang dapat menutupi beberapa kode buggy dan menyebabkan banyak masalah.
Satu-satunya peringatan tentang kueri yang berjalan lama dan menyetel nilai-nilai ini lebih tinggi adalah bahwa kueri lain yang berjalan pada budak secara paralel dengan kueri yang berjalan lama yang menyebabkan tindakan WAL ditunda akan melihat data lama sampai kueri yang panjang selesai. Pengembang perlu memahami ini dan membuat serialisasi kueri yang seharusnya tidak berjalan secara bersamaan.
Untuk penjelasan lengkap tentang bagaimana max_standby_archive_delay
dan max_standby_streaming_delay
bekerja dan mengapa, buka di sini .