PolarDB menyediakan beberapa tingkat konsistensi untuk memenuhi kebutuhan konsistensi Anda: konsistensi akhir, konsistensi sesi, konsistensi global, dan konsistensi global (mode kinerja tinggi).
Masalah dan solusi
MySQL menyediakan proxy yang mendukung pemisahan baca/tulis. Proxy ini membuat koneksi antara aplikasi dan MySQL serta mengurai pernyataan SQL. Permintaan operasi tulis seperti UPDATE, DELETE, INSERT, dan CREATE diteruskan ke database utama, sedangkan permintaan operasi SELECT dikirim ke database sekunder. Penundaan replikasi meningkat ketika beban pada database berat. Misalnya, saat menjalankan pernyataan DDL untuk menambah kolom pada tabel besar atau menyisipkan sejumlah besar data, penundaan replikasi besar terjadi. Dalam situasi ini, data terbaru tidak dapat diambil dari node hanya-baca. Fitur pemisahan baca/tulis tidak dapat menyelesaikan masalah ini.
PolarDB menggunakan replikasi fisik asinkron untuk menyinkronkan data antara node utama dan node hanya-baca. Setelah data pada node utama diperbarui, pembaruan tersebut disinkronkan ke node hanya-baca. Penundaan replikasi bergantung pada beban tulis di node utama. Pada umumnya, penundaan replikasi hanya beberapa milidetik. Replikasi asinkron memastikan konsistensi akhir antara node utama dan node hanya-baca. PolarDB menyediakan tingkat konsistensi berikut untuk memenuhi kebutuhan Anda:
Konsistensi akhir
Deskripsi
PolarDB menggunakan arsitektur pemisahan baca/tulis. Pemisahan baca/tulis tradisional hanya memastikan konsistensi akhir. Hasil yang diambil dari node berbeda mungkin berbeda karena penundaan replikasi utama/sekunder. Sebagai contoh, jika Anda menjalankan pernyataan berikut secara berulang dalam sesi, pernyataan SELECT mungkin mengembalikan hasil yang berbeda. Hasil kueri aktual bergantung pada penundaan replikasi.
INSERT INTO t1(id, price) VALUES(111, 96); UPDATE t1 SET price = 100 WHERE id=111; SELECT price FROM t1;Skenario
Untuk mengurangi beban pada node utama dan mengarahkan sebanyak mungkin permintaan baca ke node hanya-baca, kami sarankan Anda memilih konsistensi akhir.
Konsistensi sesi
Deskripsi
Untuk menghilangkan ketidaksesuaian data yang disebabkan oleh konsistensi akhir, permintaan dibagi dalam sebagian besar kasus. Permintaan yang memerlukan konsistensi tinggi dikirim ke node utama, sementara permintaan dengan setidaknya konsistensi akhir dikirim ke node hanya-baca menggunakan fitur pemisahan baca/tulis. Namun, hal ini meningkatkan beban pada node utama, mengurangi kinerja pemisahan baca/tulis, dan mempersulit pengembangan aplikasi.
Untuk menyelesaikan masalah ini, PolarDB menyediakan konsistensi sesi, 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 monoton.
PolarDB menggunakan PolarProxy untuk mencapai pemisahan baca/tulis. PolarProxy melacak redo log yang diterapkan pada setiap node dan mencatat nomor urutan log (LSN) pada setiap node. Setiap kali data diperbarui, PolarDB mencatat LSN pembaruan sebagai LSN sesi. Ketika permintaan baca baru diterima, PolarDB membandingkan LSN sesi dengan LSN pada setiap node dan meneruskan permintaan ke node yang memiliki LSN lebih besar atau sama dengan LSN sesi. Jika LSN pada node hanya-baca lebih kecil dari LSN sesi, PolarDB hanya akan meneruskan permintaan ke node tersebut ketika node tersebut memperbarui ke data terbaru dalam periode timeout yang ditentukan. Ini memastikan konsistensi sesi. Solusi ini dapat meningkatkan beban pada node utama. Namun, karena PolarDB menggunakan replikasi fisik, konsistensi sesi dapat dicapai dengan cepat.

Untuk memastikan sinkronisasi yang efisien, data sedang direplikasi ke node hanya-baca lainnya ketika node hanya-baca mengembalikan hasil ke klien. Ini memungkinkan data diperbarui pada node hanya-baca sebelum permintaan baca berikutnya tiba. 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.
Skenario
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 meminimalkan dampak pada kinerja kluster dan memenuhi persyaratan sebagian besar skenario.
Konsistensi global
Deskripsi
Dalam beberapa skenario, dependensi ada dalam sesi individu dan antar sesi. Misalnya, jika Anda menggunakan kumpulan koneksi, permintaan yang berjalan pada thread yang sama mungkin dikirim menggunakan koneksi yang berbeda. Permintaan ini termasuk dalam sesi yang berbeda di database. Permintaan ini saling bergantung dalam proses bisnis, dan konsistensi sesi tidak dapat memastikan konsistensi data. Untuk menyelesaikan masalah ini, PolarDB menyediakan konsistensi global.

