Pernahkan anda mengalami Replikasi database PostgreSQL tiba-tiba terputus sinkronisasinya dan ketika anda cek log database Standby nya terdapat LOG Error “ could not receive data from WAL stream: ERROR: requested WAL segment [WAL SEGMENT ID] has already been removed ”atau contohnya seperti gambar berikut :
Mencari Penyebab Error
Sebelum mengatasi masalah tersebut kita perlu check terlebih dahulu lag data antar Master dan Slave dengan cara menggunakan query “select now()-pg_last_xact_replay_timestamp() as replication_lag;” query tersebut berfungsi untuk menampilkan lamanya lag berdasarkan timestamp ketika anda menjalankan query tersebut dan timestamp ketika replikasi anda berhenti karena terjadi error, selain untuk melihat lag antara server Master dan Slave Anda juga dapat melihat kapan replikasi terputus dengan menggunakan query “select pg_last_xact_replay_timestamp();”. Jika lag nya sangat besar maka sudah dipastikan replikasi antara database Master dan Slave sudah tidak berjalan seperti sebagaimana mestinya.
Masalah yang terjadi ketika log menampilkan error seperti gambar di atas adalah pada saat database Slave meminta WAL yang dibutuhkan untuk replikasi kepada database Master dan WAL yang dibutuhkan oleh database slave tersebut sudah tidak tersedia di direktori WAL database Master. Hal tersebut dapat terjadi karena WAL yang berada di database Master telah dialihkan ke direktori Archive , selain itu masalah ini bisa juga terjadi karena WAL tersebut corrupt atau terhapus karena human error.
Cara Mengatasi Error
Cara mengatasi permasalahan tersebut adalah dengan cara copy WAL yang dibutuhkan oleh database slave dari database master secara manual. Ketika WAL yang dibutuhkan sudah berhasil dicopy kan maka secara otomatis database slave akan melakukan recovery melalui WAL tersebut. Jika recovery yang dilakukan sudah berhasil maka akan muncul log yang menerangkan bahwa WAL tersebut sudah berhasil direcovery seperti gambar berikut :
Jika setelah selesai melakukan recovery database slave sudah tidak memunculkan log error maka WAL yang dibutuhkan oleh database slave sudah terpenuhi. Ekesekusi kembali query “select now()-pg_last_xact_replay_timestamp() as replication_lag;” untuk melihat status lag, jika lag tidak tertinggal jauh atau hanya tertinggal beberapa millisecond maka replikasi sudah berjalan seperti semula.
Tidak ada komentar:
Posting Komentar