O Alibaba Cloud oferece o recurso de controle de concorrência (CCL) e o pacote DBMS_CCL para garantir a estabilidade das instâncias do ApsaraDB RDS for MySQL diante de tráfego inesperado de requisições, instruções que consomem muitos recursos e alterações no modelo de acesso SQL. O recurso CCL baseia-se em regras de sintaxe. Use o pacote DBMS_CCL para limitar o número máximo de instruções SQL executadas simultaneamente para tipos específicos. Quando a quantidade de instruções SQL em execução simultânea atinge o limite superior, as instruções excedentes entram em estado de espera até que o total fique abaixo desse limite.
Pré-requisitos
A instância RDS deve executar uma das seguintes versões do MySQL:
MySQL 8.4
MySQL 8.0 com versão secundária do mecanismo 20190816 ou posterior
MySQL 5.7 com versão secundária do mecanismo 20200630 ou posterior
Parâmetros
|
Parâmetro |
Descrição |
|
ccl_max_waiting_count |
Número máximo de instruções SQL correspondentes à mesma regra CCL que podem permanecer no estado |
|
ccl_wait_timeout |
Tempo máximo que uma instrução SQL pode aguardar no estado |
Observações de uso
As operações de CCL afetam apenas a instância RDS atual, pois não geram logs. Por exemplo, operações de CCL realizadas na instância RDS primária não são sincronizadas com a instância RDS secundária, a instância RDS somente leitura ou a instância RDS de recuperação de desastres.
O CCL dispõe de um mecanismo de timeout para resolver deadlocks de transação causados por instruções DML. As threads pendentes também respondem ao timeout da transação e à finalização da thread para evitar deadlocks.
Descrição do recurso
O CCL fornece funcionalidades baseadas nas seguintes dimensões:
Comando SQL: Tipo do comando SQL, como SELECT, UPDATE, INSERT ou DELETE.
Objeto: Objeto no qual o comando SQL é executado, como TABLE ou VIEW.
Palavras-chave: Palavras-chave presentes em um comando SQL.
Modelo: Modelo de um comando SQL.
Criar uma tabela CCL
O AliSQL utiliza uma tabela de sistema chamada concurrency_control para armazenar regras CCL. O sistema cria essa tabela automaticamente durante a inicialização. Execute as instruções a seguir para criar a tabela:
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='Concurrency control'
|
Parâmetro |
Descrição |
|
Id |
ID da regra CCL. |
|
Type |
Tipo da instrução SQL. |
|
Schema_name |
Nome do banco de dados. |
|
Table_name |
Nome da tabela no banco de dados. |
|
Concurrency_count |
Contagem de concorrência. Se você definir este parâmetro como 0, todas as instruções SQL correspondentes à regra serão negadas e retornarão o erro |
|
Keywords |
Palavra-chave. Separe múltiplas palavras-chave com ponto e vírgula (;). |
|
State |
Define se a regra deve ser ativada. |
|
Ordered |
Define se várias keywords devem ser correspondidas em sequência. |
|
Digest |
String hash de 64 bytes obtida mediante cálculo de hash baseado no SQL_template. |
|
SQL_template |
Modelo da instrução SQL. |
Gerenciar regras CCL
O AliSQL disponibiliza quatro interfaces de gerenciamento no pacote DBMS_CCL. A lista a seguir descreve essas interfaces:
add_ccl_rule: Adicionar uma regra
-
Sintaxe
dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'<Keywords>');
-
Exemplos
-
Defina a contagem de concorrência para todas as instruções SELECT como 10.
mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 10, ''); -
Configure a contagem de concorrência como 20 para instruções SELECT que contenham a palavra-chave key1.
mysql> call dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1'); -
Estabeleça a contagem de concorrência em 20 para instruções SELECT executadas na tabela test.t e que contenham a palavra-chave key2.
mysql> call dbms_ccl.add_ccl_rule('SELECT', 'test', 't', 20, 'key2');
-
add_ccl_template_rule: Adicionar uma regra de modelo
-
Pré-requisitos
Para adicionar uma regra de modelo, sua instância deve executar uma das seguintes versões:
MySQL 8.4
MySQL 8.0 com versão secundária do mecanismo 20230630 ou posterior
MySQL 5.7 com versão secundária do mecanismo 20241231 ou posterior
-
Sintaxe
dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'', 'Template_sql');NotaNão é necessário especificar o parâmetro Table_name. É obrigatório especificar uma instrução SQL para o parâmetro Template_sql.
Use a função integrada STATEMENT_DIGEST_TEXT para visualizar o modelo SQL correspondente à instrução SQL.
-
Exemplo
Defina a contagem de concorrência como 30 para instruções SQL no banco de dados test que correspondam ao modelo
'SELECT c FROM t1 WHERE id=?'.call dbms_ccl.add_ccl_rule('TEMPLATE', 'test', '', 30, '', 'SELECT c FROM t1 WHERE id=4');NotaCada instrução SQL pode corresponder a apenas uma regra.
As regras de diferentes tipos são listadas em ordem decrescente: regra de modelo, regra completa, regra de palavra-chave, regra de instrução SQL. Cada conjunto de regras é verificado sequencialmente para determinar se houve correspondência.
del_ccl_rule: Excluir uma regra
-
Sintaxe
dbms_ccl.del_ccl_rule(<Id>);
-
Exemplo
Exclua a regra CCL cujo ID é 15.
mysql> call dbms_ccl.del_ccl_rule(15);NotaSe a regra que você deseja excluir não existir, o sistema emitirá um aviso. Execute o comando
show warnings;para visualizar os detalhes do aviso.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: Visualizar regras ativadas
-
Sintaxe
dbms_ccl.show_ccl_rule();
-
Exemplo
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 | | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+A tabela a seguir descreve MATCHED, RUNNING e
WAITTING.Parâmetro
Descrição
MATCHED
Quantidade de vezes que a regra foi correspondida.
RUNNING
Número de threads em execução simultânea sob esta regra.
WAITTING
Total de threads pendentes associadas à regra.
flush_ccl_rule: Aplicar regras
-
Sintaxe
Alterações diretas na tabela concurrency_control não entram em vigor imediatamente. Execute o comando abaixo para aplicar as regras:
dbms_ccl.flush_ccl_rule();
-
Exemplo
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)
Teste do recurso
-
Script de teste
Execute as instruções a seguir para criar regras para três dimensões.
-- Create a rule for which the number of concurrent SELECT statements with the sbtest1 keyword is 3. call dbms_ccl.add_ccl_rule('SELECT', 'test', 'sbtest1', 3, ''); -- Create a rule for which the number of concurrent SELECT statements with the sbtest2 keyword is 2. call dbms_ccl.add_ccl_rule('SELECT', '', '', 2, 'sbtest2'); -- Create a rule for which the number of concurrent SELECT statements is 2. call dbms_ccl.add_ccl_rule('SELECT', '', '', 2, ''); -
Cenário de teste
Use o sysbench para realizar testes nos seguintes cenários:
64 threads
4 tabelas
select.lua
-
Resultados do teste
Execute a instrução abaixo para consultar o número de threads simultâneas sob as regras:
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)Os valores exibidos na coluna RUNNING correspondem aos definidos durante a criação das regras.