Para garantir a operação estável do seu cluster PolarDB, use o recurso de controle de concorrência (CCL) para gerenciar picos repentinos de tráfego no banco de dados, instruções SQL que consomem muitos recursos e alterações nos padrões de acesso SQL. O PolarDB fornece o toolkit DBMS_CCL para simplificar o gerenciamento desse recurso.
Pré-requisitos
Seu cluster PolarDB deve executar uma das seguintes versões:
PolarDB for MySQL 8.0.
-
PolarDB for MySQL 5.7 com versão de revisão 5.7.1.0.6 ou posterior.
NotaSe o seu cluster executar o PolarDB for MySQL 5.7 com versão de revisão 5.7.1.0.27 ou posterior, o recurso CCL será compatível com o recurso thread pool.
PolarDB for MySQL 5.6.
Notas de uso
Modifique regras CCL apenas no nó primário. As alterações são sincronizadas automaticamente para todos os outros nós.
Funcionamento
Dimensões de correspondência
O CCL utiliza as cinco dimensões a seguir para comparar uma instrução SQL recebida com uma regra:
|
Dimensão |
Descrição |
|
TYPE |
Tipo da instrução SQL, como SELECT, UPDATE, INSERT, DELETE ou DDL. |
|
SCHEMA |
Nome do banco de dados no qual a instrução SQL opera. |
|
TABLE |
Nome da tabela ou visualização na qual a instrução SQL opera. |
|
KEYWORD |
Palavra-chave dentro da instrução SQL. Especifique várias palavras-chave em uma regra CCL separando-as por ponto e vírgula (;). |
|
DIGEST |
String de hash gerada a partir da instrução SQL. Para obter mais informações, consulte STATEMENT_DIGEST(). |
Lógica de correspondência
-
Caso o valor DIGEST não esteja especificado em uma regra CCL:
Se os valores TYPE, SCHEMA e TABLE estiverem definidos, a instrução SQL precisará corresponder às três dimensões para que a regra seja aplicada.
Quando apenas o valor TYPE estiver definido, a instrução SQL deverá corresponder à dimensão TYPE para que a regra seja aplicada.
NotaSe a dimensão KEYWORD também estiver especificada, o sistema realiza verificações adicionais:
Ao definir uma única palavra-chave, a instrução SQL deve contê-la para que a correspondência tenha sucesso.
Ao definir múltiplas palavras-chave, a instrução SQL precisa conter todas elas para que a correspondência tenha sucesso. A ordem das palavras-chave na instrução SQL não importa.
Se o valor DIGEST estiver especificado em uma regra CCL, o valor DIGEST da instrução SQL deve corresponder ao valor DIGEST da regra. Caso o valor SCHEMA também esteja definido na regra, o valor SCHEMA da instrução também precisará corresponder.
Quando o valor SCHEMA não estiver especificado em uma regra CCL, a instrução SQL precisará corresponder apenas ao valor DIGEST para que a regra seja aplicada.
Prioridade de correspondência
Uma instrução SQL pode corresponder a apenas uma regra CCL. Se uma instrução corresponder a várias regras, o PolarDB aplicará aquela com a maior prioridade. Caso múltiplas regras tenham a mesma prioridade, o PolarDB usará a regra com o menor ID. A prioridade de uma regra baseia-se em suas dimensões de correspondência, na seguinte ordem decrescente:
DIGEST
TYPE, SCHEMA e TABLE
Apenas TYPE
Parâmetros
Modifique os parâmetros a seguir no console do PolarDB. Para obter mais informações, consulte Configure cluster and node parameters.
|
Parâmetro |
Descrição |
|
loose_ccl_mode |
Ação a ser tomada quando o limite de concorrência for excedido. Valores válidos:
Nota
Este parâmetro tem suporte apenas no PolarDB for MySQL 8.0. Nas versões 5.6 e 5.7, o sistema enfileira as instruções automaticamente. |
|
loose_ccl_max_waiting_count |
Quando Valores válidos: 0 a 65536. Valor padrão: 0. Nota
Este parâmetro tem suporte apenas no PolarDB for MySQL 5.7 e 8.0. |
Tabela de regras CCL
O PolarDB armazena as regras CCL na tabela de sistema concurrency_control. O sistema cria essa tabela automaticamente na inicialização, portanto, não é necessário criá-la manualmente. A instrução CREATE TABLE a seguir mostra a estrutura da tabela:
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 tabela a seguir descreve os parâmetros da tabela concurrency_control.
|
Parâmetro |
Descrição |
|
Id |
ID da regra CCL. |
|
Type |
Tipo da instrução SQL, como SELECT, UPDATE, INSERT, DELETE ou DDL. |
|
Schema_name |
Nome do banco de dados. |
|
Table_name |
Nome da tabela no banco de dados. |
|
Concurrency_count |
Número máximo de instruções simultâneas permitidas pela regra. Nota
Defina o valor de |
|
Keywords |
Palavra-chave ou palavras-chave para correspondência. Separe múltiplas palavras-chave com ponto e vírgula (;). |
|
State |
Indica se a regra está ativada. Valores válidos:
|
|
Ordered |
Se múltiplas palavras-chave forem especificadas no campo Keywords, este parâmetro define se elas devem ser correspondidas na ordem especificada. Valores válidos:
|
|
Digest |
String de hash de 64 bytes gerada a partir de |
|
Digest_text |
Digest normalizado da instrução SQL. |
|
Extra |
Informações adicionais. |
Gerencie regras CCL
O PolarDB fornece os seis procedimentos armazenados a seguir no pacote DBMS_CCL para gerenciar regras CCL:
-
add_ccl_rule: Adiciona uma regra CCL com base em TYPE, SCHEMA, TABLE e KEYWORD.Sintaxe
dbms_ccl.add_ccl_rule('<Type>','<Schema_name>','<Table_name>',<Concurrency_count>,'<Keywords>');Example
-
Adicione uma regra CCL para instruções
SELECTcom contagem de concorrência de 10. Ao atingir esse limite, o sistema enfileira ou recusa as instruções subsequentes.CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 10, ''); -
Adicione uma regra CCL para instruções
SELECTque contenham a palavra-chavekey1, com contagem de concorrência de 20.CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1'); -
Adicione uma regra CCL para instruções
SELECTque contenham as palavras-chavekey1,key2ekey3, com contagem de concorrência de 20. As palavras-chave podem aparecer em qualquer ordem.CALL dbms_ccl.add_ccl_rule('SELECT', '', '', 20, 'key1;key2;key3'); -
Adicione uma regra CCL com
TYPEcomoSELECT,SCHEMAcomotesteTABLEcomot. Quando a contagem de concorrência de instruçõesSELECTatingir 10, as instruções serão enfileiradas ou um erro será reportado.CALL dbms_ccl.add_ccl_rule('SELECT', 'test', 't', 10, '');
-
-
add_ccl_digest_rule: Adiciona uma regra CCL com base em um digest de instrução.NotaAs seguintes versões de mecanismo de banco de dados oferecem suporte ao procedimento armazenado
add_ccl_digest_rule:PolarDB for MySQL 8.0.1 com versão de revisão 8.0.1.1.31 ou posterior.
PolarDB for MySQL 8.0.2 com versão de revisão 8.0.2.2.12 ou posterior.
Sintaxe
dbms_ccl.add_ccl_digest_rule('<Schema_name>', '<Query>', <Concurrency_count>);Example
-
Adicione uma regra CCL que corresponda à instrução SQL
SELECT * FROM t1para enfileirar solicitações ou reportar um erro quando a contagem de concorrência atingir 10.CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1", 10); -
Adicione uma regra CCL para o schema
teste para instruções SQL que correspondam aSELECT * FROM t1para enfileirar solicitações ou reportar um erro quando a contagem de concorrência for 10.CALL dbms_ccl.add_ccl_digest_rule("test", "SELECT * FROM t1", 10); -
Adicione uma regra CCL que corresponda à instrução SQL
SELECT * FROM t1 WHERE col1=1para enfileirar solicitações ou reportar um erro quando a contagem de concorrência for 10.CALL dbms_ccl.add_ccl_digest_rule("", "SELECT * FROM t1 WHERE col1 = 1", 10);NotaSe uma instrução SQL contiver uma constante, a correspondência ocorrerá mesmo que os valores da constante sejam diferentes. Por exemplo, a regra CCL anterior também corresponde à instrução SQL
SELECT * FROM t1 WHERE col1 = 2.
-
add_ccl_digest_rule_by_hash: Adiciona uma regra CCL com base em um hash de digest pré-calculado.NotaO procedimento armazenado
add_ccl_digest_rule_by_hashtem suporte apenas se a versão do mecanismo PolarDB for MySQL for 8.0.1 e a versão de revisão for 8.0.1.1.31 ou posterior.Sintaxe
dbms_ccl.add_ccl_digest_rule_by_hash('<Schema_name>', '<Digest>', <Concurrency_count>);Example
-
Adicione uma regra CCL para instruções SQL cujo valor DIGEST corresponda a
533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9apara enfileirar solicitações ou reportar um erro quando a contagem de concorrência for 10.CALL dbms_ccl.add_ccl_digest_rule_by_hash('', '533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a', 10);Neste caso,
533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9aé o valor DIGEST calculado paraSELECT * FROM t1. Use o comandoSELECT statement_digest("SELECT * FROM t1")para calcular esse valor ou obtenha-o de outros módulos. -
Adicione uma regra CCL para instruções SQL onde o SCHEMA é
teste o valor DIGEST da instrução SQL corresponde a533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a. Quando a contagem de concorrência atingir 10, as solicitações serão enfileiradas ou um erro será retornado.CALL dbms_ccl.add_ccl_digest_rule_by_hash('test', '533c0a9cf0cf92d2c26e7fe8821735eb4a72c409aaca24f9f281d137427bfa9a', 10);
-
-
del_ccl_rule: Exclua uma regra CCL.Sintaxe
dbms_ccl.del_ccl_rule(<Id>);Example
Exclua a regra CCL com ID 15.
CALL dbms_ccl.del_ccl_rule(15);Se a regra a ser excluída não existir, o sistema reportará um aviso. Use o comando
SHOW WARNINGS;para visualizar o conteúdo do aviso. Veja um exemplo a seguir:-
Exclua a regra CCL com ID 100.
CALL dbms_ccl.del_ccl_rule(100);A saída retornada é:
Query OK, 0 rows affected, 2 warnings (0.00 sec) -
Execute o comando a seguir para visualizar a mensagem de aviso:
SHOW WARNINGS;A saída retornada é:
+---------+------+----------------------------------------------------+ | 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 | +---------+------+----------------------------------------------------+
NotaNo exemplo anterior, o PolarDB for MySQL versão 8.0 possui um
Codede7517, o PolarDB for MySQL versão 5.7 possui umCodede3267e o PolarDB for MySQL versão 5.6 possui umCodede3045. -
-
show_ccl_rule: Visualize as regras CCL ativadas atualmente na memória.Sintaxe
dbms_ccl.show_ccl_rule();Example
CALL dbms_ccl.show_ccl_rule();A saída retornada é:
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | 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 | | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+NotaA tabela a seguir descreve as colunas MATCHED, RUNNING e WAITTING.
MATCHED: Número total de vezes que a regra correspondeu a uma instrução.
RUNNING: Quantidade de threads em execução sob esta regra no momento.
WAITTING: Quantidade de threads aguardando execução sob esta regra no momento.
-
Use uma instrução
UPDATEpara modificar o ID de uma regra, alterando assim sua prioridade.Sintaxe
UPDATE mysql.concurrency_control SET ID = xx WHERE ID = xx;Example
-
Execute o comando a seguir para visualizar as regras CCL ativadas na memória:
CALL dbms_ccl.show_ccl_rule();A saída retornada é:
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | 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 | | +------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ -
Execute o comando a seguir para alterar a prioridade da regra CCL com ID 17, mudando seu ID para 20:
UPDATE mysql.concurrency_control SET ID = 20 WHERE ID = 17; -
Execute o comando a seguir para visualizar as regras modificadas:
CALL dbms_ccl.show_ccl_rule();A saída retornada é:
+------+--------+--------+-------+-------+-------+-------------------+---------+---------+----------+----------+ | 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: Se você modificar uma regra CCL alterando o conteúdo da tabela
concurrency_control, também precisará usar o comando a seguir para que a regra entre em vigor.Sintaxe
dbms_ccl.flush_ccl_rule();Example
Use uma instrução UPDATE para alterar a contagem de concorrência de uma regra.
UPDATE mysql.concurrency_control SET CONCURRENCY_COUNT = 15 WHERE Id = 18;A saída retornada é:
Query OK, 1 row affected (0.00 sec) Rows matched: 1 Changed: 1 Warnings: 0Execute o comando a seguir para aplicar a alteração:
CALL dbms_ccl.flush_ccl_rule();A saída retornada é:
Query OK, 0 rows affected (0.00 sec)
Testar o recurso
-
Crie três regras CCL com diferentes dimensões de correspondência:
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. -
Use o Sysbench para executar um teste com a seguinte configuração:
64 threads
4 tabelas
select.lua
-
Visualize o status de concorrência em tempo real:
CALL dbms_ccl.show_ccl_rule();A saída retornada é:
+------+--------+--------+---------+-------+-------+-------------------+---------+---------+----------+----------+ | 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)Verifique a coluna RUNNING. Os valores correspondem aos limites de concorrência especificados, o que indica que as regras estão funcionando corretamente.