PolarDB for PostgreSQL (Kompatibel dengan Oracle) menyediakan dua tingkat konsistensi untuk memenuhi kebutuhan berbagai skenario bisnis: konsistensi akhir dan konsistensi sesi. Konsistensi mengacu pada fitur dalam atomicity, consistency, isolation, durability (ACID).
Masalah dan solusi
Replikasi data adalah metode sederhana yang digunakan untuk mereplikasi data dari node utama ke node baca-saja di PolarDB. Anda hanya perlu mentransfer log tulis-dahulu (WALs) dari node utama ke node baca-saja secara asinkron. Replikasi ini memungkinkan node baca-saja memproses kueri, mengurangi beban pada node utama, dan memastikan ketersediaan tinggi. Namun, jika menggunakan node baca-saja untuk memproses permintaan baca, beberapa masalah dapat terjadi:
1. Biasanya, database utama dan sekunder memiliki titik akhir yang berbeda. Saat mengakses database yang berbeda, Anda harus memodifikasi kode aplikasi untuk mengubah titik akhir yang digunakan untuk terhubung ke database.
2. Data direplikasi secara asinkron, sehingga mungkin tidak langsung disinkronkan ke replika baca setelah klien melakukan modifikasi data. Akibatnya, data di node baca-saja mungkin tidak terkini, menyebabkan ketidaksesuaian data.
Untuk menyelesaikan masalah pertama, PolarDB menggunakan PolarProxy sebagai proksi untuk melakukan operasi pemisahan baca/tulis. Dalam kebanyakan kasus, proksi membangun koneksi antara aplikasi dan PolarDB, serta mengurai setiap Pernyataan SQL. Permintaan tulis seperti UPDATE, DELETE, INSERT, dan CREATE diteruskan ke database utama, sedangkan operasi SELECT diteruskan ke database sekunder.

Fitur pemisahan baca/tulis tidak dapat memperbaiki masalah ketidaksesuaian data yang disebabkan oleh penundaan replikasi. Jika beban pada database berat, penundaan replikasi meningkat. Misalnya, saat menjalankan pernyataan DDL untuk menambahkan kolom ke tabel besar atau menyisipkan sejumlah besar data, Anda tidak dapat mengambil data terbaru dari node baca-saja.
PolarDB menyinkronkan data antara node utama dan node baca-saja melalui replikasi fisik asinkron. Setelah data pada node utama diperbarui, pembaruan tersebut disinkronkan ke node baca-saja. Penundaan replikasi bervariasi berdasarkan beban tulis pada node utama, tetapi biasanya hanya beberapa milidetik. Replikasi asinkron memastikan konsistensi akhir antara node utama dan node baca-saja. PolarDB menyediakan tingkat konsistensi berikut untuk memenuhi kebutuhan konsistensi Anda:
Untuk informasi lebih lanjut tentang cara mengubah tingkat konsistensi, lihat Konfigurasi PolarProxy.
Konsistensi akhir
Deskripsi
PolarDB beroperasi dalam arsitektur pemisahan baca/tulis. Pemisahan baca/tulis tradisional hanya memastikan konsistensi akhir. Hasil yang diambil dari node yang berbeda mungkin berbeda karena penundaan replikasi utama/sekunder. Misalnya, jika Anda berulang kali menjalankan pernyataan berikut dalam sesi, hasil yang dikembalikan oleh setiap pernyataan SELECT mungkin berbeda, tergantung pada penundaan replikasi.
INSERT INTO t1(id, price) VALUES(111, 96); UPDATE t1 SET price = 100 WHERE id=111; SELECT price FROM t1;Skenario yang Sesuai
Untuk mengurangi beban pada node utama dan mengirim sebanyak mungkin permintaan baca ke node baca-saja, kami sarankan Anda memilih konsistensi akhir.
Konsistensi sesi
Deskripsi
Dalam kebanyakan kasus, permintaan dibagi untuk menghilangkan ketidaksesuaian data yang disebabkan oleh konsistensi akhir. Permintaan yang memerlukan konsistensi tinggi dikirim ke node utama, sedangkan permintaan yang memerlukan konsistensi akhir dikirim ke node baca-saja menggunakan fitur pemisahan baca/tulis. Hal ini meningkatkan beban pada node utama, mengurangi kinerja pemisahan baca/tulis, dan membuat pengembangan aplikasi lebih kompleks.
Untuk menyelesaikan masalah tersebut, PolarDB mendukung konsistensi sesi, yang juga dikenal sebagai konsistensi kausal. Konsistensi sesi memastikan bahwa data yang diperbarui sebelum permintaan baca dikirim dalam sesi dapat diperoleh, sehingga memastikan bahwa data bersifat monotonik.
PolarDB menggunakan PolarProxy untuk melakukan operasi pemisahan baca/tulis. PolarProxy melacak log redo yang diterapkan pada setiap node dan mencatat setiap nomor urutan log (LSN). Saat data di node utama diperbarui, PolarDB mencatat LSN dari pembaruan baru sebagai LSN sesi. Saat permintaan baca baru diterima, PolarDB membandingkan LSN sesi dengan LSN pada setiap node dan meneruskan permintaan ke node di mana LSN lebih besar dari atau sama dengan LSN sesi. Ini memastikan konsistensi sesi. PolarDB melakukan replikasi fisik dengan cara yang efisien.

Untuk memastikan sinkronisasi yang efisien, data sedang direplikasi ke node baca-saja lainnya saat node baca-saja mengembalikan hasil ke klien. Dengan cara ini, data diperbarui pada node baca-saja sebelum permintaan baca berikutnya diterima. Dalam sebagian besar skenario, sejumlah besar permintaan baca dan sejumlah kecil permintaan tulis ada. Oleh karena itu, mekanisme ini dapat memastikan konsistensi sesi, pemisahan baca/tulis, dan penyeimbangan beban berdasarkan hasil verifikasi.
Skema yang Sesuai
Tingkat konsistensi yang lebih tinggi dari kluster PolarDB menunjukkan beban yang lebih berat pada database utama dan kinerja kluster yang lebih rendah. Kami sarankan Anda menggunakan konsistensi sesi. Tingkat konsistensi ini memenuhi persyaratan sebagian besar skenario aplikasi dan meminimalkan dampak pada kinerja kluster.
Praktik terbaik untuk tingkat konsistensi
Tingkat konsistensi yang lebih tinggi dari kluster PolarDB menunjukkan kinerja kluster yang lebih rendah. Kami sarankan Anda menggunakan konsistensi sesi. Tingkat konsistensi ini memenuhi persyaratan konsistensi dalam sebagian besar skenario aplikasi dan meminimalkan dampak pada kinerja kluster.
Jika Anda memerlukan konsistensi data tinggi antar sesi yang berbeda, Anda dapat memilih salah satu solusi berikut:
Gunakan petunjuk untuk secara paksa mengirim kueri tertentu ke node utama.
/*FORCE_MASTER*/ select * from user;CatatanPetunjuk diberi prioritas tertinggi untuk perutean dan tidak dibatasi oleh tingkat konsistensi atau pemisahan transaksi. Sebelum menggunakan petunjuk, evaluasi dampaknya pada bisnis Anda.
Petunjuk tidak boleh berisi pernyataan yang mengubah variabel lingkungan. Misalnya, jika Anda menjalankan pernyataan
/*FORCE_SLAVE*/ set names utf8;, kesalahan mungkin terjadi.