PolarDB untuk MySQL mengintegrasikan kernel database dengan jaringan akses memori langsung jarak jauh (RDMA) untuk menyediakan fitur kluster konsistensi kuat (SCC), juga dikenal sebagai PolarDB-SCC. Fitur ini memastikan konsistensi global data dan mencapai performa tinggi dalam pembacaan serta penulisan data. Dibandingkan dengan konsistensi akhir, kehilangan performa kluster berada dalam 10% jika SCC diaktifkan. Topik ini menjelaskan catatan penggunaan, prinsip teknis, metode pengaktifan SCC, serta hasil perbandingan performa kluster.
Versi yang didukung
Jika Anda ingin mengaktifkan SCC, PolarDB untuk MySQL edisi enterprise kluster Anda harus memenuhi salah satu persyaratan versi berikut:
Versi engine adalah 8.0.2 dengan versi revisi 8.0.2.2.19 atau lebih baru.
Versi engine adalah 8.0.1 dengan versi revisi 8.0.1.1.29 atau lebih baru.
Versi engine adalah 5.7 dengan versi revisi 5.7.1.0.26 atau lebih baru.
Untuk informasi lebih lanjut tentang cara memeriksa versi kluster, lihat bagian "Query the engine version" dari topik Versi Engine.
Catatan Penggunaan
Secara default, SCC diaktifkan untuk semua node baca-saja dari sebuah kluster serverless.
SCC tidak dapat diaktifkan untuk node baca-saja dari kluster sekunder dalam sebuah global database network (GDN).
SCC kompatibel dengan fitur cache query cepat. Namun, jika optimasi tabel pelacakan modifikasi (MTT) diaktifkan untuk SCC dan Anda mengaktifkan baik fitur cache query cepat maupun SCC, optimasi MTT menjadi tidak valid.
Solusi Teknis SCC
SCC didasarkan pada PolarTrans, yaitu sistem transaksi berbasis timestamp yang dirancang ulang untuk merekonstruksi metode manajemen transaksi tradisional yang bergantung pada jumlah transaksi aktif di MySQL asli. Sistem ini mendukung ekspansi transaksi terdistribusi dan secara signifikan meningkatkan performa kluster tunggal.
Gambar berikut menunjukkan implementasi SCC. Jaringan RDMA digunakan untuk membangun sinkronisasi informasi primer/sekunder interaktif dan multidimensi, menggantikan arsitektur replikasi log primer/sekunder tradisional. Algoritma timestamp Lamport linier mengurangi jumlah permintaan timestamp oleh node baca-saja dan mencegah waktu tunggu yang tidak perlu untuk pemutaran ulang log.
Timestamp Lamport Linier: Untuk mengoptimalkan efisiensi node baca-saja dalam memperoleh timestamp modifikasi terbaru, digunakan timestamp Lamport linier. Dalam metode tradisional, node baca-saja perlu memperoleh timestamp dari node primer setiap kali memproses permintaan, yang menghasilkan overhead signifikan di bawah beban tinggi meskipun kecepatan jaringan cepat. Keuntungan timestamp Lamport linier adalah bahwa node baca-saja dapat menyimpan timestamp lokal yang diperoleh dari node primer. Untuk permintaan yang mencapai node baca-saja lebih awal dari timestamp yang disimpan secara lokal, node baca-saja dapat langsung menggunakan timestamp lokal tanpa memperoleh timestamp lain dari node primer. Ini mengurangi overhead permintaan timestamp berulang di bawah beban tinggi dan meningkatkan performa node baca-saja.
Pelacakan Modifikasi Berjenjang Halus: Untuk mengoptimalkan performa node baca-saja, tiga level timestamp digunakan pada node primer: timestamp global, timestamp tingkat tabel, dan timestamp tingkat halaman. Ketika node baca-saja memproses permintaan, ia pertama-tama memperoleh timestamp global. Jika timestamp global lebih baru daripada timestamp ketika node baca-saja memutar ulang log, node baca-saja tidak segera masuk ke keadaan menunggu. Sebaliknya, node baca-saja melanjutkan untuk memeriksa timestamp tabel dan halaman yang diakses oleh permintaan tersebut. Node baca-saja hanya menunggu hingga pemutaran ulang log selesai jika timestamp tingkat halaman permintaan tidak memenuhi kondisi. Ini mencegah waktu tunggu yang tidak perlu untuk pemutaran ulang log dan meningkatkan kecepatan respons node baca-saja.
Pengiriman Log Berbasis RDMA: SCC menggunakan antarmuka RDMA satu sisi untuk mengirim log dari node primer ke node baca-saja, yang meningkatkan kecepatan pengiriman log dan mengurangi overhead CPU yang disebabkan oleh pengiriman log.

