- Ekstensi replikasi active-active untuk PostgreSQL yang dibuat dan dirilis secara terbuka oleh AWS
- Saat perlu menulis dan memperbarui data di beberapa instans PostgreSQL, alih-alih model active-standby lama yang hanya menerima perubahan di satu instans tertentu, ini memungkinkan pembangunan arsitektur yang mendukung perubahan serentak dan replikasi di beberapa instans
- Cocok untuk skenario seperti konfigurasi database highly available di beberapa region, meminimalkan latensi tulis, pembaruan blue/green aplikasi, dan migrasi data dua arah
- Memanfaatkan replikasi logis untuk mendukung deteksi konflik, penyelesaian konflik tulis, dan konversi format database target
Konsep replikasi active-active
- Replikasi (Replication) adalah teknologi untuk menyinkronkan perubahan antar database
- Arsitektur active-standby PostgreSQL yang ada selama ini hanya menerima perubahan di satu instans, sementara sisanya bersifat read-only, sehingga satu lokasi berperan sebagai sumber data tunggal
- pgactive menyediakan topologi replikasi active-active yang memungkinkan penulisan data secara bersamaan di beberapa instans
- Pendekatan ini cocok untuk lingkungan yang memerlukan banyak titik tulis, misalnya deployment multi-region atau migrasi dua arah
- Dalam model active-active, konflik, latensi, dan keterbatasan sebagian fitur memerlukan pengelolaan tersendiri
Teknologi inti: replikasi logis
- Replikasi logis (Logical Replication) mengirimkan data dalam format yang dapat diinterpretasikan oleh sistem eksternal
- Melalui replikasi logis, berbagai fungsi tambahan dapat diimplementasikan di database tujuan, seperti deteksi konflik, penyelesaian konflik tulis, dan transformasi kueri
- PostgreSQL memperkenalkan replikasi logis bawaan pada versi 10 di tahun 2017, tetapi replikasi active-active memerlukan kemampuan tambahan
- Karena karakteristik desain PostgreSQL, kemampuan tersebut dapat dikembangkan dan diterapkan dalam bentuk ekstensi (extension)
- Komunitas pengembang PostgreSQL juga secara bertahap menambahkan kemampuan terkait ke proyek inti
1 komentar
Opini Hacker News
Yang paling awal muncul dan masih open source sampai sekarang adalah BDR1 (tautan), dan pgactive dibangun di atas ini
BDR2 adalah penulisan ulang BDR1 menjadi closed source, dan akhirnya ditinggalkan
pglogical v1 dan v2 (keduanya open source, tautan) dirilis, dan dari keduanya v1 dimodifikasi besar-besaran lalu digabungkan ke Postgres 10
Berdasarkan pengalaman dengan fitur logical replication di Postgres 10, 2nd Quadrant mulai mengembangkan pglogical v2, dan dari sinilah pgEdge juga lahir
Setelah itu 2nd Quadrant membuat pglogical v3 dan BDR v3 versi closed source, lalu keduanya digabung menjadi BDR v4
Setelahnya nama produk BDR diubah menjadi Postgres Distributed(PGD, tautan)
Setelah 2ndQuadrant diakuisisi oleh EDB, EDB merilis PGD v6
Jika terjadi konflik, nilai yang terakhir ditulis berdasarkan timestamp akan menjadi yang akhirnya diterapkan
Riwayat konflik yang terjadi disimpan di tabel khusus bernama pgactive_conflict_history, jadi riwayatnya bisa ditinjau dan diselesaikan secara manual
Untuk detail dan dokumentasi, lihat di sini
Kalau kemampuan seperti ini bisa diterima secara resmi ke Postgres, sepertinya akan menarik
Misalnya, saya ingin membaca data dari production atau staging, tetapi hanya bisa memodifikasinya secara lokal dan hasilnya tidak dipantulkan kembali ke upstream, dengan memakai database sekunder
Saat ini kebanyakan dilakukan dengan membuat snapshot secara berkala lewat skrip (cron dan sejenisnya) menggunakan dump data atau query, menyimpannya ke S3, lalu mengunduh dan memulihkan datanya secara lokal
Cara ini umumnya efektif, tetapi kadang pembangunan indeks memakan waktu terlalu lama
Risiko hukum dan etisnya besar, jadi kebanyakan perusahaan tidak merekomendasikan cara seperti ini
Dengan begitu Anda bisa memodifikasi tabel lokal tanpa memengaruhi primary
Rekomendasi perintah
createdb --templateSaya tidak terpikir strategi merge yang bisa berlaku untuk semua situasi
Bukan berarti write diblokir di replica, hanya saja hasilnya tidak menyebar ke tempat lain
Yang terbaik adalah merancang arsitektur agar tidak ada tumpang tindih area data yang akan ditulis di seluruh instance aktif
Dalam kasus seperti itu, alat seperti pgactive cukup berguna
Atau, lebih baik sejak awal memakai database terdistribusi (seperti Yugabyte)
Semua master tetap bisa membaca semua schema, tetapi untuk write masing-masing hanya menangani bagiannya sendiri
Penasaran apakah selain schema, partition dan sebagainya juga bisa dipakai untuk membagi tanggung jawab
Saya tidak langsung melihat fitur ini dipakai di produk mereka sendiri
RDS memakai block replication, Aurora memakai SAN replication miliknya sendiri
Dugaan saya, mungkin ini ditujukan untuk pemakaian di DMS
Saya mempertanyakan kenapa ini perlu dilakukan pada database relasional ACID yang kuat
Namun ada kabar bahwa 1 bulan lalu ini secara resmi dirilis sebagai open source ke komunitas (berita resmi)
Demi bisa tidur nyenyak di malam hari, saya ingin sebisa mungkin menghindarinya
Kombinasi patroni+etcd+haproxy sering direkomendasikan, dan melihat orang-orang yang benar-benar memakainya merekomendasikannya dengan antusias, tampaknya memang ada alasannya
Namun saat melihat file contoh dengan docker compose, rasanya agak memberatkan
pgpool terlihat sederhana karena sepertinya cukup diletakkan di depan tiap postgres
Saya penasaran dengan rekomendasi atau pengalaman dari orang-orang yang menyukai Postgres di lingkungan kerja nyata
Targetnya adalah membangun klaster berbasis docker compose sesederhana mungkin, dengan ketersediaan tinggi, (minimal) tanpa kehilangan data, dan point-in-time recovery
<i>Pgactive: Active-Active Replication Extension for PostgreSQL on Amazon RDS</i>
Tulisan Hacker News (tulisan Oktober 2023, 1 komentar)
Artinya, setiap orang perlu menerima kelebihan dan kekurangannya sesuai situasi masing-masing