PolarDB for PostgreSQL menerapkan konsistensi kuat di tingkat kernel, memastikan bahwa permintaan baca yang dikirim ke node mana pun dalam kluster selalu mengembalikan data terbaru yang telah dikomit.
Cakupan
Konsistensi global didukung pada versi berikut dari PolarDB for PostgreSQL:
PostgreSQL 16 (versi mesin minor 2.0.16.9.9.0 atau lebih baru)
PostgreSQL 14 (versi mesin minor 2.0.14.11.22.0 atau lebih baru)
Untuk memeriksa versi mesin minor, masuk ke Konsol atau jalankan SHOW polardb_version;. Jika versinya tidak memenuhi persyaratan, upgrade versi mesin minor. Untuk petunjuknya, lihat Lihat versi mesin minor.Latar Belakang
Secara default, node read-only di PolarDB menyediakan session consistency: klien yang menulis data dan segera membacanya kembali dalam sesi yang sama akan melihat nilai terbaru, bahkan ketika permintaan tersebut diarahkan ke node read-only. Namun, pembacaan dari sesi atau layanan yang berbeda tidak dijamin mencerminkan tulisan terbaru.
Kesenjangan ini menimbulkan masalah nyata dalam arsitektur layanan mikro. Setelah Layanan A menulis suatu nilai dan menerbitkan event melalui antrian pesan, Layanan B mungkin membaca dari node read-only dan masih melihat data lama. Tanpa konsistensi global, satu-satunya opsi aman adalah mengarahkan semua permintaan baca ke node RW—sehingga kapasitas node read-only tidak termanfaatkan dan aplikasi harus mempertahankan dua set koneksi database terpisah.
Konsistensi global menghilangkan batasan ini dengan menjamin bahwa setiap node read-only selalu mengembalikan data terbaru yang telah dikomit, terlepas dari sesi atau layanan mana yang mengeluarkan permintaan tersebut.
Cara Kerja
Setiap transaksi baca-tulis yang dikomit pada node RW diberi Commit Sequence Number (CSN). CSN menentukan urutan komit transaksi secara global dan menggantikan daftar transaksi aktif yang digunakan di PostgreSQL asli, sehingga memungkinkan mekanisme snapshot yang lebih efisien. Node RW mencatat setiap CSN dalam Write-Ahead Log (WAL), dan node read-only memutar ulang WAL untuk merekonstruksi status transaksi secara lengkap.
Saat klien melakukan kueri ke node read-only dalam mode konsistensi global:
Node read-only mengambil CSN terbaru dari node RW melalui jaringan.
Node tersebut membangun tampilan baca konsistensi kuat berdasarkan CSN tersebut dan menunggu pemutaran ulang WAL mencapai offset yang sesuai.
Node tersebut mengevaluasi visibilitas data menggunakan tampilan baca konsistensi kuat dan mengembalikan hasilnya ke klien.
FAQ
Bagaimana cara menonaktifkan konsistensi global untuk sesi tertentu?
Setelah konsistensi global diaktifkan pada Cluster Endpoint, pengaturan tersebut berlaku untuk semua koneksi baru. Untuk menonaktifkannya pada satu sesi tertentu, jalankan:
SET polar_scc_enable = off;Bagaimana cara menyesuaikan timeout konsistensi global?
Di Konsol PolarDB, klik Configure di samping Cluster Endpoint target (atau Settings di kotak dialog) dan perbarui nilai Global Consistency Timeout.
Saat terjadi timeout, klien menerima:
SCC timeout waiting for WAL replayUntuk kluster dengan beban kerja tulis yang berat atau tidak stabil, tingkatkan nilai Global Consistency Timeout untuk mengurangi frekuensi timeout.
Bagaimana cara menghindari latensi baca dalam skenario beban tulis rendah?
Dalam skenario beban tulis rendah, node read-only mungkin menunggu pemutaran ulang WAL meskipun tidak ada data baru. Untuk mengurangi latensi ini, atur parameter synchronous_commit menjadi on di Konsol PolarDB. Untuk petunjuknya, lihat Setel parameter kluster.
Bagaimana cara menurunkan tingkat konsistensi secara otomatis setelah terjadi timeout?
Di Konsol PolarDB, klik Configure di samping Cluster Endpoint target (atau Settings di kotak dialog), lalu atur Global Consistency Timeout Policy menjadi 2, Automatic Downgrade to Inconsistent Read Due to Timeout. Saat terjadi timeout, kueri akan dilanjutkan dengan pembacaan tidak konsisten dan tidak ada error yang dikembalikan ke klien.
