Alibaba Cloud menyediakan fitur pengendalian konkurensi (CCL) dan paket DBMS_CCL untuk memastikan stabilitas instance ApsaraDB RDS for MySQL dalam menghadapi lalu lintas permintaan yang tidak terduga, pernyataan yang mengonsumsi banyak sumber daya, serta perubahan model akses SQL. Fitur CCL dikembangkan berdasarkan aturan sintaksis. Anda dapat menggunakan paket DBMS_CCL untuk membatasi jumlah maksimum pernyataan SQL dengan jenis tertentu yang dieksekusi secara bersamaan. Jika jumlah pernyataan SQL yang dieksekusi secara bersamaan mencapai batas atas, pernyataan SQL tambahan akan masuk ke keadaan menunggu hingga jumlahnya kurang dari batas atas.
Prasyarat
Versi instance yang didukung adalah sebagai berikut:
MySQL 8.0 dengan versi mesin minor 20190816 atau lebih baru
MySQL 5.7 dengan versi mesin minor 20200630 atau lebih baru
Parameter
Parameter | Deskripsi |
ccl_max_waiting_count | Jumlah maksimum pernyataan SQL yang dapat berada dalam status |
ccl_wait_timeout | Waktu maksimum yang dapat ditunggu oleh suatu pernyataan SQL dalam status |
Catatan Penggunaan
Operasi CCL hanya memengaruhi instance RDS saat ini karena tidak ada log yang dihasilkan. Sebagai contoh, operasi CCL yang dilakukan pada instance RDS utama tidak disinkronkan ke instance RDS sekunder, instance RDS baca-saja, atau instance RDS pemulihan bencana.
CCL menyediakan mekanisme timeout untuk menyelesaikan deadlock transaksi yang disebabkan oleh pernyataan DML. Thread yang tertunda juga merespons timeout transaksi dan penghentian thread untuk mencegah deadlock.
Deskripsi Fitur
CCL menyediakan fitur berdasarkan dimensi berikut:
SQL command: Jenis perintah SQL, seperti SELECT, UPDATE, INSERT, atau DELETE.
Object: Objek yang dioperasikan oleh perintah SQL, seperti TABLE atau VIEW.
Keywords: Kata kunci dalam perintah SQL.
Template: Templat perintah SQL.
Buat Tabel CCL
AliSQL menggunakan tabel sistem bernama concurrency_control untuk menyimpan aturan CCL. Sistem secara otomatis membuat tabel tersebut ketika sistem dijalankan. Anda dapat mengeksekusi pernyataan berikut untuk membuat tabel:
CREATE TABLE `concurrency_control` (
`Id` bigint NOT NULL AUTO_INCREMENT,
`Type` enum('SELECT','UPDATE','INSERT','DELETE','TEMPLATE') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'SELECT',
`Schema_name` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL,
`Table_name` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL,
`Concurrency_count` bigint NOT NULL,
`Keywords` text COLLATE utf8mb3_bin,
`State` enum('N','Y') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'Y',
`Ordered` enum('N','Y') CHARACTER SET utf8mb3 COLLATE utf8mb3_general_ci NOT NULL DEFAULT 'N',
`Digest` varchar(64) COLLATE utf8mb3_bin DEFAULT NULL,
`SQL_template` longtext COLLATE utf8mb3_bin,
PRIMARY KEY (`Id`)
) /*!50100 TABLESPACE `mysql` */ ENGINE=InnoDB DEFAULT CHARSET=utf8mb3 COLLATE=utf8mb3_bin STATS_PERSISTENT=0 COMMENT='Pengendalian konkurensi'Parameter | Deskripsi |
Id | ID aturan CCL. |
Type | Tipe pernyataan SQL. |
Schema_name | Nama database. |
Table_name | Nama tabel dalam database. |
Concurrency_count | Jumlah konkurensi. Jika diatur ke 0, semua pernyataan SQL yang sesuai dengan aturan ini ditolak, dan kode kesalahan |
Keywords | Kata kunci. Pisahkan beberapa kata kunci dengan titik koma (;). |
State | Menentukan apakah aturan diaktifkan. |
Ordered | Menentukan apakah akan mencocokkan beberapa kata kunci secara berurutan. |
Digest | String hash 64-byte yang diperoleh dengan melakukan perhitungan hash berdasarkan SQL_template. |
SQL_template | Template pernyataan SQL. |
Kelola Aturan CCL
Untuk menyederhanakan pengelolaan aturan CCL, AliSQL menyediakan empat prosedur penyimpanan lokal berikut dalam DBMS_CCL:
add_ccl_rule: Tambahkan aturan
Templat perintah
dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'<Keywords>');
Contoh
Tambahkan aturan berdasarkan tipe perintah SQL: Atur konkurensi untuk semua pernyataan SELECT menjadi 10.
mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 10, '');Tambahkan aturan berdasarkan kata kunci: Atur konkurensi untuk pernyataan SELECT yang mengandung kata kunci `key1` menjadi 20.
mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1');Tambahkan aturan lengkap: Atur konkurensi untuk pernyataan SELECT pada tabel `test.t` yang mengandung kata kunci `key2` menjadi 20.
mysql> call dbms_ccl.add_ccl_rule('SELECT', 'test', 't', 20, 'key2');
add_ccl_template_rule: Tambahkan aturan berbasis templat
Prasyarat
Untuk menambahkan aturan berbasis templat, instance Anda harus memenuhi salah satu persyaratan versi berikut:
MySQL 8.0 dengan versi mesin minor 20230630 atau lebih baru
MySQL 5.7 dengan versi mesin minor 20241231 atau lebih baru
Templat perintah
dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'', 'Template_sql');CatatanAnda tidak perlu menentukan parameter Table_name. Anda harus menentukan satu pernyataan SQL untuk parameter Template_sql.
Anda dapat menggunakan fungsi bawaan STATEMENT_DIGEST_TEXT untuk melihat template SQL yang sesuai dengan pernyataan SQL.
Contoh
Tambahkan aturan berbasis templat untuk mengatur konkurensi menjadi 30 bagi pernyataan SQL dalam database `test` yang sesuai dengan templat
'SELECT c FROM t1 WHERE id=?'.call dbms_ccl.add_ccl_rule('TEMPLATE', 'test', '', 30, '', 'SELECT c FROM t1 WHERE id=4');CatatanSetiap pernyataan SQL hanya dapat cocok dengan satu aturan.
Aturan dari tipe berbeda terdaftar dalam urutan menurun: aturan template, aturan lengkap, aturan kata kunci, aturan pernyataan SQL. Setiap set aturan diperiksa bergantian untuk menentukan apakah suatu aturan tercapai.
del_ccl_rule: Hapus aturan
Templat perintah
dbms_ccl.del_ccl_rule(<Id>);
Contoh
Menghapus aturan CCL dengan ID 15.
mysql> call dbms_ccl.del_ccl_rule(15);CatatanJika aturan yang ingin Anda hapus tidak ada, sistem akan mengeluarkan peringatan. Anda dapat menjalankan perintah
show warnings;untuk melihat pesan peringatan tersebut.mysql> call dbms_ccl.del_ccl_rule(100); Query OK, 0 rows affected, 2 warnings (0.00 sec) mysql> show warnings; +---------+------+----------------------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------------------+ | Warning | 7514 | Concurrency control rule 100 is not found in table | | Warning | 7514 | Concurrency control rule 100 is not found in cache | +---------+------+----------------------------------------------------+
show_ccl_rule: Lihat aturan yang diaktifkan dalam memori
Templat perintah
dbms_ccl.show_ccl_rule();
Contoh
mysql> call dbms_ccl.show_ccl_rule(); +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | KEYWORDS | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | 17 | SELECT | test | t | Y | N | 30 | 0 | 0 | 0 | | | 16 | SELECT | | | Y | N | 20 | 0 | 0 | 0 | key1 | | 18 | SELECT | | | Y | N | 10 | 0 | 0 | 0 | | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+Tabel berikut menjelaskan kolom MATCHED, RUNNING, dan
WAITING.Parameter
Deskripsi
MATCHED
Jumlah kali aturan dicocokkan.
RUNNING
Jumlah thread yang sedang berjalan secara bersamaan di bawah aturan.
WAITTING
Jumlah thread yang tertunda di bawah aturan.
flush_ccl_rule: Terapkan perubahan aturan
Templat perintah
Jika Anda langsung memodifikasi aturan dalam tabel concurrency_control, perubahan tersebut tidak langsung berlaku. Anda harus menjalankan perintah berikut untuk menerapkan perubahan tersebut:
dbms_ccl.flush_ccl_rule();
Contoh
mysql> update mysql.concurrency_control set CONCURRENCY_COUNT = 15 where Id = 18; Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0 mysql> call dbms_ccl.flush_ccl_rule(); Query OK, 0 rows affected (0.00 sec)
Pengujian Fitur
Aturan uji
Tiga aturan berikut masing-masing sesuai dengan tiga dimensi:
-- Buat aturan di mana jumlah pernyataan SELECT bersamaan dengan kata kunci sbtest1 adalah 3. call dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, ''); -- Buat aturan di mana jumlah pernyataan SELECT bersamaan dengan kata kunci sbtest2 adalah 2. call dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2'); -- Buat aturan di mana jumlah pernyataan SELECT bersamaan adalah 2. call dbms_ccl.add_ccl_rule('SELECT', '', '', 2, '');Skenario Uji
Gunakan sysbench untuk pengujian dalam skenario berikut:
64 thread
4 tabel
select.lua
Hasil Uji
Eksekusi pernyataan berikut untuk menanyakan jumlah thread bersamaan di bawah aturan:
mysql> call dbms_ccl.show_ccl_rule(); +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+ | ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | KEYWORDS | +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+ | 20 | SELECT | test | sbtest1 | Y | N | 3 | 389 | 3 | 9 | | | 21 | SELECT | | | Y | N | 2 | 375 | 2 | 14 | sbtest2 | | 22 | SELECT | | | Y | N | 2 | 519 | 2 | 34 | | +------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+ 3 rows in set (0.00 sec)Angka yang ditampilkan dalam kolom RUNNING sama dengan yang ditentukan saat Anda membuat aturan.