PolarDB for MySQL oferece um recurso de controle de recursos que permite criar regras para limitar o uso de CPU por usuários, bancos de dados ou IDs de conexão específicos. Esse recurso ajuda a reduzir o impacto nos negócios causado por picos de tráfego e possibilita impor rapidamente limites de recursos em consultas grandes.
Limitações de versão
Somente clusters da Enterprise Edition são suportados.
-
Para clusters da Cluster Edition:
PolarDB for MySQL 8.0.1 com versão de revisão 8.0.1.1.48 ou posterior.
PolarDB for MySQL 8.0.2 com versão de revisão 8.0.2.2.27 ou posterior.
-
Para clusters Multi-master Cluster (Limitless):
PolarDB for MySQL 8.0.1 com versão de revisão 8.0.1.0.33 ou posterior.
Observações
-
O recurso Resource Control do PolarDB difere do recurso oficial Resource Group do MySQL. Eles utilizam dois mecanismos distintos para controlar o uso de recursos em um cluster:
O recurso Resource Control do PolarDB limita recursos por banco de dados, usuário do banco de dados e conexão do banco de dados. Esse recurso é adequado para bancos de dados nativos da cloud.
O recurso oficial Resource Group do MySQL permite definir o número de núcleos de CPU e prioridades de thread para diferentes grupos de recursos. Para obter mais informações, consulte a documentação oficial do MySQL Resource Groups. Atualmente, esse recurso não é suportado no PolarDB for MySQL.
Para usar o recurso Resource Control, é necessário ativar o recurso Thread Pool.
Os nós somente leitura (RO) sincronizam as informações de controle de recursos de forma assíncrona a partir dos nós de leitura e gravação (RW). Por isso, podem ocorrer atrasos.
Uso
Após conectar-se ao cluster de banco de dados PolarDB, faça login com uma conta privilegiada.
Ativar o recurso Resource Control
Os parâmetros do cluster PolarDB diferem entre o console e uma sessão de banco de dados. As diferenças são as seguintes:
-
Compatibilidade: Para garantir compatibilidade com arquivos de configuração do MySQL, alguns parâmetros do cluster no console do PolarDB possuem o prefixo loose_.
Procedimento: Localize e modifique os parâmetros que têm o prefixo
loose_.
-
Em uma sessão de banco de dados (usando a linha de comando ou um cliente)
Procedimento: Ao usar o comando
SETpara modificar um parâmetro em uma sessão de banco de dados, remova o prefixoloose_e use o nome original do parâmetro.
Nome do parâmetro | Nível | Descrição |
| Global | Ativa ou desativa o recurso Resource Control para o cluster.
|
Criar um controle de recursos
CREATE polar_resource_control <rc_name> max_cpu <max_cpu_value>;
Parâmetros:
|
Parâmetro |
Descrição |
|
rc_name |
Nome do controle de recursos a ser criado. O comprimento máximo é de 64 caracteres. |
|
max_cpu_value |
CPU máxima para o controle de recursos. O valor representa uma porcentagem da CPU total do cluster. O intervalo válido é de 1 a 100. |
Após criar um controle de recursos, execute a seguinte consulta SQL a partir de uma conta com altos privilégios para visualizar todos os controles de recursos.
SELECT * FROM mysql.polar_resource_control;
Execute a seguinte consulta SQL a partir de uma conta com altos privilégios para recuperar os Thread Groups associados a um controle de recursos.
SELECT id, resource_control_name FROM information_schema.thread_pool_status;
Atualizar um controle de recursos
ALTER polar_resource_control <rc_name> max_cpu <max_cpu_value>;
Descrição:
|
Parâmetro |
Descrição |
|
rc_name |
Nome do controle de recursos. O nome pode ter até 64 caracteres. |
|
max_cpu_value |
Novo uso máximo de CPU permitido pelo controle de recursos. Especifique o valor como uma porcentagem da capacidade total de CPU do cluster. Valores válidos: 1 a 100. |
Ao atualizar o uso máximo de CPU permitido por um controle de recursos, o número de grupos de threads associados a ele pode mudar.
Excluir um controle de recursos
DROP polar_resource_control <rc_name>;
Descrição:
|
Parâmetro |
Descrição |
|
rc_name |
Nome do controle de recursos a ser excluído. |
Quando um controle de recursos é excluído, seus grupos de threads associados são liberados. Os usuários, bancos de dados ou conexões que antes eram limitados por esse controle deixam de sofrer restrições.
Definir um controle de recursos para um usuário ou banco de dados
Anexar
SET polar_resource_control <rc_name> FOR [database|USER] <db_name/user_name>;
A instrução SQL é a seguinte:
|
Parâmetro |
Descrição |
|
rc_name |
Nome do controle de recursos a ser aplicado. |
|
db_name/user_name |
Banco de dados ou usuário ao qual você deseja aplicar o controle de recursos. |
Após a execução dessa instrução, o banco de dados ou usuário especificado fica sujeito aos limites de recursos de CPU definidos pelo controle de recursos. Essa alteração não afeta instruções em execução no momento. Ela se aplica apenas às instruções executadas após a aplicação do controle de recursos.
Desanexar
RELEASE polar_resource_control <rc_name> FOR [database|USER] db_name/user_name>;
Depois que essa instrução é executada, o banco de dados ou usuário especificado deixa de ser restringido pelos limites de recursos de CPU do controle de recursos. As instruções que já estão em execução permanecem sujeitas aos limites. As instruções iniciadas após a remoção do controle de recursos não ficam sujeitas a esses limites.
Configurar um controle de recursos para uma consulta ou conexão
Anexar
SET polar_resource_control <rc_name> FOR [query|connection] <connection_id>;
Parâmetros:
|
Parâmetro |
Descrição |
|
rc_name |
Nome do controle de recursos a ser anexado. |
|
connection_id |
ID da conexão a ser limitada. |
Ao anexar um controle de recursos a uma consulta, execute
SHOW PROCESSLISTpara visualizar o ID de conexão correspondente. Após a conclusão da consulta, ela deixa de ser limitada pelo controle de recursos.Ao anexar um controle de recursos a uma conexão, os limites de recursos permanecem ativos mesmo após a conclusão da consulta atual. Os limites vigoram até que a conexão seja fechada.
Liberar
RELEASE polar_resource_control <rc_name> FOR [query|connection] <connection_id>;
Parâmetros:
|
Parâmetro |
Descrição |
|
rc_name |
Nome do controle de recursos a ser anexado. |
|
connection_id |
ID da conexão a ser restringida. |
Ao liberar um controle de recursos de uma consulta, ela deixa de ser limitada por esse controle. Após a conclusão da consulta, a conexão não será limitada se nenhum outro controle de recursos for aplicável.
Após liberar um controle de recursos de uma conexão, ela passa a ser limitada por qualquer outro controle de recursos aplicável definido para a conexão, usuário ou banco de dados. Se nenhum outro controle de recursos for aplicável, a conexão não sofrerá limitações.
Prioridade dos controles de recursos
Os controles de recursos são aplicados a uma instrução de consulta na seguinte ordem de prioridade. A primeira correspondência encontrada é utilizada.
Controle explicitamente anexado à consulta pelo seu ID de conexão. Possui a maior prioridade.
Verifica se a conexão atual está anexada a um controle de recursos e aplica os limites de recursos conforme apropriado.
O sistema verifica se o usuário conectado está associado a um controle de recursos. Em caso afirmativo, os limites de recursos são aplicados.
Se o banco de dados atualmente conectado estiver associado a um controle de recursos, o sistema aplica os limites de recursos.
Caso nenhuma das condições anteriores seja atendida, os limites de recursos não se aplicam.
Uso de um cluster multi-master
Um Multi-master Cluster funciona da mesma forma que um cluster single-master, e a sintaxe é totalmente compatível. Ao executar uma instrução CREATE POLAR_RESOURCE_CONTROL, ALTER POLAR_RESOURCE_CONTROL ou DROP POLAR_RESOURCE_CONTROL, ela é encaminhada aleatoriamente para um nó de leitura/gravação no cluster. Em seguida, a instrução é sincronizada em todos os nós de leitura/gravação, o que pode causar alguma latência. Para limitar recursos de uma consulta ou conexão, use o HINT syntax para especificar um nó.
Melhores práticas
Cenários
Impedir que usuários mal-intencionados consumam recursos excessivos do cluster.
Lidar com consultas lentas inesperadas.
Evitar que usuários mal-intencionados acionem o dimensionamento automático em um cluster Serverless.
Limitar o uso de CPU em ambientes multilocatário ou quando diferentes services compartilham um cluster.
Exemplos de uso
-
Impedir que usuários mal-intencionados consumam recursos excessivos do cluster
Para lidar com usuários mal-intencionados, defina limites de recursos de CPU para eles. Esses limites podem ser aplicados proativamente ou em resposta a atividades maliciosas.
CREATE polar_resource_control rc_for_trouble_user max_cpu 10; SET polar_resource_control rc_for_trouble_user FOR USER trouble_user;Após definir um controle de recursos para o usuário
trouble_user, as threads desse usuário poderão usar no máximo 10% da CPU total do cluster. Isso impede efetivamente que o usuário mal-intencionado consuma recursos excessivos de CPU e afete outros services. -
Lidar com consultas lentas inesperadas
Consultas lentas inesperadas podem ocorrer ocasionalmente em um ambiente de produção. Elas podem ser causadas por análise ou otimização incorreta de SQL, aumentando a carga da CPU. Isso faz com que a consulta seja executada por muito tempo e consuma recursos significativos de CPU. Embora seja possível encerrar a consulta com o comando
kill, é necessário aguardar até que a consulta atinja um ponto específico de sua execução, o que consome tempo. Além disso, reverter a transação durante o processo dekilltambém consome recursos de CPU e leva tempo. Para reduzir rapidamente a carga da CPU causada por uma consulta lenta ou evitar que a CPU seja totalmente utilizada, aplique um limite de uso de CPU a essa consulta.CREATE polar_resource_control rc_for_slow_query max_cpu 10; SET polar_resource_control rc_for_slow_query FOR query query_id;NotaAo definir um controle de recursos para uma consulta lenta, encontre seu
query_idexecutandoSHOW PROCESSLIST.Após definir um controle de recursos para a consulta lenta com o ID
query_id, o uso máximo de CPU da consulta é limitado a 10% da CPU total do cluster. Isso reduz rapidamente a carga de CPU do cluster e evita que a consulta impacte outros services de produção.Um cluster PolarDB pode ter vários nós de computação, e diferentes nós podem ter consultas com o mesmo ID de conexão. Portanto, ao definir um controle de recursos para uma consulta, use o HINT syntax para aplicar a configuração a um nó específico.
/*force_node='pi-bpxxxxxxxx'*/ SET polar_resource_control rc_for_slow_query FOR query query_id; -
Evitar que usuários mal-intencionados acionem o dimensionamento do cluster em um cluster serverless
Quando um cluster está no modo Serverless, ele dimensiona automaticamente com base na carga de trabalho para lidar com picos repentinos de alta carga. No entanto, talvez você queira impedir que o cluster dimensione em resposta a solicitações de usuários mal-intencionados. Nesse caso, aplique limites de recursos a esses usuários no cluster serverless.
CREATE polar_resource_control rc_for_trouble_user max_cpu 10; SET polar_resource_control rc_for_trouble_user FOR USER trouble_user; -
Limitar o uso de CPU em clusters multilocatário ou multiserviço
Em cenários de Software as a Service (SaaS), vários locatários frequentemente executam cargas no mesmo cluster. Também é comum que diferentes services de negócios compartilhem um cluster. Nessas situações, é importante limitar os recursos que um único locatário ou service pode usar. Isso evita que um usuário ou service consuma CPU excessiva e afete o desempenho geral do cluster. Para isso, defina limites separados de recursos de CPU para cada service. Por exemplo, aplique limites por usuário ou por banco de dados para atingir esse objetivo.
CREATE polar_resource_control rc_for_business_1 max_cpu 20; CREATE polar_resource_control rc_for_business_2 max_cpu 20; SET polar_resource_control rc_for_business_1 FOR USER user_1; SET polar_resource_control rc_for_business_2 FOR USER user_2;Com base nessas configurações, os services usados por
user_1euser_2ficam limitados individualmente a um máximo de 20% da CPU total do cluster. Portanto, os dois usuários podem usar, combinados, no máximo 40% dos recursos de CPU. Se a carga de trabalho deuser_1aumentar repentinamente, seu uso de CPU permanecerá limitado a 20%, garantindo que outros services no cluster não sejam afetados.Se um único service utilizar vários usuários, atribua o mesmo controle de recursos a todos eles.
CREATE polar_resource_control rc_for_business_1 max_cpu 20; SET polar_resource_control rc_for_business_1 FOR USER user_1; SET polar_resource_control rc_for_business_1 FOR USER user_2;Com base nessas configurações, o service usado por
user_1euser_2fica limitado a um máximo de 20% da CPU total do cluster. Assim, os dois usuários podem usar, combinados, no máximo 20% dos recursos de CPU. Isso evita que o service exceda seu limite de CPU quando a carga de trabalho de um usuário aumenta, garantindo uma alocação justa de recursos.