Saat operasi DDL dijalankan pada node primary, kunci metadata (MDL) akan dipegang. Node read-only harus menunggu informasi kunci tersebut tersinkronisasi sebelum dapat melanjutkan penguraian log redo—yang menyebabkan operasi DDL terhambat. Replikasi MDL asinkron memisahkan sinkronisasi MDL dari penguraian log redo sehingga node read-only tetap dapat menerapkan log redo selama menunggu informasi kunci, mengurangi dampak DDL terhadap performa kluster.
Versi yang didukung
| Versi | Revisi minimum |
|---|---|
| PolarDB for MySQL 5.6 | Semua versi revisi |
| PolarDB for MySQL 5.7 | Semua versi revisi |
| PolarDB for MySQL 8.0 | 8.0.1.1.10 atau lebih baru |
Untuk memeriksa versi kluster Anda, lihat Kueri versi engine.
Cara kerja
Tanpa replikasi MDL asinkron, sinkronisasi MDL dan penguraian log redo saling terkait pada node read-only:
| Node utama | read-only node |
|---|---|
| Menjalankan DDL — mendapatkan MDL | Menerima sinyal untuk menyinkronkan MDL |
| DDL memegang MDL | Menunggu sinkronisasi MDL selesai |
| Berhenti menguraikan log redo selama menunggu | |
| DDL selesai — melepas MDL | Sinkronisasi MDL selesai — melanjutkan penguraian log redo |
Dengan replikasi MDL asinkron, node read-only memisahkan kedua operasi ini: ia terus menguraikan dan menerapkan log redo di latar belakang, sementara thread pekerja khusus menangani sinkronisasi MDL secara paralel.
Memantau sinkronisasi MDL
Fitur ini diaktifkan secara default pada kluster yang didukung dan tidak memerlukan konfigurasi tambahan.
Dua tampilan INFORMATION_SCHEMA memungkinkan Anda memeriksa status sinkronisasi MDL pada node read-only.
Kedua kueri memerlukan versi revisi minimum berikut. Jika kluster Anda tidak memenuhi persyaratan ini, upgrade versi kluster.
MySQL 8.0.1: revisi 8.0.1.1.24 atau lebih baru
MySQL 5.7: revisi 5.7.1.0.20 atau lebih baru
MySQL 5.6: revisi 5.6.1.0.33 atau lebih baru. Untuk menjalankan kueri pada node tertentu, lihat bagian "Hint" di Ikhtisar.
Kueri status slot MDL
Jalankan pernyataan berikut pada node read-only untuk melihat semua slot sinkronisasi MDL aktif:
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOG_MDL_SLOT;Contoh output:
+---------+------------+-------------------+----------+-------------------+
| slot_id | slot_state | slot_name | slot_lsn | thread_id |
+---------+------------+-------------------+----------+-------------------+
| 0 | SLOT_NONE | no targeted table | 0 | no running thread |
| 1 | SLOT_NONE | no targeted table | 0 | no running thread |
| 2 | SLOT_NONE | no targeted table | 0 | no running thread |
| 3 | SLOT_NONE | no targeted table | 0 | no running thread |
| 4 | SLOT_NONE | no targeted table | 0 | no running thread |
+---------+------------+-------------------+----------+-------------------+Setiap baris merepresentasikan satu slot sinkronisasi MDL. Kolom slot_name mengidentifikasi tabel target, dan slot_state menunjukkan fase sinkronisasi saat ini:
slot_state | Makna |
|---|---|
SLOT_NONE | Status inisialisasi. Tidak ada permintaan MDL aktif. |
SLOT_RESERVED | Node read-only menerima permintaan MDL dan sedang menunggu thread pekerja dari penjadwal. |
SLOT_ACQUIRING | Thread pekerja telah ditugaskan dan node read-only sedang mengirim permintaan MDL. Jika MDL sedang dipegang oleh koneksi lain, slot tetap dalam status ini hingga kunci dilepaskan. |
SLOT_LOCKED | MDL telah didapatkan dan sedang dipegang oleh node read-only. |
SLOT_RELEASING | Node read-only menerima permintaan pelepasan MDL dan sedang menunggu thread pekerja dari penjadwal. |
Mendiagnosis penantian kunci: Slot yang terjebak dalam status SLOT_ACQUIRING menunjukkan bahwa node read-only kemungkinan besar sedang menunggu MDL yang dipegang oleh koneksi lain. Gunakan kueri thread pekerja di bawah ini untuk mengonfirmasi, lalu periksa apakah ada koneksi pada node primary yang sedang memegang kunci pada tabel yang ditampilkan di kolom slot_name.
Kueri status thread pekerja
Jalankan pernyataan berikut pada node read-only untuk melihat thread pekerja yang memproses permintaan sinkronisasi MDL:
SELECT * FROM INFORMATION_SCHEMA.INNODB_LOG_MDL_THREAD;Contoh output:
+-----------+-----------+------------------+-------------------+----------+
| thread_id | thr_state | slot_state | slot_name | slot_lsn |
+-----------+-----------+------------------+-------------------+----------+
| 0 | free | not in acquiring | no targeted table | 0 |
| 1 | free | not in acquiring | no targeted table | 0 |
| 2 | free | not in acquiring | no targeted table | 0 |
| 3 | free | not in acquiring | no targeted table | 0 |
+-----------+-----------+------------------+-------------------+----------+Jika INNODB_LOG_MDL_SLOT menunjukkan slot dalam status SLOT_ACQUIRING dan thread pekerja terkait di INNODB_LOG_MDL_THREAD memiliki nilai thr_state yang tidak sama dengan free, maka kemungkinan besar node read-only sedang menunggu MDL. Periksa apakah ada koneksi pada node primary yang memegang kunci pada tabel yang ditampilkan di kolom slot_name.
Hubungi kami
Jika Anda memiliki pertanyaan mengenai operasi DDL, hubungi kami.
Hubungi kami
Jika Anda memiliki pertanyaan mengenai operasi DDL, silakan hubungi dukungan teknis.