Timestamp Lamport Linier
Node baca-saja dapat menggunakan timestamp Lamport linier untuk mengurangi latensi permintaan baca dan konsumsi bandwidth. Ketika permintaan mencapai node baca-saja, jika node baca-saja mendeteksi bahwa timestamp telah diperoleh dari node primer untuk permintaan lain, node baca-saja langsung menggunakan kembali timestamp tersebut untuk mencegah permintaan timestamp berulang ke node primer, memastikan konsistensi data yang kuat dan meningkatkan performa.

Pada gambar di atas, dua permintaan baca konkuren r<sub>1</sub> dan r<sub>2</sub> mencapai node baca-saja. Node baca-saja mengirim permintaan ke node primer pada t<sub>2</sub> untuk memperoleh timestamp untuk r<sub>2</sub> dan memperoleh timestamp TS<sup>3</sup><sub>rw</sub> dari node primer pada t<sub>3</sub>. Hubungan peristiwa-peristiwa ini dapat dipahami sebagai berikut: e<sub>2</sub>TS<sup>3 </sup><sub>rw </sub>e<sub>3</sub>. Permintaan r<sub>1</sub> mencapai node baca-saja pada t<sub>1</sub>. Dengan memberikan timestamp untuk setiap peristiwa pada node baca-saja, urutan peristiwa dapat ditentukan. Jika t<sub>1</sub> lebih awal dari t<sub>2</sub>, hubungan peristiwa berikut dapat diperoleh: e<sub>1</sub>e<sub>2</sub>TS<sup>3 </sup><sub>rw </sub>e<sub>3</sub>. Dengan kata lain, timestamp yang diperoleh untuk r<sub>2</sub> sudah mencakup semua pembaruan sebelum r<sub>1</sub> mencapai node baca-saja. Dalam hal ini, timestamp untuk r<sub>2</sub> dapat langsung digunakan untuk r<sub>1</sub> tanpa perlu memperoleh timestamp baru. Berdasarkan prinsip ini, setiap kali node baca-saja memperoleh timestamp dari node primer, node baca-saja menyimpan timestamp tersebut secara lokal dan mencatat waktu ketika timestamp diperoleh. Jika waktu kedatangan permintaan lebih awal dari waktu ketika timestamp yang disimpan secara lokal diperoleh, timestamp tersebut dapat langsung digunakan untuk permintaan tersebut.
Pelacakan Modifikasi Berjenjang dan Halus
Untuk mengimplementasikan konsistensi kuat dalam pembacaan data, node baca-saja harus terlebih dahulu memperoleh timestamp terbaru yang dikomit oleh transaksi saat ini dari node primer, memutar ulang log-nya ke timestamp tersebut, dan kemudian memproses permintaan baca. Namun, selama pemutaran ulang log, data yang diminta mungkin sudah merupakan yang terbaru dan node baca-saja tidak perlu menunggu hingga log diputar ulang. Untuk mencegah waktu yang tidak perlu terbuang untuk menunggu, SCC menggunakan pelacakan modifikasi yang lebih halus. Tiga level informasi modifikasi dipertahankan pada node primer: timestamp global, timestamp tingkat tabel, dan timestamp tingkat halaman.
Ketika node baca-saja memproses permintaan baca, ia pertama-tama memperoleh timestamp global untuk memeriksa konsistensi data. Jika timestamp global tidak memenuhi kondisi, node baca-saja memperoleh timestamp lokal tabel tujuan untuk verifikasi yang lebih halus. Jika timestamp tingkat tabel masih tidak memenuhi kondisi, node baca-saja memperoleh timestamp halaman tujuan untuk verifikasi lebih lanjut. Hanya jika timestamp halaman saat ini lebih baru daripada timestamp ketika node baca-saja memutar ulang log, node baca-saja perlu menunggu hingga pemutaran ulang log selesai untuk memastikan bahwa data terbaru dibaca.
Untuk mengurangi penggunaan memori, tiga level timestamp disimpan dalam tabel hash di memori. Untuk lebih mengoptimalkan penggunaan memori, timestamp beberapa tabel atau halaman mungkin dipetakan ke tabel hash yang sama. Untuk memastikan konsistensi, hanya timestamp yang lebih baru yang diizinkan untuk menggantikan yang lebih lama. Desain ini memastikan bahwa konsistensi tidak rusak meskipun node baca-saja memperoleh timestamp yang lebih baru. Gambar berikut menunjukkan prinsipnya. Pada gambar ini, TID menunjukkan ID tabel dan PID menunjukkan ID halaman. Timestamp yang diperoleh oleh node baca-saja disimpan secara lokal berdasarkan desain timestamp Lamport linier untuk permintaan lain yang memenuhi syarat.

