Kontrol Konkurensi (CCL) adalah fitur yang disediakan oleh Alibaba Cloud untuk memastikan stabilitas operasi kluster PolarDB Anda selama lonjakan lalu lintas mendadak, eksekusi pernyataan SQL ber-resource tinggi, atau perubahan pada pola akses. CCL menggunakan aturan berbasis pernyataan SQL dan dapat dikelola melalui toolkit DBMS_CCL.
Prasyarat
Kluster PolarDB Anda harus menggunakan salah satu versi berikut:
-
PolarDB for MySQL 8.0.
-
PolarDB for MySQL 5.7 dengan versi mesin minor 5.7.1.0.6 atau lebih baru.
CatatanJika kluster Anda adalah PolarDB for MySQL 5.7 dengan versi mesin minor 5.7.1.0.27 atau lebih baru, CCL kompatibel dengan Thread Pool.
-
PolarDB for MySQL 5.6.
Catatan
Ubah aturan CCL hanya pada node primary. Perubahan tersebut akan disinkronkan secara otomatis ke node lainnya.
Desain fitur
Dimension features
CCL mendefinisikan lima fitur dimensi. Pernyataan SQL dicocokkan dengan aturan CCL berdasarkan fitur-fitur ini:
|
Dimension |
Description |
|
TYPE |
Tipe pernyataan SQL, seperti SELECT, UPDATE, INSERT, DELETE, atau DDL. |
|
SCHEMA |
Nama database tempat operasi SQL dilakukan. |
|
TABLE |
Nama tabel atau view tempat operasi SQL dilakukan. |
|
KEYWORD |
Kata kunci dalam pernyataan SQL. Anda dapat mengonfigurasi beberapa kata kunci dalam satu aturan CCL. Pisahkan beberapa kata kunci dengan titik koma (;). |
|
DIGEST |
String hash yang dihasilkan dari pernyataan SQL. Untuk informasi lebih lanjut, lihat STATEMENT_DIGEST(). |
How SQL statements are matched with CCL rules
-
Jika nilai DIGEST dalam aturan CCL kosong, metode pencocokannya adalah sebagai berikut:
-
Jika nilai DIGEST kosong dan nilai TYPE, SCHEMA, serta TABLE tidak kosong, aturan hanya berlaku jika TYPE, SCHEMA, dan TABLE dalam pernyataan SQL Anda semuanya sesuai dengan nilai yang sesuai dalam aturan CCL.
-
Jika nilai DIGEST kosong, nilai SCHEMA dan TABLE kosong, dan nilai TYPE tidak kosong, aturan hanya berlaku jika TYPE pernyataan SQL Anda sesuai dengan TYPE dalam aturan CCL.
CatatanJika nilai KEYWORD dalam aturan CCL tidak kosong, kata kunci tersebut juga diperiksa:
-
Jika satu kata kunci dikonfigurasi dalam aturan CCL, pencocokan berhasil jika pernyataan SQL mengandung kata kunci tersebut.
-
Jika beberapa kata kunci dikonfigurasi dalam aturan CCL, pencocokan berhasil hanya jika pernyataan SQL mengandung semua kata kunci yang dikonfigurasi. Urutan kata kunci dalam pernyataan SQL tidak berpengaruh.
-
-
Jika nilai DIGEST dalam aturan CCL tidak kosong, aturan hanya berlaku jika nilai SCHEMA dan DIGEST pernyataan SQL Anda sesuai dengan nilai yang sesuai dalam aturan CCL.
-
Jika nilai SCHEMA dalam aturan CCL kosong, aturan berlaku jika nilai DIGEST pernyataan SQL Anda sesuai dengan nilai DIGEST dalam aturan CCL.
Matching Order for SQL Statements and CCL Rules
Satu pernyataan SQL hanya dapat mencocokkan satu aturan CCL. Jika suatu pernyataan cocok dengan beberapa aturan, aturan dengan prioritas tertinggi yang digunakan. Prioritas ditentukan dalam urutan berikut. Jika beberapa aturan memiliki prioritas yang sama, aturan dengan ID lebih rendah yang digunakan.
-
Cocokkan berdasarkan nilai DIGEST.
-
Cocokkan berdasarkan TYPE, SCHEMA, dan TABLE.
-
Cocokkan berdasarkan TYPE saja.
Parameter
Anda dapat mengubah parameter berikut di Konsol PolarDB. Untuk informasi lebih lanjut, lihat Setel parameter kluster dan node.
|
Parameter |
Description |
|
loose_ccl_mode |
Perilaku pernyataan SQL ketika batas konkurensi terlampaui. Nilai yang valid:
Catatan
Parameter ini hanya didukung oleh PolarDB for MySQL 8.0. Untuk versi 5.6 dan 5.7, pernyataan langsung masuk antrian. |
|
loose_ccl_max_waiting_count |
Ketika parameter Rentang nilai: 0 hingga 65536. Nilai default: 0. Catatan
Parameter ini hanya didukung oleh PolarDB for MySQL 5.7 dan 8.0. |
Tabel aturan CCL
PolarDB menggunakan tabel sistem bernama concurrency_control untuk menyimpan aturan CCL. Tabel ini dibuat secara otomatis oleh sistem saat startup, sehingga Anda tidak perlu membuatnya secara manual. Pernyataan CREATE untuk tabel sistem ini adalah sebagai berikut:
CREATE TABLE concurrency_control (
Id bigint AUTO_INCREMENT NOT NULL,
Type varchar(64),
Schema_name varchar(64),
Table_name varchar(64),
Concurrency_count bigint NOT NULL,
Keywords text,
State enum('N','Y') COLLATE utf8_general_ci DEFAULT 'Y' NOT NULL,
Ordered enum('N','Y') COLLATE utf8_general_ci DEFAULT 'N' NOT NULL,
Digest varchar(64),
Digest_text longtext,
Extra mediumtext,
PRIMARY KEY Rule_id(id)
) Engine=InnoDB STATS_PERSISTENT=0 CHARACTER SET utf8 COLLATE utf8_bin
comment='Concurrency control' TABLESPACE=mysql;
Parameter dijelaskan dalam tabel berikut:
|
Parameter |
Description |
|
Id |
ID aturan CCL. |
|
Type |
Tipe pernyataan SQL, seperti SELECT, UPDATE, INSERT, DELETE, atau DDL. |
|
Schema_name |
Nama database. |
|
Table_name |
Nama tabel dalam database. |
|
Concurrency_count |
Batas konkurensi. Catatan
Anda dapat mengatur |
|
Keywords |
Kata kunci. Pisahkan beberapa kata kunci dengan titik koma (;). |
|
State |
Menunjukkan apakah aturan diaktifkan. Nilai yang valid:
|
|
Ordered |
Ketika beberapa kata kunci dikonfigurasi dalam Keywords, parameter ini menentukan apakah kata kunci tersebut harus dicocokkan sesuai urutan. Nilai yang valid:
|
|
Digest |
String hash 64-byte yang dihasilkan dari |
|
Digest_text |
Fitur pernyataan SQL. |
|
Extra |
Informasi lainnya. |
Mengelola aturan CCL
Untuk membantu Anda mengelola aturan CCL, PolarDB menyediakan enam prosedur tersimpan lokal berikut di DBMS_CCL.
-
add_ccl_rule: Menambahkan aturan CCL yang dicocokkan berdasarkan TYPE, SCHEMA, TABLE, dan KEYWORD.
Syntax
dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'<Keywords>');Example
-
Tambahkan aturan CCL untuk tipe SELECT. Ketika konkurensi mencapai 10, pernyataan berikutnya masuk antrian atau melaporkan error.
CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 10, ''); -
Tambahkan aturan CCL untuk pernyataan SELECT yang mengandung kata kunci `key1`. Ketika konkurensi mencapai 20, pernyataan berikutnya masuk antrian atau melaporkan error.
CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1'); -
Tambahkan aturan CCL untuk pernyataan SELECT yang mengandung kata kunci `key1`, `key2`, dan `key3`. Urutan kata kunci tidak berpengaruh. Ketika konkurensi mencapai 20, pernyataan berikutnya masuk antrian atau melaporkan error.
CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1;key2;key3'); -
Tambahkan aturan CCL untuk pernyataan SELECT pada tabel
tdalam skematest. Ketika konkurensi pernyataan SELECT mencapai 10, pernyataan berikutnya masuk antrian atau melaporkan error.CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 't', 10, '');
-
-
add_ccl_digest_rule: Menambahkan aturan CCL yang dicocokkan berdasarkan nilai DIGEST.
CatatanProsedur tersimpan
add_ccl_digest_rulehanya didukung pada versi engine database berikut:-
PolarDB for MySQL 8.0.1 dengan versi mesin minor 8.0.1.1.31 atau lebih baru.
-
PolarDB for MySQL 8.0.2 dengan versi mesin minor 8.0.2.2.12 atau lebih baru.
Syntax
dbms_ccl.add_ccl_digest_rule('<Schema_name>', '<Query>', <Concurrency_count>);Example
-
Tambahkan aturan CCL yang mencocokkan pernyataan SQL
SELECT * FROM t1. Ketika konkurensi mencapai 10, pernyataan berikutnya masuk antrian atau melaporkan error.CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1", 10); -
Tambahkan aturan CCL yang mencocokkan pernyataan SQL
SELECT * FROM t1dalam skematest. Ketika konkurensi mencapai 10, pernyataan berikutnya masuk antrian atau melaporkan error.CALL dbms_ccl.add_ccl_digest_rule("test", "SELECT * FROM t1", 10); -
Tambahkan aturan CCL yang mencocokkan pernyataan SQL
SELECT * FROM t1 WHERE col1=1. Ketika konkurensi mencapai 10, pernyataan berikutnya masuk antrian atau melaporkan error.CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1 WHERE col1 = 1", 10);CatatanJika pernyataan SQL mengandung konstanta, pernyataan tersebut tetap dapat dicocokkan meskipun nilai konstantanya berbeda. Misalnya, aturan CCL di atas juga mencocokkan pernyataan SQL
SELECT * FROM t1 WHERE col1 = 2.
-
-
add_ccl_digest_rule_by_hash: Menambahkan aturan CCL yang dicocokkan berdasarkan nilai DIGEST. Prosedur ini menggunakan nilai DIGEST yang telah dihitung sebelumnya alih-alih pernyataan SQL.
CatatanProsedur tersimpan
add_ccl_digest_rule_by_hashhanya didukung pada PolarDB for MySQL 8.0.1 dengan versi mesin minor 8.0.1.1.31 atau lebih baru.Syntax
dbms_ccl.add_ccl_digest_rule_by_hash('<Schema_name>', '<Digest>', <Concurrency_count>);Example
-
Tambahkan aturan CCL yang mencocokkan nilai DIGEST
533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a. Ketika konkurensi mencapai 10, pernyataan berikutnya masuk antrian atau melaporkan error.CALL dbms_ccl.add_ccl_digest_rule_by_hash('', '533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a', 10);Nilai
533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9aadalah nilai DIGEST yang dihitung untukSELECT * FROM t1. Anda dapat menghitung nilai ini dengan menjalankan perintahSELECT statement_digest("SELECT * FROM t1")atau memperolehnya dari modul lain. -
Tambahkan aturan CCL untuk skema
testyang mencocokkan nilai DIGEST533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a. Ketika konkurensi mencapai 10, pernyataan berikutnya masuk antrian atau melaporkan error.CALL dbms_ccl.add_ccl_digest_rule_by_hash('test', '533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a', 10);
-
-
del_ccl_rule: Menghapus aturan CCL.
Syntax
dbms_ccl.del_ccl_rule(<Id>);Example
Hapus aturan CCL dengan ID 15.
CALL dbms_ccl.del_ccl_rule(15);Jika aturan yang ingin Anda hapus tidak ada, sistem melaporkan warning. Anda dapat menjalankan perintah
SHOW WARNINGS;untuk melihat detail warning tersebut. Berikut contohnya:-
Hapus aturan CCL dengan ID 100.
CALL dbms_ccl.del_ccl_rule(100);Outputnya adalah sebagai berikut:
Query OK, 0 rows affected, 2 warnings (0.00 sec) -
Jalankan perintah berikut untuk melihat detail warning.
SHOW WARNINGS;Outputnya adalah sebagai berikut:
+---------+------+----------------------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------------------+ | Warning | 7517 | Concurrency control rule 100 is not found in table | | Warning | 7517 | Concurrency control rule 100 is not found in cache | +---------+------+----------------------------------------------------+
CatatanSebagai contoh,
Codeuntuk PolarDB for MySQL 8.0 adalah7517,Codeuntuk PolarDB for MySQL 5.7 adalah3267, danCodeuntuk PolarDB for MySQL 5.6 adalah3045. -
-
show_ccl_rule: Menampilkan aturan CCL yang diaktifkan dalam memori.
Syntax
dbms_ccl.show_ccl_rule();Example
CALL dbms_ccl.show_ccl_rule();Outputnya adalah sebagai berikut:
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITING | 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 | | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+CatatanParameter MATCHED, RUNNING, dan WAITING dijelaskan sebagai berikut:
-
MATCHED: Jumlah kali aturan berhasil dicocokkan.
-
RUNNING: Jumlah thread yang berjalan secara konkuren di bawah aturan ini.
-
WAITING: Jumlah thread yang menunggu untuk dijalankan di bawah aturan ini.
-
-
Anda dapat menggunakan pernyataan UPDATE untuk mengubah ID aturan CCL guna menyesuaikan prioritasnya.
Syntax
UPDATE mysql.concurrency_control SET ID = xx WHERE ID = xx;Example
-
Jalankan perintah berikut untuk melihat aturan CCL yang diaktifkan dalam memori.
CALL dbms_ccl.show_ccl_rule();Outputnya adalah sebagai berikut:
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | 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 | | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ -
Jalankan perintah berikut untuk menyesuaikan prioritas aturan CCL dengan ID 17. Ini mengubah ID menjadi 20.
UPDATE mysql.concurrency_control SET ID = 20 WHERE ID = 17; -
Jalankan perintah berikut untuk melihat aturan CCL yang diaktifkan setelah diperbarui.
CALL dbms_ccl.show_ccl_rule();Outputnya adalah sebagai berikut:
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITING | KEYWORDS | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | 16 | SELECT | | | Y | N | 20 | 0 | 0 | 0 | key1 | | 18 | SELECT | | | Y | N | 10 | 0 | 0 | 0 | | | 20 | SELECT | test | t | Y | N | 30 | 0 | 0 | 0 | | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+
-
-
flush_ccl_rule: Jika Anda mengubah aturan CCL dengan memodifikasi tabel
concurrency_control, Anda harus menjalankan perintah ini agar perubahan tersebut berlaku.Syntax
dbms_ccl.flush_ccl_rule();Example
Anda dapat menyesuaikan prioritas aturan tujuan dengan mengubah ID aturan CCL dalam pernyataan UPDATE.
UPDATE mysql.concurrency_control SET CONCURRENCY_COUNT = 15 WHERE Id = 18;Outputnya adalah sebagai berikut:
Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0Jalankan perintah berikut agar pengaturan tersebut berlaku.
CALL dbms_ccl.flush_ccl_rule();Outputnya adalah sebagai berikut:
Query OK, 0 rows affected (0.00 sec)
Pengujian fungsional
-
Buat aturan CCL untuk tiga dimensi:
CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, ''); // Untuk pernyataan SELECT pada tabel sbtest1 dalam database test, konkurensinya adalah 3. CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2'); // Untuk pernyataan SELECT yang mengandung kata kunci sbtest2, konkurensinya adalah 2. CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, ''); // Untuk pernyataan SELECT, konkurensinya adalah 2. -
Gunakan Sysbench untuk melakukan pengujian dengan konfigurasi berikut:
-
64 thread
-
4 tabel
-
select.lua
-
-
Lihat konkurensi aturan:
CALL dbms_ccl.show_ccl_rule();Outputnya adalah sebagai berikut:
+------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+ | ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITING | 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)Periksa kolom RUNNING. Nilainya sesuai dengan konkurensi yang diharapkan.