PolarDB mendukung empat tingkat konsistensi untuk pemisahan baca/tulis: konsistensi akhir, konsistensi sesi, konsistensi global, dan konsistensi global (mode kinerja tinggi). Setiap tingkat menukar latensi baca dengan kesegaran data—semakin tinggi konsistensinya, semakin lama pembacaan mungkin menunggu replikasi menyusul.
Penerapan
Kluster harus memiliki setidaknya satu node read-only (RO) sebelum Anda dapat mengonfigurasi tingkat konsistensi. Jika kluster tidak memiliki node read-only, pengaturan tingkat konsistensi tidak ditampilkan di Konsol PolarDB.
Pilih tingkat konsistensi
| Tingkat | Apakah bacaan menunggu? | Beban node primary | Disarankan saat |
|---|---|---|---|
| Eventual consistency | Tidak pernah | Terendah | Pembacaan usang dapat diterima; maksimalkan pemanfaatan node read-only |
| Konsistensi sesi | Hanya jika diperlukan dalam satu sesi | Rendah | Sebagian besar aplikasi — menjamin read-your-writes dalam satu sesi |
| Konsistensi global | Ya, per permintaan | Lebih tinggi | Ketergantungan lintas-sesi, seperti skenario kolam koneksi |
| Konsistensi global (mode kinerja tinggi) | Tidak (tingkat kernel) | Overhead minimal | PolarDB for MySQL 5.7, 8.0.1, atau 8.0.2 yang memerlukan konsistensi kuat ketat |
Gunakan konsistensi sesi untuk sebagian besar workload. Tingkat ini meminimalkan dampak terhadap kinerja kluster sekaligus memenuhi mayoritas kebutuhan konsistensi. Untuk PolarDB for MySQL 5.6, gunakan konsistensi global sebagai gantinya karena mode kinerja tinggi tidak didukung pada versi tersebut.
Cara PolarDB mereplikasi data
PolarDB menggunakan replikasi fisik asinkron untuk menjaga sinkronisasi node read-only dengan node primary. Setelah penulisan di node primary selesai, perubahan tersebut disebarkan ke node read-only—dalam kebanyakan kasus dalam beberapa milidetik. Latensi replikasi inilah yang menjadi akar penyebab inkonsistensi bacaan dalam konfigurasi pemisahan baca/tulis.
Konsistensi akhir
Konsistensi akhir mengarahkan semua pembacaan ke node read-only tanpa menunggu. Pernyataan SELECT segera setelah penulisan mungkin mengembalikan data usang jika latensi replikasi belum tertutup.
INSERT INTO t1(id, price) VALUES(111, 96);
UPDATE t1 SET price = 100 WHERE id=111;
SELECT price FROM t1; -- Mungkin mengembalikan 96 alih-alih 100 jika replikasi belum menyusul
Gunakan konsistensi akhir ketika Anda ingin memaksimalkan pemanfaatan node read-only dan aplikasi Anda dapat mentoleransi pembacaan data yang sedikit usang.
Konsistensi sesi
Konsistensi sesi, juga dikenal sebagai konsistensi kausal, menjamin read-your-writes dalam satu sesi. Setelah penulisan apa pun, pembacaan berikutnya dalam sesi yang sama selalu melihat hasil penulisan tersebut—bahkan jika diarahkan ke node read-only.
Cara kerjanya
PolarProxy melacak nomor urutan log (LSN) yang diterapkan di setiap node. Setiap penulisan mencatat LSN-nya sebagai LSN sesi. Saat permintaan baca tiba, PolarProxy hanya mengarahkannya ke node yang LSN-nya telah diterapkan lebih besar dari atau sama dengan LSN sesi. Jika LSN pada node read-only lebih kecil daripada LSN sesi, PolarProxy hanya meneruskan permintaan ke node tersebut ketika node tersebut memperbarui datanya hingga terbaru dalam periode timeout yang ditentukan.
Karena PolarDB menggunakan replikasi fisik, proses penyusulan sangat cepat. Saat node read-only mengembalikan hasil ke klien, replikasi ke node lain tetap berjalan secara paralel, sehingga data pada node read-only dapat diperbarui sebelum permintaan baca berikutnya tiba.
Gunakan konsistensi sesi untuk sebagian besar aplikasi. Tingkat ini mempertahankan manfaat pemisahan baca/tulis dan penyeimbangan beban sekaligus menjamin hasil yang konsisten dalam setiap sesi.
Konsistensi global
Konsistensi sesi mencakup ketergantungan dalam satu sesi tunggal. Namun, tingkat ini tidak mencakup ketergantungan lintas-sesi—misalnya, ketika kolam koneksi menetapkan thread logis yang sama ke koneksi database berbeda di berbagai permintaan. Dalam kasus tersebut, penulisan di satu sesi mungkin tidak terlihat oleh pembacaan di sesi berbeda.
Konsistensi global mengatasi hal ini dengan memeriksa LSN terbaru dari node primary sebelum setiap permintaan baca. PolarProxy mengelompokkan beberapa permintaan baca konkuren secara bersamaan untuk mengambil LSN primary secara massal, sehingga meminimalkan overhead. Begitu LSN setidaknya satu node read-only mencapai LSN primary (LSN0), PolarProxy mengarahkan pembacaan ke node tersebut. Hal ini menjamin bahwa setiap pembacaan mencerminkan semua penulisan yang telah dikomit hingga saat permintaan diajukan.
Parameter konfigurasi
| Parameter | Nama tampilan | Deskripsi | Nilai valid | Bawaan |
|---|---|---|---|---|
ConsistTimeout |
Global Consistency Timeout | Waktu maksimum yang ditunggu PolarProxy agar node read-only mencapai LSN primary setelah menerima permintaan baca. | 0–60000 | 20 (milidetik) |
ConsistTimeoutAction |
Global Consistency Timeout Policy | Tindakan yang diambil saat ConsistTimeout habis. 0: arahkan pembacaan ke node primary. 1: kembalikan error wait replication complete timeout, please retry. |
0, 1 | 0 |
Untuk mengubah parameter ini, lihat Configure PolarProxy.
Gunakan konsistensi global untuk skenario yang memproses sejumlah besar permintaan baca dan sedikit permintaan tulis, seperti skenario kolam koneksi dengan ketergantungan baca-setelah-tulis lintas-sesi. Jika latensi replikasi tinggi, beberapa pembacaan mungkin dialihkan kembali ke node primary, sehingga meningkatkan bebannya.
Konsistensi global (mode kinerja tinggi)
Konsistensi global (mode kinerja tinggi) menyediakan konsistensi kuat—jaminan yang lebih tinggi daripada konsistensi global—yang diimplementasikan di tingkat kernel oleh PolarTrans. Tingkat ini menggunakan Commit Timestamp Store (CTS) dan Remote Direct Memory Access (RDMA) untuk memastikan bahwa semua pembacaan dari node read-only mana pun dalam kluster mengembalikan hasil yang sangat konsisten, tanpa overhead menunggu per permintaan seperti pada konsistensi global standar.
Untuk informasi tentang batasan, cara kerja, cara mengaktifkannya, dan tolok ukur kinerja, lihat Global consistency (high-performance mode).
Paksa kueri ke node primary
Gunakan petunjuk /*FORCE_MASTER*/ untuk mengirim kueri tertentu langsung ke node primary, terlepas dari tingkat konsistensi yang dikonfigurasi:
/*FORCE_MASTER*/ SELECT * FROM user;
Petunjuk memiliki prioritas routing tertinggi—mengabaikan tingkat konsistensi dan pemisahan transaksi.
Catatan penggunaan:
-
Saat menjalankan pernyataan ini dari klien command-line MySQL, tambahkan flag
-c, atau klien akan menghapus komentar petunjuk tersebut. Untuk detailnya, lihat mysql client options. -
Petunjuk tidak boleh berisi pernyataan SQL yang mengubah variabel lingkungan. Misalnya, jika Anda menggunakan
/*FORCE_SLAVE*/ SET NAMES utf8;, kesalahan mungkin terjadi. -
Evaluasi dampaknya terhadap workload Anda sebelum menggunakan petunjuk di lingkungan produksi, karena petunjuk ini melewati seluruh logika penyeimbangan beban.
Atur tingkat konsistensi
-
Konsistensi akhir, konsistensi sesi, atau konsistensi global: Konfigurasikan tingkat tersebut di pengaturan PolarProxy. Lihat Configure PolarProxy.
-
Konsistensi global (mode kinerja tinggi): Lihat Enable global consistency (high-performance mode).
FAQ
Mengapa saya tidak melihat pengaturan konsistensi di Konsol?
Pengaturan tingkat konsistensi hanya ditampilkan ketika kluster memiliki setidaknya satu node read-only (RO). Jika kluster Anda tidak memiliki node read-only, bagian pengaturan konsistensi tidak muncul di Konsol PolarDB. Untuk mengatasi masalah ini, tambahkan setidaknya satu node read-only ke kluster. Untuk informasi lebih lanjut, lihat Add or remove nodes.