{"id":2549,"date":"2024-01-02T11:24:51","date_gmt":"2024-01-02T05:54:51","guid":{"rendered":"https:\/\/bentocase.tanshcreative.com\/?p=2549"},"modified":"2026-08-28T13:19:07","modified_gmt":"2026-08-28T13:19:07","slug":"mengatasi-replication-lag-di-arsitektur-postgresql-global","status":"publish","type":"post","link":"https:\/\/agussyarif.my.id\/index.php\/2024\/01\/02\/mengatasi-replication-lag-di-arsitektur-postgresql-global\/","title":{"rendered":"Mengatasi  &#8220;Replication Lag&#8221; di Arsitektur PostgreSQL Global"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"2549\" class=\"elementor elementor-2549\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7239b84c e-flex e-con-boxed e-con e-parent\" data-id=\"7239b84c\" data-element_type=\"container\" data-e-type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-3f2d03fe elementor-widget elementor-widget-text-editor\" data-id=\"3f2d03fe\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Bagi kita yang mengelola arsitektur database skala <i data-path-to-node=\"8\" data-index-in-node=\"51\">enterprise<\/i> dengan sistem replikasi lintas benua (seperti dari <i data-path-to-node=\"8\" data-index-in-node=\"113\">Data Center<\/i> utama ke <i data-path-to-node=\"8\" data-index-in-node=\"134\">Disaster Recovery Center<\/i> \/ DRC), ada satu fenomena yang pasti pernah membuat detak jantung berdebar lebih cepat: <b data-path-to-node=\"8\" data-index-in-node=\"247\">Replication Lag<\/b>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-12a3cd29 elementor-widget elementor-widget-spacer\" data-id=\"12a3cd29\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-778b2507 elementor-widget elementor-widget-text-editor\" data-id=\"778b2507\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Pernahkah kita menyadari situasi di mana sebuah transaksi sudah dinyatakan sukses (<code data-path-to-node=\"9\" data-index-in-node=\"83\">COMMIT<\/code>) di server Primary, tetapi ketika pengguna melakukan <i data-path-to-node=\"9\" data-index-in-node=\"143\">refresh<\/i> halaman yang mengambil data dari server Standby, data tersebut belum muncul? Jeda waktu inilah yang kita sebut sebagai <i data-path-to-node=\"9\" data-index-in-node=\"270\">Replication Lag<\/i>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-24f52cc3 elementor-widget elementor-widget-text-editor\" data-id=\"24f52cc3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<p>Mari kita bedah anatomi dari masalah ini, mengapa ia terjadi, dan bagaimana cara profesional menanganinya.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-3fece20d elementor-widget elementor-widget-spacer\" data-id=\"3fece20d\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-5746971e elementor-widget elementor-widget-dtr-quote\" data-id=\"5746971e\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"dtr-quote.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<div class=\"dtr-quote dtr-quote__left-align clearfix\"><blockquote>\u201cReplication lag bukanlah sebuah bug yang harus dibasmi, melainkan hukum fisika jaringan yang harus kita kelola. Mengukur jeda milidetik antara dua data center adalah seni menyeimbangkan konsistensi data dan ketersediaan sistem\u201d<\/blockquote><p class=\"dtr-quote__author\">Agus Syarif<\/p><span class=\"dtr-quote__source\">Senior Database Engineer<\/span><\/div>\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-70914797 elementor-widget elementor-widget-spacer\" data-id=\"70914797\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"spacer.default\">\n\t\t\t\t\t\t\t<div class=\"elementor-spacer\">\n\t\t\t<div class=\"elementor-spacer-inner\"><\/div>\n\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-4f103fa1 elementor-widget elementor-widget-image\" data-id=\"4f103fa1\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"image.default\">\n\t\t\t\t\t\t\t\t\t\t\t\t<figure class=\"wp-caption\">\n\t\t\t\t\t\t\t\t\t\t<img decoding=\"async\" src=\"https:\/\/agussyarif.my.id\/wp-content\/uploads\/elementor\/thumbs\/Gemini_Generated_Image_f56b10f56b10f56b-scaled-rskk13ow9nbc86jlqs80se0slfl18yrdbe8zzppe8o.jpg\" title=\"Replication Lag Architecture\" alt=\"Replication Lag Architecture\" loading=\"lazy\" \/>\t\t\t\t\t\t\t\t\t\t\t<figcaption class=\"widget-image-caption wp-caption-text\">Gambar 2: Replication Lag Architecture<\/figcaption>\n\t\t\t\t\t\t\t\t\t\t<\/figure>\n\t\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-465c64c0 elementor-widget elementor-widget-text-editor\" data-id=\"465c64c0\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h5 data-path-to-node=\"12\">Apa Sebenarnya Replication Lag Itu?<\/h5><p data-path-to-node=\"13\">Dalam arsitektur PostgreSQL (terutama pada <i data-path-to-node=\"13\" data-index-in-node=\"43\">Asynchronous Replication<\/i> yang biasa digunakan untuk DRC), aliran data terjadi melalui pengiriman <i data-path-to-node=\"13\" data-index-in-node=\"140\">Write-Ahead Logs<\/i> (WAL).<\/p><p data-path-to-node=\"14\">Idealnya, siklus ini berjalan instan:<\/p><ol><li style=\"list-style-type: none;\"><ol><li data-path-to-node=\"14\">Server <b data-path-to-node=\"15,0,0\" data-index-in-node=\"7\">Primary<\/b> mencatat transaksi ke dalam WAL.<\/li><li data-path-to-node=\"14\">Proses <b data-path-to-node=\"15,1,0\" data-index-in-node=\"7\">WAL Sender<\/b> mengirimkannya melalui jaringan.<\/li><li data-path-to-node=\"14\">Proses <b data-path-to-node=\"15,2,0\" data-index-in-node=\"7\">WAL Receiver<\/b> di server <b data-path-to-node=\"15,2,0\" data-index-in-node=\"30\">Standby<\/b> menerimanya.<\/li><li data-path-to-node=\"14\">Proses <b data-path-to-node=\"15,3,0\" data-index-in-node=\"7\">Startup<\/b> di Standby menerapkan (<i data-path-to-node=\"15,3,0\" data-index-in-node=\"38\">apply\/replay<\/i>) WAL tersebut ke dalam disk.<\/li><\/ol><\/li><\/ol><p data-path-to-node=\"16\"><i data-path-to-node=\"16\" data-index-in-node=\"0\">Replication Lag<\/i> terjadi ketika kecepatan langkah ke-4 (Apply) tertinggal jauh dibandingkan kecepatan langkah ke-1 (Write di Primary). Akibatnya, paket-paket data menumpuk seperti kemacetan lalu lintas, membuat LSN (<i data-path-to-node=\"16\" data-index-in-node=\"215\">Log Sequence Number<\/i>) di Standby tertinggal di belakang Primary.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-11c799d3 elementor-widget elementor-widget-text-editor\" data-id=\"11c799d3\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h5 data-path-to-node=\"17\">3 Potensi Utama Penyebab Lag<\/h5><p data-path-to-node=\"18\">Berdasarkan pengalaman panjang di lapangan, <i data-path-to-node=\"18\" data-index-in-node=\"44\">lag<\/i> jarang sekali disebabkan oleh kelemahan bawaan PostgreSQL. Biasanya, ini adalah gejala dari arsitektur yang kewalahan. Tiga penyebab utamanya adalah:<\/p><ol><li data-path-to-node=\"18\"><b data-path-to-node=\"19\" data-index-in-node=\"0\">Latensi Jaringan (WAN Fisik)<\/b> Kita tidak bisa mengalahkan hukum fisika. Mengirimkan jutaan paket data per detik melalui internet antar data center membutuhkan waktu. Jika <i data-path-to-node=\"19\" data-index-in-node=\"190\">bandwidth<\/i> jaringan antar lokasi penuh atau latensinya sangat tinggi, WAL Sender di Primary tidak akan bisa mengirimkan data secepat aplikasi menuliskannya.<\/li><li data-path-to-node=\"18\"><b data-path-to-node=\"20\" data-index-in-node=\"0\">Lonjakan DML Masif (Batch Jobs)<\/b> Seringkali kita menjalankan proses <i data-path-to-node=\"20\" data-index-in-node=\"70\">batch UPDATE<\/i>, <i data-path-to-node=\"20\" data-index-in-node=\"84\">DELETE<\/i>, atau <i data-path-to-node=\"20\" data-index-in-node=\"97\">Data Migration<\/i> massal di server Primary pada malam hari. Proses ini menghasilkan volume WAL yang luar biasa besar dalam waktu singkat. Server Standby, yang seringkali memiliki spesifikasi I\/O disk yang lebih lambat atau sedang melayani kueri <em>reporting<\/em> yang berat, akan kewalahan &#8220;<em>mengunyah<\/em>&#8221; dan menerapkan (<i data-path-to-node=\"20\" data-index-in-node=\"404\">replay<\/i>) volume WAL raksasa tersebut.<\/li><li data-path-to-node=\"18\"><b data-path-to-node=\"21\" data-index-in-node=\"0\">Konflik Penerapan (Apply Conflicts)<\/b> Ini adalah skenario yang paling sering luput dari perhatian. Server Standby kita tidak hanya diam; ia biasanya digunakan untuk <i data-path-to-node=\"21\" data-index-in-node=\"166\">Read-Only Queries<\/i> (seperti laporan analitik yang memakan waktu berjam-jam). Jika server Primary menghapus sebuah baris data (dan mengirimkan instruksi hapus tersebut via WAL), tetapi server Standby sedang menjalankan kueri lambat yang sedang &#8220;membaca&#8221; baris data tersebut, PostgreSQL di Standby akan menunda penerapan WAL tersebut untuk mencegah pembacaan data yang rusak. Ini disebut <i data-path-to-node=\"21\" data-index-in-node=\"551\">Apply Conflict<\/i>, dan akan memicu <i data-path-to-node=\"21\" data-index-in-node=\"583\">lag<\/i> hingga kueri laporan tersebut selesai (atau dibatalkan paksa).<\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-a1aeaff elementor-widget elementor-widget-text-editor\" data-id=\"a1aeaff\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h5 data-path-to-node=\"22\">Cara Mengendalikan Lag<\/h5><p data-path-to-node=\"23\">Bagaimana kita menjaga agar kemacetan ini tidak menjadi bencana data?<\/p><ol><li data-path-to-node=\"23\"><b data-path-to-node=\"24,0,0\" data-index-in-node=\"0\">Pantau LSN secara Real-Time:<\/b> Kita wajib memantau <i data-path-to-node=\"24,0,0\" data-index-in-node=\"49\">view<\/i> <code data-path-to-node=\"24,0,0\" data-index-in-node=\"54\">pg_stat_replication<\/code> di server Primary. Selisih antara <code data-path-to-node=\"24,0,0\" data-index-in-node=\"108\">pg_current_wal_lsn()<\/code> dan <code data-path-to-node=\"24,0,0\" data-index-in-node=\"133\">replay_lsn<\/code> dari Standby adalah metrik paling krusial. Konversikan selisih LSN ini menjadi hitungan <i data-path-to-node=\"24,0,0\" data-index-in-node=\"232\">Byte<\/i> atau detik untuk memicu sistem <i data-path-to-node=\"24,0,0\" data-index-in-node=\"268\">alerting<\/i> (seperti Prometheus\/Grafana) jika lag melebihi batas toleransi.<\/li><li data-path-to-node=\"23\"><b data-path-to-node=\"24,1,0\" data-index-in-node=\"0\">Gunakan Replication Slots:<\/b> Jika <i data-path-to-node=\"24,1,0\" data-index-in-node=\"32\">lag<\/i> terjadi terlalu lama, server Primary bisa saja menghapus file WAL lama yang sebenarnya masih dibutuhkan oleh Standby untuk mengejar ketertinggalan. Hal ini akan merusak replikasi secara permanen. Gunakan <i data-path-to-node=\"24,1,0\" data-index-in-node=\"240\">Replication Slots<\/i> agar Primary dengan cerdas menahan file WAL di disk sampai Standby benar-benar selesai menerapkannya. (Peringatan: Pantau kapasitas disk Primary kita, karena file WAL yang ditahan bisa membuat disk penuh!).<\/li><li data-path-to-node=\"23\"><b data-path-to-node=\"24,2,0\" data-index-in-node=\"0\">Aktifkan Hot Standby Feedback:<\/b> Untuk mengatasi masalah <i data-path-to-node=\"24,2,0\" data-index-in-node=\"55\">Apply Conflict<\/i>, kita dapat mengatur parameter <code data-path-to-node=\"24,2,0\" data-index-in-node=\"101\">hot_standby_feedback = on<\/code>. Ini membuat Standby secara berkala memberi tahu Primary transaksi mana saja yang sedang aktif dibaca, sehingga Primary tidak akan langsung membersihkan data wal\u00a0yang masih dibutuhkan oleh Standby.<\/li><\/ol>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<div class=\"elementor-element elementor-element-649560f elementor-widget elementor-widget-text-editor\" data-id=\"649560f\" data-element_type=\"widget\" data-e-type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t\t\t\t\t\t<h5 data-path-to-node=\"25\">Kesimpulan<\/h5><p data-path-to-node=\"26\"><i data-path-to-node=\"26\" data-index-in-node=\"0\">Replication Lag<\/i> di infrastruktur Asinkronus adalah sesuatu yang normal dan pasti terjadi. Tugas kita bukanlah menghilangkannya hingga menjadi absolut nol, melainkan mendesain topologi jaringan dan arsitektur <i data-path-to-node=\"26\" data-index-in-node=\"208\">hardware<\/i> agar <i data-path-to-node=\"26\" data-index-in-node=\"222\">lag<\/i> tersebut selalu berada di bawah <i data-path-to-node=\"26\" data-index-in-node=\"258\">Recovery Point Objective<\/i> (RPO) yang disepakati oleh bisnis.<\/p><p data-path-to-node=\"27\">Pastikan kita memiliki visibilitas yang baik terhadap metrik ini, karena <i data-path-to-node=\"27\" data-index-in-node=\"73\">Standby<\/i> yang tertinggal berjam-jam sama tidak bergunanya dengan tidak memiliki <i data-path-to-node=\"27\" data-index-in-node=\"152\">Standby<\/i> sama sekali saat bencana benar-benar melanda.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Bagi kita yang mengelola arsitektur database skala enterprise dengan sistem replikasi lintas benua (seperti dari Data Center utama ke Disaster Recovery Center \/ DRC), ada satu fenomena yang pasti pernah membuat detak jantung berdebar lebih cepat: Replication Lag. Pernahkah kita menyadari situasi di mana sebuah transaksi sudah dinyatakan sukses (COMMIT) di server Primary, tetapi ketika [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":4397,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_monsterinsights_skip_tracking":false,"footnotes":""},"categories":[57],"tags":[44,43,56,58],"class_list":["post-2549","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-replication","tag-edb","tag-postgresql","tag-replication-flow","tag-replicationlag"],"aioseo_notices":[],"_links":{"self":[{"href":"https:\/\/agussyarif.my.id\/index.php\/wp-json\/wp\/v2\/posts\/2549","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/agussyarif.my.id\/index.php\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/agussyarif.my.id\/index.php\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/agussyarif.my.id\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/agussyarif.my.id\/index.php\/wp-json\/wp\/v2\/comments?post=2549"}],"version-history":[{"count":22,"href":"https:\/\/agussyarif.my.id\/index.php\/wp-json\/wp\/v2\/posts\/2549\/revisions"}],"predecessor-version":[{"id":4421,"href":"https:\/\/agussyarif.my.id\/index.php\/wp-json\/wp\/v2\/posts\/2549\/revisions\/4421"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/agussyarif.my.id\/index.php\/wp-json\/wp\/v2\/media\/4397"}],"wp:attachment":[{"href":"https:\/\/agussyarif.my.id\/index.php\/wp-json\/wp\/v2\/media?parent=2549"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/agussyarif.my.id\/index.php\/wp-json\/wp\/v2\/categories?post=2549"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/agussyarif.my.id\/index.php\/wp-json\/wp\/v2\/tags?post=2549"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}