Untuk memastikan stabilitas operasi kluster PolarDB, Anda dapat menggunakan fitur concurrency control (CCL) guna mengelola lonjakan lalu lintas database yang tiba-tiba, pernyataan SQL yang intensif sumber daya, serta perubahan pola akses SQL. PolarDB menyediakan toolkit DBMS_CCL untuk menyederhanakan pengelolaan fitur ini.
Prasyarat
Kluster PolarDB Anda harus menjalankan salah satu versi berikut:
-
PolarDB for MySQL 8.0.
-
PolarDB for MySQL 5.7 dengan versi revisi 5.7.1.0.6 atau lebih baru.
CatatanJika kluster Anda menjalankan PolarDB for MySQL 5.7 dengan versi revisi 5.7.1.0.27 atau lebih baru, fitur CCL kompatibel dengan fitur thread pool.
-
PolarDB for MySQL 5.6.
Catatan penggunaan
Anda hanya dapat memodifikasi aturan CCL pada node primary. Modifikasi tersebut akan disinkronkan secara otomatis ke semua node lainnya.
Cara kerja
Pencocokan dimensi
CCL menggunakan lima dimensi berikut untuk mencocokkan pernyataan SQL masuk terhadap suatu aturan:
|
Dimension |
Description |
|
TYPE |
Tipe pernyataan SQL, seperti SELECT, UPDATE, INSERT, DELETE, atau DDL. |
|
SCHEMA |
Nama database tempat pernyataan SQL dijalankan. |
|
TABLE |
Nama tabel atau view tempat pernyataan SQL dijalankan. |
|
KEYWORD |
Kata kunci dalam pernyataan SQL. Anda dapat menentukan beberapa kata kunci dalam satu aturan CCL. Pisahkan dengan titik koma (;). |
|
DIGEST |
String hash yang dihasilkan dari pernyataan SQL. Untuk informasi selengkapnya, lihat STATEMENT_DIGEST(). |
Logika pencocokan
-
Jika nilai DIGEST dalam aturan CCL tidak ditentukan:
-
Jika nilai TYPE, SCHEMA, dan TABLE ditentukan, pernyataan SQL harus cocok dengan ketiga dimensi tersebut agar aturan berlaku.
-
Jika hanya nilai TYPE yang ditentukan, pernyataan SQL harus cocok dengan dimensi TYPE agar aturan berlaku.
CatatanJika dimensi KEYWORD juga ditentukan, pemeriksaan tambahan dilakukan:
-
Jika satu kata kunci ditentukan, pernyataan SQL harus mengandung kata kunci tersebut agar pencocokan berhasil.
-
Jika beberapa kata kunci ditentukan, pernyataan SQL harus mengandung semua kata kunci yang ditentukan agar pencocokan berhasil. Urutan kata kunci dalam pernyataan SQL tidak berpengaruh.
-
-
Jika nilai DIGEST dalam aturan CCL ditentukan, nilai DIGEST dari pernyataan SQL harus cocok dengan nilai DIGEST dalam aturan tersebut. Jika nilai SCHEMA juga ditentukan dalam aturan, nilai SCHEMA dari pernyataan juga harus cocok.
-
Jika nilai SCHEMA dalam aturan CCL tidak ditentukan, pernyataan SQL hanya perlu cocok dengan nilai DIGEST agar aturan berlaku.
Prioritas pencocokan
Satu pernyataan SQL hanya dapat cocok dengan satu aturan CCL. Jika suatu pernyataan cocok dengan beberapa aturan, PolarDB menerapkan aturan dengan prioritas tertinggi. Jika beberapa aturan memiliki prioritas yang sama, PolarDB menggunakan aturan dengan ID terkecil. Prioritas aturan didasarkan pada dimensi pencocokannya, dalam urutan menurun sebagai berikut:
-
DIGEST
-
TYPE, SCHEMA, dan TABLE
-
Hanya TYPE
Parameter
Anda dapat memodifikasi parameter berikut di Konsol PolarDB. Untuk informasi selengkapnya, lihat Konfigurasi parameter kluster dan node.
|
Parameter |
Description |
|
loose_ccl_mode |
Aksi yang diambil saat batas konkurensi terlampaui. Nilai yang valid:
Catatan
Parameter ini hanya didukung untuk PolarDB for MySQL 8.0. Untuk versi 5.6 dan 5.7, sistem secara otomatis mengantrikan pernyataan. |
|
loose_ccl_max_waiting_count |
Saat Nilai yang valid: 0 hingga 65536. Nilai default: 0. Catatan
Parameter ini hanya didukung untuk PolarDB for MySQL 5.7 dan 8.0. |
Tabel aturan CCL
PolarDB menyimpan aturan CCL dalam tabel sistem concurrency_control. Sistem membuat tabel ini secara otomatis saat startup, dan Anda tidak perlu membuatnya secara manual. Pernyataan CREATE TABLE berikut menunjukkan struktur tabel tersebut:
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;
Tabel berikut menjelaskan parameter dalam tabel concurrency_control.
|
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 |
Jumlah maksimum pernyataan konkuren yang diizinkan oleh aturan. Catatan
Anda dapat mengatur nilai |
|
Keywords |
Kata kunci yang akan dicocokkan. Pisahkan beberapa kata kunci dengan titik koma (;). |
|
State |
Menentukan apakah aturan diaktifkan. Nilai yang valid:
|
|
Ordered |
Jika beberapa kata kunci ditentukan dalam bidang Keywords, parameter ini menentukan apakah kata kunci harus dicocokkan sesuai urutan yang ditentukan. Nilai yang valid:
|
|
Digest |
String hash 64-byte yang dihasilkan dari |
|
Digest_text |
Digest pernyataan ternormalisasi dari pernyataan SQL. |
|
Extra |
Informasi tambahan. |
Mengelola aturan CCL
PolarDB menyediakan enam prosedur tersimpan berikut dalam paket DBMS_CCL untuk mengelola aturan CCL:
-
add_ccl_rule: Menambahkan aturan CCL berdasarkan TYPE, SCHEMA, TABLE, dan KEYWORD.Sintaksis
dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'<Keywords>');Example
-
Tambahkan aturan CCL untuk pernyataan
SELECTdengan jumlah konkurensi 10. Saat batas ini tercapai, sistem akan mengantrikan atau menolak pernyataan berikutnya.CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 10, ''); -
Tambahkan aturan CCL untuk pernyataan
SELECTyang mengandung kata kuncikey1, dengan jumlah konkurensi 20.CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1'); -
Tambahkan aturan CCL untuk pernyataan
SELECTyang mengandung kata kuncikey1,key2, dankey3, dengan jumlah konkurensi 20. Kata kunci dapat muncul dalam urutan apa pun.CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1;key2;key3'); -
Tambahkan aturan CCL dengan
TYPEsebagaiSELECT,SCHEMAsebagaitest, danTABLEsebagait. Saat jumlah konkurensi pernyataanSELECTmencapai 10, pernyataan akan diantrikan atau error dilaporkan.CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 't', 10, '');
-
-
add_ccl_digest_rule: Menambahkan aturan CCL berdasarkan digest pernyataan.CatatanVersi mesin database berikut mendukung prosedur tersimpan
add_ccl_digest_rule:-
PolarDB for MySQL 8.0.1 dengan versi revisi 8.0.1.1.31 atau lebih baru.
-
PolarDB for MySQL 8.0.2 dengan versi revisi 8.0.2.2.12 atau lebih baru.
Sintaksis
dbms_ccl.add_ccl_digest_rule('<Schema_name>', '<Query>', <Concurrency_count>);Example
-
Tambahkan aturan CCL yang mencocokkan pernyataan SQL
SELECT * FROM t1untuk mengantrikan permintaan atau melaporkan error saat jumlah konkurensi mencapai 10.CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1", 10); -
Tambahkan aturan CCL untuk skema
testdan untuk pernyataan SQL yang cocok denganSELECT * FROM t1untuk mengantrikan permintaan atau melaporkan error saat jumlah konkurensi adalah 10.CALL dbms_ccl.add_ccl_digest_rule("test", "SELECT * FROM t1", 10); -
Tambahkan aturan CCL yang mencocokkan pernyataan SQL
SELECT * FROM t1 WHERE col1=1untuk mengantrikan permintaan atau melaporkan error saat jumlah konkurensi adalah 10.CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1 WHERE col1 = 1", 10);CatatanJika pernyataan SQL mengandung konstanta, pencocokan tetap terjadi 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 berdasarkan hash digest yang telah dihitung sebelumnya.CatatanProsedur tersimpan
add_ccl_digest_rule_by_hashhanya didukung jika versi mesin PolarDB for MySQL adalah 8.0.1 dan versi revisinya 8.0.1.1.31 atau lebih baru.Sintaks
dbms_ccl.add_ccl_digest_rule_by_hash('<Schema_name>', '<Digest>', <Concurrency_count>);Example
-
Tambahkan aturan CCL untuk pernyataan SQL yang nilai DIGEST-nya cocok dengan
533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9auntuk mengantrikan permintaan atau melaporkan error saat jumlah konkurensi adalah 10.CALL dbms_ccl.add_ccl_digest_rule_by_hash('', '533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a', 10);Dalam kasus ini,
533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9aadalah nilai DIGEST yang dihitung untukSELECT * FROM t1. Anda dapat menggunakan perintahSELECT statement_digest("SELECT * FROM t1")untuk menghitung nilai ini atau memperolehnya dari modul lain. -
Tambahkan aturan CCL untuk pernyataan SQL di mana SCHEMA adalah
testdan nilai DIGEST pernyataan SQL cocok dengan533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a. Saat jumlah konkurensi mencapai 10, permintaan diantrikan atau error dikembalikan.CALL dbms_ccl.add_ccl_digest_rule_by_hash('test', '533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a', 10);
-
-
del_ccl_rule: Menghapus aturan CCL.Sintaks
dbms_ccl.del_ccl_rule(<Id>);Example
Hapus aturan CCL dengan ID 15.
CALL dbms_ccl.del_ccl_rule(15);Jika aturan yang akan dihapus tidak ada, sistem akan melaporkan warning. Anda dapat menggunakan perintah
SHOW WARNINGS;untuk melihat isi warning tersebut. Berikut contohnya:-
Hapus aturan CCL dengan ID 100.
CALL dbms_ccl.del_ccl_rule(100);Output berikut dikembalikan:
Query OK, 0 rows affected, 2 warnings (0.00 sec) -
Jalankan perintah berikut untuk melihat pesan warning:
SHOW WARNINGS;Output berikut dikembalikan:
+---------+------+----------------------------------------------------+ | 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 | +---------+------+----------------------------------------------------+
CatatanPada contoh di atas, PolarDB for MySQL versi 8.0 memiliki
Code7517, PolarDB for MySQL versi 5.7 memilikiCode3267, dan PolarDB for MySQL versi 5.6 memilikiCode3045. -
-
show_ccl_rule: Menampilkan aturan CCL yang diaktifkan dan saat ini berada di memori.Sintaks
dbms_ccl.show_ccl_rule();Example
CALL dbms_ccl.show_ccl_rule();Output berikut dikembalikan:
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | 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 | | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+CatatanTabel berikut menjelaskan kolom MATCHED, RUNNING, dan WAITTING.
-
MATCHED: Total jumlah kali aturan mencocokkan suatu pernyataan.
-
RUNNING: Jumlah thread yang sedang berjalan di bawah aturan ini.
-
WAITTING: Jumlah thread yang sedang menunggu untuk berjalan di bawah aturan ini.
-
-
Anda dapat menggunakan pernyataan
UPDATEuntuk memodifikasi ID aturan, yang mengubah prioritasnya.Sintaks
UPDATE mysql.concurrency_control SET ID = xx WHERE ID = xx;Example
-
Jalankan perintah berikut untuk melihat aturan CCL yang diaktifkan di memori:
CALL dbms_ccl.show_ccl_rule();Output berikut dikembalikan:
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | 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 mengubah prioritas aturan CCL dengan ID 17 dengan mengubah ID-nya menjadi 20:
UPDATE mysql.concurrency_control SET ID = 20 WHERE ID = 17; -
Jalankan perintah berikut untuk melihat aturan yang telah dimodifikasi:
CALL dbms_ccl.show_ccl_rule();Output berikut dikembalikan:
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | ID | TYPE | SCHEMA | TABLE | STATE | ORDER | CONCURRENCY_COUNT | MATCHED | RUNNING | WAITTING | 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 memodifikasi aturan CCL dengan mengubah konten dalam tabel
concurrency_control, Anda juga perlu menggunakan perintah berikut agar aturan tersebut berlaku.Sintaks
dbms_ccl.flush_ccl_rule();Example
Gunakan pernyataan UPDATE untuk mengubah jumlah konkurensi aturan.
UPDATE mysql.concurrency_control SET CONCURRENCY_COUNT = 15 WHERE Id = 18;Output berikut dikembalikan:
Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0Jalankan perintah berikut untuk menerapkan perubahan:
CALL dbms_ccl.flush_ccl_rule();Output berikut dikembalikan:
Query OK, 0 rows affected (0.00 sec)
Menguji fitur
-
Buat tiga aturan CCL dengan dimensi pencocokan berbeda:
CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, ''); // Batasi pernyataan SELECT pada tabel test.sbtest1 hingga konkurensi 3. CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2'); // Batasi pernyataan SELECT yang mengandung kata kunci 'sbtest2' hingga konkurensi 2. CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, ''); // Batasi semua pernyataan SELECT lainnya hingga konkurensi 2. -
Gunakan Sysbench untuk menjalankan pengujian dengan konfigurasi berikut:
-
64 thread
-
4 tabel
-
select.lua
-
-
Lihat status konkurensi real-time:
CALL dbms_ccl.show_ccl_rule();Output berikut dikembalikan:
+------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+ | 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)Periksa kolom RUNNING. Nilainya sesuai dengan batas konkurensi yang ditentukan, yang menunjukkan bahwa aturan berfungsi dengan benar.