PolarDB kümenizin kararlı çalışmasını sağlamak için, veritabanı trafiğindeki ani artışları, kaynak yoğun SQL deyimlerini ve SQL erişim kalıplarındaki değişiklikleri yönetmek üzere eşzamanlılık denetimi (CCL) özelliğini kullanabilirsiniz. PolarDB bu özelliğin yönetimini kolaylaştırmak amacıyla DBMS_CCL araç setini sunar.
Önkoşullar
PolarDB kümeniz aşağıdaki sürümlerden birini çalıştırıyor olmalıdır:
PolarDB for MySQL 8,0.
-
PolarDB for MySQL 5,7 (revizyon sürümü 5,7.1.0.6 veya üzeri).
NotKümeniz revizyon sürümü 5,7.1.0.27 veya üzeri olan PolarDB for MySQL 5,7 çalıştırıyorsa CCL özelliği iş parçacığı havuzu özelliği ile uyumludur.
PolarDB for MySQL 5,6.
Kullanım notları
CCL kurallarını yalnızca birincil düğümde değiştirebilirsiniz. Değişiklikler diğer tüm düğümlere otomatik olarak yansıtılır.
Çalışma mekanizması
Eşleşme boyutları
CCL, gelen bir SQL deyimi ile bir kuralı eşleştirmek için aşağıdaki beş boyutu kullanır:
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Eşleşme mantığı
-
Bir CCL kuralında DIGEST değeri belirtilmemişse:
TYPE, SCHEMA ve TABLE değerleri belirtilmişse kuralın uygulanması için bir SQL deyiminin bu üç boyutun tamamıyla eşleşmesi gerekir.
Yalnızca TYPE değeri belirtilmişse kuralın uygulanması için bir SQL deyiminin TYPE boyutuyla eşleşmesi gerekir.
NotKEYWORD boyutu da belirtilmişse ek kontroller yapılır:
Tek bir anahtar sözcük belirtilmişse eşleşmenin başarılı olması için SQL deyiminin bu anahtar sözcüğü içermesi gerekir.
Birden fazla anahtar sözcük belirtilmişse eşleşmenin başarılı olması için SQL deyiminin belirtilen tüm anahtar sözcükleri içermesi gerekir. Anahtar sözcüklerin SQL deyimi içindeki sırası önemli değildir.
Bir CCL kuralında DIGEST değeri belirtilmişse SQL deyiminin DIGEST değerinin kuraldaki DIGEST değeriyle eşleşmesi gerekir. Kuralda SCHEMA değeri de belirtilmişse deyimin SCHEMA değerinin de eşleşmesi gerekir.
Bir CCL kuralında SCHEMA değeri belirtilmemişse kuralın uygulanması için bir SQL deyiminin yalnızca DIGEST değeriyle eşleşmesi gerekir.
Eşleşme önceliği
Bir SQL deyimi yalnızca bir CCL kuralıyla eşleşebilir. Bir deyim birden fazla kuralla eşleşiyorsa PolarDB en yüksek önceliğe sahip kuralı uygular. Birden fazla kural aynı önceliğe sahipse PolarDB en küçük ID'ye sahip kuralı kullanır. Bir kuralın önceliği, azalan sırada aşağıdaki gibi eşleşme boyutlarına dayanır:
DIGEST
TYPE, SCHEMA ve TABLE
Yalnızca TYPE
Parametreler
Aşağıdaki parametreleri PolarDB konsolunda değiştirebilirsiniz. Daha fazla bilgi için bkz. Küme ve düğüm parametrelerini yapılandırma.
|
Parametre |
Açıklama |
|
loose_ccl_mode |
Eşzamanlılık sınırı aşıldığında gerçekleştirilecek eylem. Geçerli değerler:
Not
Bu parametre yalnızca PolarDB for MySQL 8,0 için desteklenir. 5,6 ve 5,7 sürümleri için sistem deyimleri otomatik olarak kuyruğa alır. |
|
loose_ccl_max_waiting_count |
Geçerli değerler: 0 ila 65536. Varsayılan değer: 0. Not
Bu parametre yalnızca PolarDB for MySQL 5,7 ve 8,0 için desteklenir. |
CCL kural tablosu
PolarDB CCL kurallarını concurrency_control sistem tablosunda saklar. Sistem bu tabloyu başlangıçta otomatik olarak oluşturur; sizin manuel olarak oluşturmanız gerekmez. Aşağıdaki CREATE TABLE deyimi tablonun yapısını gösterir:
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;
Aşağıdaki tabloda concurrency_control tablosundaki parametreler açıklanmaktadır.
|
Parametre |
Açıklama |
|
Id |
CCL kuralının ID'si. |
|
Type |
SQL deyiminin türü (örneğin SELECT, UPDATE, INSERT, DELETE veya DDL). |
|
Schema_name |
Veritabanının adı. |
|
Table_name |
Veritabanındaki tablonun adı. |
|
Concurrency_count |
Kural tarafından izin verilen maksimum eşzamanlı deyim sayısı. Not
Eşleşen sorguların yürütülmesini engelleyen bir SQL engelleme listesi uygulamak için |
|
Keywords |
Eşleştirilecek anahtar sözcük veya anahtar sözcükler. Birden fazla anahtar sözcüğü noktalı virgül (;) ile ayırın. |
|
State |
Kuralın etkin olup olmadığını belirtir. Geçerli değerler:
|
|
Ordered |
Keywords alanında birden fazla anahtar sözcük belirtilmişse bu parametre anahtar sözcüklerin belirtilen sırayla eşleştirilmesi gerekip gerekmediğini belirtir. Geçerli değerler:
|
|
Digest |
|
|
Digest_text |
SQL deyiminin normalleştirilmiş deyim özetidir. |
|
Extra |
Ek bilgiler. |
CCL kurallarını yönetme
PolarDB CCL kurallarını yönetmek için DBMS_CCL paketinde aşağıdaki altı saklı yordamı sunar:
-
add_ccl_rule: TYPE, SCHEMA, TABLE ve KEYWORD'a dayalı bir CCL kuralı ekler.Sözdizimi
dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'<Keywords>');Example
-
Eşzamanlılık sayısı 10 olan
SELECTdeyimleri için bir CCL kuralı ekleyin. Bu sınıra ulaşıldığında sistem sonraki deyimleri kuyruğa alır veya reddeder.CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 10, ''); -
key1anahtar sözcüğünü içerenSELECTdeyimleri için eşzamanlılık sayısı 20 olan bir CCL kuralı ekleyin.CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1'); -
key1,key2vekey3anahtar sözcüklerini içerenSELECTdeyimleri için eşzamanlılık sayısı 20 olan bir CCL kuralı ekleyin. Anahtar sözcükler herhangi bir sırada görünebilir.CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1;key2;key3'); -
TYPEolarakSELECT,SCHEMAolaraktestveTABLEolaraktiçeren bir CCL kuralı ekleyin.SELECTdeyimlerinin eşzamanlılık sayısı 10'a ulaştığında deyimler kuyruğa alınır veya bir hata bildirilir.CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 't', 10, '');
-
-
add_ccl_digest_rule: Bir deyim özetine dayalı olarak bir CCL kuralı ekler.NotAşağıdaki veritabanı altyapısı sürümleri
add_ccl_digest_rulesaklı yordamını destekler:PolarDB for MySQL 8,0.1 (revizyon sürümü 8,0.1.1.31 veya üzeri).
PolarDB for MySQL 8,0.2 (revizyon sürümü 8,0.2.2.12 veya üzeri).
Sözdizimi
dbms_ccl.add_ccl_digest_rule('<Schema_name>', '<Query>', <Concurrency_count>);Example
-
Eşzamanlılık sayısı 10'a ulaştığında istekleri kuyruğa almak veya bir hata bildirmek için
SELECT * FROM t1SQL deyimiyle eşleşen bir CCL kuralı ekleyin.CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1", 10); -
testşeması veSELECT * FROM t1ile eşleşen SQL deyimleri için eşzamanlılık sayısı 10 olduğunda istekleri kuyruğa almak veya bir hata bildirmek üzere bir CCL kuralı ekleyin.CALL dbms_ccl.add_ccl_digest_rule("test", "SELECT * FROM t1", 10); -
Eşzamanlılık sayısı 10 olduğunda istekleri kuyruğa almak veya bir hata bildirmek için
SELECT * FROM t1 WHERE col1=1SQL deyimiyle eşleşen bir CCL kuralı ekleyin.CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1 WHERE col1 = 1", 10);NotBir SQL deyimi sabit içeriyorsa sabit değerler farklı olsa bile eşleşme gerçekleşir. Örneğin önceki CCL kuralı
SELECT * FROM t1 WHERE col1 = 2SQL deyimiyle de eşleşir.
-
add_ccl_digest_rule_by_hash: Önceden hesaplanmış bir özet karmasına dayalı olarak bir CCL kuralı ekler.Notadd_ccl_digest_rule_by_hashsaklı yordamı yalnızca PolarDB for MySQL altyapı sürümü 8,0.1 ve revizyon sürümü 8,0.1.1.31 veya üzeri ise desteklenir.Sözdizimi
dbms_ccl.add_ccl_digest_rule_by_hash('<Schema_name>', '<Digest>', <Concurrency_count>);Example
-
DIGEST değeri
533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9aile eşleşen SQL deyimleri için eşzamanlılık sayısı 10 olduğunda istekleri kuyruğa almak veya bir hata bildirmek üzere bir CCL kuralı ekleyin.CALL dbms_ccl.add_ccl_digest_rule_by_hash('', '533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a', 10);Bu durumda
533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9adeğeriSELECT * FROM t1için hesaplanan DIGEST değeridir. Bu değeri hesaplamak veya başka modüllerden elde etmek içinSELECT statement_digest("SELECT * FROM t1")komutunu kullanabilirsiniz. -
SCHEMA'nın
testolduğu ve SQL deyiminin DIGEST değerinin533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9aile eşleştiği SQL deyimleri için bir CCL kuralı ekleyin. Eşzamanlılık sayısı 10'a ulaştığında istekler kuyruğa alınır veya bir hata döndürülür.CALL dbms_ccl.add_ccl_digest_rule_by_hash('test', '533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a', 10);
-
-
del_ccl_rule: Bir CCL kuralını siler.Sözdizimi
dbms_ccl.del_ccl_rule(<Id>);Example
ID'si 15 olan CCL kuralını silin.
CALL dbms_ccl.del_ccl_rule(15);Silinecek kural mevcut değilse sistem bir uyarı bildirir. Uyarı içeriğini görüntülemek için
SHOW WARNINGS;komutunu kullanabilirsiniz. Aşağıda bir örnek verilmiştir:-
ID'si 100 olan CCL kuralını silin.
CALL dbms_ccl.del_ccl_rule(100);Aşağıdaki çıktı döndürülür:
Query OK, 0 rows affected, 2 warnings (0.00 sec) -
Uyarı mesajını görüntülemek için aşağıdaki komutu çalıştırın:
SHOW WARNINGS;Aşağıdaki çıktı döndürülür:
+---------+------+----------------------------------------------------+ | 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 | +---------+------+----------------------------------------------------+
NotÖnceki örnekte PolarDB for MySQL sürüm 8,0 için
Codedeğeri7517, PolarDB for MySQL sürüm 5,7 içinCodedeğeri3267ve PolarDB for MySQL sürüm 5,6 içinCodedeğeri3045şeklindedir. -
-
show_ccl_rule: Şu anda bellekte bulunan etkin CCL kurallarını görüntüler.Sözdizimi
dbms_ccl.show_ccl_rule();Example
CALL dbms_ccl.show_ccl_rule();Aşağıdaki çıktı döndürülür:
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | 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 | | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+NotAşağıdaki tabloda MATCHED, RUNNING ve WAITTING sütunları açıklanmaktadır.
MATCHED: Kuralın bir deyimle kaç kez eşleştiğinin toplam sayısı.
RUNNING: Bu kural kapsamında şu anda çalışan iş parçacığı sayısı.
WAITTING: Bu kural kapsamında şu anda çalışmayı bekleyen iş parçacığı sayısı.
-
Bir kuralın ID'sini değiştirmek ve böylece önceliğini değiştirmek için bir
UPDATEdeyimi kullanabilirsiniz.Sözdizimi
UPDATE mysql.concurrency_control SET ID = xx WHERE ID = xx;Example
-
Bellekteki etkin CCL kurallarını görüntülemek için aşağıdaki komutu çalıştırın:
CALL dbms_ccl.show_ccl_rule();Aşağıdaki çıktı döndürülür:
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | 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 | | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ -
ID'si 17 olan CCL kuralının ID'sini 20 olarak değiştirerek önceliğini değiştirmek için aşağıdaki komutu çalıştırın:
UPDATE mysql.concurrency_control SET ID = 20 WHERE ID = 17; -
Değiştirilen kuralları görüntülemek için aşağıdaki komutu çalıştırın:
CALL dbms_ccl.show_ccl_rule();Aşağıdaki çıktı döndürülür:
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | 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:
concurrency_controltablosundaki içeriği değiştirerek bir CCL kuralını değiştirirseniz kuralın etkili olması için aşağıdaki komutu da kullanmanız gerekir.Sözdizimi
dbms_ccl.flush_ccl_rule();Example
Bir kuralın eşzamanlılık sayısını değiştirmek için bir UPDATE deyimi kullanın.
UPDATE mysql.concurrency_control SET CONCURRENCY_COUNT = 15 WHERE Id = 18;Aşağıdaki çıktı döndürülür:
Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0Değişikliği uygulamak için aşağıdaki komutu çalıştırın:
CALL dbms_ccl.flush_ccl_rule();Aşağıdaki çıktı döndürülür:
Query OK, 0 rows affected (0.00 sec)
Özelliği test etme
-
Farklı eşleşme boyutlarına sahip üç CCL kuralı oluşturun:
CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, ''); // Limit SELECT statements on the test.sbtest1 table to a concurrency of 3. CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2'); // Limit SELECT statements containing the keyword 'sbtest2' to a concurrency of 2. CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 2, ''); // Limit all other SELECT statements to a concurrency of 2. -
Aşağıdaki yapılandırmayla Sysbench kullanarak bir test çalıştırın:
64 iş parçacığı
4 tablo
select.lua
-
Gerçek zamanlı eşzamanlılık durumunu görüntüleyin:
CALL dbms_ccl.show_ccl_rule();Aşağıdaki çıktı döndürülür:
+------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+ | 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)RUNNING sütununu kontrol edin. Değerler belirtilen eşzamanlılık sınırlarıyla eşleşir; bu da kuralların doğru çalıştığını gösterir.