Tanpa pemisahan baca/tulis, Anda harus mengonfigurasi string koneksi terpisah untuk node primary dan setiap node read-only di aplikasi Anda. Saat menambahkan node read-only untuk meningkatkan kapasitas baca, kode aplikasi menjadi lebih kompleks. PolarDB for PostgreSQL (Compatible with Oracle) mengatasi hal ini melalui proxy bawaan yang menyediakan satu Titik akhir kluster: permintaan tulis diarahkan ke node primary, sedangkan permintaan baca didistribusikan ke node-node yang tersedia berdasarkan beban saat ini—tanpa perlu mengubah aplikasi.
Cara kerja
Hubungkan aplikasi Anda ke Titik akhir kluster dengan mode Read and Write (Automatic Read-write Splitting) diaktifkan.
Proxy bawaan memeriksa setiap permintaan masuk dan mengklasifikasikannya sebagai baca atau tulis.
Permintaan tulis diarahkan ke node primary. Permintaan baca didistribusikan ke node-node yang tersedia berdasarkan beban, yang diukur dari jumlah permintaan yang mengantri di setiap node.
Proxy memantau kondisi node secara terus-menerus. Jika suatu node gagal atau latensinya melebihi ambang batas yang dikonfigurasi, proxy akan berhenti mengirim permintaan ke node tersebut dan mendistribusikan ulang trafik ke node-node yang sehat. Ketika node tersebut pulih, proxy secara otomatis memasukkannya kembali.
Manfaat
Titik akhir terpadu, tanpa perubahan aplikasi
Satu string koneksi menangani seluruh trafik. Tambahkan node read-only untuk meningkatkan kapasitas baca tanpa memodifikasi aplikasi Anda.
Konsistensi baca tingkat session
Dalam satu session, proxy melacak progres sinkronisasi data setiap node dan hanya mengarahkan permintaan baca ke node yang datanya sudah mutakhir. Hal ini mencegah pembacaan data lama dalam session yang sama.
Distribusi merata pernyataan PREPARE
Pernyataan PREPARE yang mengandung operasi tulis, beserta pernyataan EXECUTE yang sesuai, hanya dikirim ke node primary. Pernyataan PREPARE yang hanya berisi operasi baca disiarkan ke semua node, dan pernyataan EXECUTE yang sesuai diarahkan berdasarkan beban.
Latensi lebih rendah dibanding proxy eksternal
Proxy bawaan berjalan sebagai komponen native kluster, sehingga menghilangkan langkah penguraian dan penerusan tambahan yang biasanya diperkenalkan oleh konfigurasi proxy eksternal.
Manajemen kondisi node secara otomatis
Pemeriksaan kondisi dijalankan terus-menerus pada semua node. Jika suatu node gagal atau melebihi ambang batas latensi, trafik segera dialihkan ke node-node yang sehat, sehingga menjaga ketersediaan aplikasi Anda meskipun node read-only tertentu mengalami kegagalan.
Batasan
Metode koneksi dan pernyataan yang tidak didukung:
Menghubungkan melalui mode replikasi. Untuk mengatur kluster dua node dengan arsitektur replikasi primary/secondary, gunakan langsung Titik akhir utama.
Mendeklarasikan atribut
%ROWTYPEmenggunakan nama tabel temporary:create temp table fullname (first text, last text); select '(Joe,von Blow)'::fullname, '(Joe,d''Blow)'::fullname;Membuat sumber daya temporary di dalam fungsi:
Jika suatu fungsi membuat tabel temporary dan pernyataan SQL kemudian melakukan kueri terhadap tabel tersebut, Anda mungkin mendapatkan error "table does not exist".
Jika suatu fungsi berisi pernyataan
PREPARE, pernyataanEXECUTEyang sesuai mungkin gagal dengan error "PREPARE statement name does not exist".
Batasan routing:
Semua permintaan dalam satu transaksi diarahkan ke node primary. Penyeimbangan beban dilanjutkan setelah transaksi berakhir.
Semua pernyataan yang menggunakan fungsi—kecuali fungsi agregat seperti
COUNT()danSUM()—diarahkan ke node primary.
Menyiapkan pemisahan baca/tulis
Untuk menggunakan pemisahan baca/tulis, konfigurasikan Titik akhir kluster dengan mode Read and Write (Automatic Read-write Splitting):
Untuk membuat Titik akhir kluster kustom, lihat Create and modify a custom cluster endpoint.
Untuk memodifikasi Titik akhir kluster yang sudah ada (mengubah mode baca/tulisnya, menambah atau menghapus node, dan sebagainya), lihat FAQ.
Pengaturan lanjutan
Pemisahan transaksi — Mengarahkan pernyataan read-only di dalam transaksi ke node read-only, bukan selalu ke node primary. Aktifkan fitur ini jika workload Anda banyak melibatkan transaksi dan node read-only belum dimanfaatkan secara optimal. Lihat Transaction splitting.
Tingkat konsistensi — Mengontrol seberapa ketat proxy menegakkan konsistensi baca di seluruh node. Melemahkan tingkat konsistensi dapat meningkatkan throughput baca; memperketatnya mengurangi risiko pembacaan data lama. Lihat Consistency levels.
FAQ
Mengapa saya tidak bisa langsung membaca catatan setelah memasukkannya?
Adanya latensi replikasi antara node primary dan node read-only menyebabkan baris yang baru dimasukkan mungkin belum terlihat di node read-only yang menangani kueri Anda. PolarDB mendukung konsistensi sesi, yang memungkinkan Anda melakukan kueri terhadap data yang baru saja Anda tulis dalam sesi yang sama.
Mengapa node read-only saya tidak menunjukkan beban?
Secara default, semua permintaan di dalam transaksi diarahkan ke node primary. Jika tool benchmark Anda (seperti sysbench) membungkus setiap kueri dalam transaksi, seluruh trafik akan menuju node primary dan node read-only tampak tidak aktif.
Untuk mengatasi hal ini di sysbench, nonaktifkan transaksi: gunakan --oltp-skip-trx=on di sysbench 0.5 atau --skip-trx=on di sysbench 1.0.
Untuk workload produksi yang banyak melibatkan transaksi, aktifkan pemisahan transaksi di Konsol agar pernyataan read-only di dalam transaksi diarahkan ke node read-only. Lihat Transaction splitting.
Mengapa satu node menerima lebih banyak permintaan daripada yang lain?
Permintaan didistribusikan berdasarkan beban (jumlah permintaan yang mengantri). Node dengan kedalaman antrian lebih rendah akan menerima lebih banyak permintaan masuk. Ini adalah perilaku yang diharapkan—proxy terus-menerus menyeimbangkan ulang trafik seiring fluktuasi beban.
Apakah PolarDB mendukung pembacaan tanpa delay?
Tidak. Dalam kondisi beban normal, terdapat latensi replikasi beberapa milidetik antara node primary dan node read-only. Jika mode baca/tulis Titik akhir kluster diatur ke Read and Write (Automatic Read-write Splitting), data tidak dapat dibaca tanpa delay setelah ditulis. Jika aplikasi Anda memerlukan pembacaan tanpa delay setelah penulisan, hubungkan ke Titik akhir utama. Titik akhir utama selalu mengarah ke node primary dan segera mengembalikan data terbaru.
Apakah node read-only baru secara otomatis disertakan dalam pemisahan baca/tulis?
Session yang dibuat setelah Anda menambahkan node read-only akan mengarahkan permintaan baca ke node baru tersebut. Session yang dibuat sebelum penambahan node tidak akan melakukannya. Untuk menyertakan node baru dalam session yang sudah ada, tutup dan buka kembali session tersebut—misalnya, dengan me-restart aplikasi Anda.