Pengiriman Log Berbasis RDMA
Dalam SCC, node primer menulis log secara remote ke cache node baca-saja melalui RDMA satu sisi. Proses ini tidak mengonsumsi sumber daya CPU node baca-saja dan memastikan latensi rendah. Seperti yang ditunjukkan pada gambar berikut, baik node baca-saja maupun node primer mempertahankan buffer log dengan ukuran yang sama. Thread latar belakang node primer menulis buffer log node primer ke buffer log node baca-saja melalui RDMA. Node baca-saja membaca buffer log lokal alih-alih membaca file untuk mempercepat sinkronisasi replikasi.

Untuk informasi lebih lanjut tentang pengiriman log berbasis RDMA, lihat Pengiriman Log Berbasis RDMA.
Aktifkan SCC
Masuk ke Konsol PolarDB. Di halaman Kluster, temukan kluster yang ingin Anda kelola dan klik ID-nya untuk masuk ke halaman detail kluster. Di bagian Database Connections dari halaman Basic Information, gerakkan pointer ke atas titik akhir untuk mana Anda ingin mengaktifkan SCC dan klik Configure. Untuk informasi lebih lanjut, lihat Konfigurasikan PolarProxy.
Konsistensi global (mode kinerja tinggi) berlaku untuk semua titik akhir kluster setelah diaktifkan. Jika Anda mengaktifkan mode ini untuk satu titik akhir kluster, mode ini diaktifkan untuk semua titik akhir lainnya dari kluster tersebut.
Perbandingan Kinerja
Lingkungan Pengujian
Sebuah kluster PolarDB untuk MySQL 8.0 dari Edisi Kluster dengan 8 inti CPU dan 32 GB memori.
Alat Pengujian
Sysbench
Ukuran Data Pengujian
25 tabel dengan 250.000 baris di setiap tabel
Hasil Pengujian
Kinerja Baca dan Tulis
Gambaran Grafik
qps: jumlah permintaan per detik (QPS) dalam hasil pengujian sysbench.
threads: jumlah thread sysbench konkuren yang digunakan dalam pengujian.
RW: QPS pada node primer. Jika node baca-saja tidak dapat menyediakan operasi baca yang konsisten secara global, semua operasi baca dan tulis dikirim ke node primer.
Konsistensi Global: QPS dengan konsistensi global diaktifkan.
SCC: QPS dengan konsistensi akhir dan SCC diaktifkan.
Konsistensi Akhir: QPS dengan konsistensi akhir diaktifkan untuk operasi baca dan SCC dinonaktifkan.
Dalam skenario yang menguji kinerja baca dan tulis antara dua kluster, dibandingkan dengan kluster dengan konsistensi akhir diaktifkan, kehilangan performa keseluruhan kluster dengan SCC diaktifkan berada dalam 10%.