Ketika PolarProxy di kluster PolarDB Anda menerima permintaan baca, ia memeriksa LSN terbaru pada node utama. Untuk meminimalkan overhead, beberapa permintaan baca dikelompokkan sehingga LSN node utama diambil secara massal. Setelah mendapatkan LSN terbaru, misalnya, LSN0, PolarProxy kemudian menunggu setidaknya satu node hanya-baca untuk menyinkronkan LSN-nya ke LSN0. Setelah sinkronisasi ini dikonfirmasi, PolarProxy meneruskan permintaan baca ke node hanya-baca tersebut. Proses ini memastikan bahwa operasi baca mengambil data yang mencerminkan semua pembaruan yang telah dikomit hingga saat permintaan dimulai.
Tabel berikut menjelaskan parameter konfigurasi untuk konsistensi global.
Parameter
Deskripsi
ConsistTimeout
Global Consistency Timeout: periode waktu maksimum selama mana PolarProxy menunggu node hanya-baca untuk memperbarui ke LSN terbaru pada node utama setelah PolarProxy menerima permintaan baca. Jika durasi habis, PolarProxy melakukan operasi yang ditentukan oleh parameter ConsistTimeoutAction.
Nilai valid: 0 hingga 60000. Nilai default: 20. Unit: milidetik.
ConsistTimeoutAction
Global Consistency Timeout Policy: Jika LSN node hanya-baca tidak diperbarui ke LSN terbaru node utama dalam periode timeout yang ditentukan oleh parameter ConsistTimeout, PolarProxy yang disediakan oleh PolarDB melakukan operasi yang ditentukan oleh parameter ConsistTimeoutAction.
Nilai valid:
0: PolarProxy mengirimkan permintaan baca ke node utama. Ini adalah nilai default.
1: PolarProxy mengembalikan pesan kesalahan
wait replication complete timeout, please retryke aplikasi.
CatatanUntuk informasi tentang cara memodifikasi parameter Global Consistency Timeout dan Global Consistency Timeout Policy, lihat Konfigurasi PolarProxy.
Skenario
Jika penundaan replikasi utama/sekunder tinggi, sejumlah besar permintaan mungkin diteruskan ke node utama ketika Anda menggunakan konsistensi global. Hal ini meningkatkan beban pada node utama dan dapat meningkatkan latensi layanan. Oleh karena itu, untuk skenario di mana sejumlah besar permintaan baca dan sejumlah kecil permintaan tulis diproses, kami sarankan Anda menggunakan konsistensi global.
Konsistensi global (mode kinerja tinggi)
PolarDB for MySQL menyediakan konsistensi global (mode kinerja tinggi). Konsistensi global (mode kinerja tinggi) mendukung konsistensi data kuat, yang merupakan tingkat konsistensi data yang lebih tinggi daripada konsistensi global.
PolarTrans menggunakan Commit Timestamp Store (CTS) dan Remote Direct Memory Access (RDMA) untuk menyediakan konsistensi global (mode kinerja tinggi) di tingkat kernel. Ini memastikan bahwa konsistensi kuat diimplementasikan untuk semua permintaan baca yang ditujukan ke node hanya-baca apa pun di kluster Anda.
Untuk informasi lebih lanjut tentang konsistensi global (mode kinerja tinggi), seperti batasan, cara kerjanya, cara mengaktifkan fitur, dan data kinerja, lihat Konsistensi Global (Mode Kinerja Tinggi).
Bagaimana memilih 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 meminimalkan dampak pada kinerja kluster dan memenuhi persyaratan sebagian besar skenario.
Jika Anda memerlukan konsistensi data tinggi antar sesi yang berbeda, Anda dapat memilih salah satu dari solusi berikut:
Gunakan konsistensi global (mode kinerja tinggi) atau konsistensi global.
CatatanUntuk kluster PolarDB for MySQL 5.7, 8.0.1, atau 8.0.2, jika konsistensi kuat ketat diperlukan, konsistensi global (mode kinerja tinggi) lebih disarankan.
Untuk kluster PolarDB for MySQL 5.6, Anda dapat memilih konsistensi global untuk konsistensi kuat ketat karena versi ini tidak mendukung konsistensi global (mode kinerja tinggi).
Gunakan petunjuk (hints) untuk memaksa mengirim kueri tertentu ke node utama.
/*FORCE_MASTER*/ select * from user;CatatanJika Anda ingin mengeksekusi pernyataan sebelumnya yang berisi petunjuk pada baris perintah resmi MySQL, tambahkan parameter -c dalam pernyataan. Jika tidak, petunjuk menjadi tidak valid karena petunjuk difilter pada baris perintah resmi MySQL. Untuk informasi lebih lanjut, lihat Opsi Klien mysql.
Petunjuk diberi prioritas tertinggi untuk routing dan tidak dibatasi oleh tingkat konsistensi atau pemisahan transaksi. Sebelum menggunakan petunjuk, evaluasi dampaknya pada bisnis Anda.
Petunjuk tidak boleh berisi pernyataan SQL yang mengubah variabel lingkungan. Misalnya, jika Anda menggunakan
/*FORCE_SLAVE*/ set names utf8;, kesalahan mungkin terjadi.
Bagaimana mengatur tingkat konsistensi?
Untuk informasi tentang cara mengaktifkan konsistensi global (mode kinerja tinggi), lihat Konsistensi Global (Mode Kinerja Tinggi).
Untuk informasi tentang cara mengatur tingkat konsistensi ke konsistensi akhir, konsistensi sesi, atau konsistensi global, lihat Konfigurasi PolarProxy.