Gerenciar a alocação de CPU com grupos de recursos do MySQL

Este documento descreve como configurar e usar grupos de recursos do MySQL no Cloud SQL para MySQL para gerenciar e priorizar a alocação de recursos da CPU das suas diferentes necessidades de processamento de dados.

Visão geral

Os grupos de recursos do MySQL, introduzidos no MySQL 8.0, permitem gerenciar e priorizar a alocação de recursos da CPU entre diferentes linhas de execução em uma única instância de banco de dados. Isso é útil para atenuar o problema do "vizinho barulhento", em que tarefas de baixa prioridade, como análises diárias ou relatórios em lote, podem aumentar o uso da CPU e degradar a performance de conexões de clientes críticas e de alta prioridade, como o processamento de transações on-line (OLTP).

Os grupos de recursos são compatíveis com todas as instâncias do Cloud SQL para MySQL 8.0 e versões mais recentes, tanto a edição Enterprise quanto a Enterprise Plus.

Diferenças entre o MySQL da comunidade e os grupos de recursos do Cloud SQL

O Cloud SQL para MySQL é um serviço totalmente gerenciado. Para garantir a confiabilidade da instância e proteger os processos internos do Cloud SQL, as seguintes diferenças e restrições se aplicam em comparação com o comportamento do MySQL da comunidade:

A afinidade do núcleo da CPU não é compatível

Não é possível especificar a fixação da CPU no nível do núcleo. Por exemplo, não é possível especificar VCPU = 2-3 ou VCPU = 0 ao criar um grupo de recursos no Cloud SQL para MySQL. Como a topologia do núcleo da VM subjacente é abstraída, qualquer tentativa de usar a cláusula VCPU em uma instrução CREATE RESOURCE GROUP ou ALTER RESOURCE GROUP falha com o seguinte erro de acesso negado.

ERROR 1227 (42000): Access denied; This operation (CPU clause) is not allowed on the Cloud SQL environment. Only THREAD_PRIORITY allowed;

Grupos de recursos do sistema proibidos

Não é possível criar grupos de recursos do sistema no Cloud SQL. Somente grupos de recursos no nível do usuário (TYPE = USER) são permitidos, com prioridades de linha de execução que variam de 0 (maior prioridade do usuário) a 19 (menor prioridade do usuário).

Os grupos de recursos do sistema são proibidos para evitar que as cargas de trabalho do usuário prejudiquem jobs críticos em segundo plano do Cloud SQL, como backups, monitoramento e replicação.

A execução do comando CREATE RESOURCE GROUP com TYPE = SYSTEM falhará com o seguinte erro:

ERROR 1227 (42000): Access denied; This operation (TYPE=SYSTEM) is not allowed on the Cloud SQL environment. Only TYPE=USER is allowed;

Registro binário automático e replicação de DDLs de grupos de recursos

No MySQL da comunidade, as operações de grupos de recursos, como CREATE, ALTER e DROP RESOURCE GROUP, nunca são gravadas no registro binário. O Cloud SQL substitui esse comportamento padrão para que todos os comandos de definição de grupos de recursos sejam gravados no registro binário.

Isso garante que os grupos de recursos sejam replicados automaticamente para réplicas de leitura, o que permite usar dicas do otimizador de consultas (ou dicas RESOURCE_GROUP) em réplicas para evitar falhas de consulta devido a grupos ausentes. As definições de grupo também são capturadas no fluxo de registro binário para recuperação pontual (PITR).

As atribuições de sessão de linha de execução, como SET RESOURCE GROUP, não são gravadas nos registros binários.

Privilégios administrativos são concedidos a cloudsqlsuperuser

Para trabalhar com grupos de recursos, você precisa dos seguintes privilégios administrativos de banco de dados:

  • RESOURCE_GROUP_ADMIN: criar, alterar e descartar grupos de recursos
  • RESOURCE_GROUP_USER: atribuir linhas de execução ou usar dicas em consultas

No Cloud SQL, ambos os privilégios são concedidos por padrão à função cloudsqlsuperuser.

Os administradores do MySQL também podem conceder o privilégio de banco de dados RESOURCE_GROUP_USER ou RESOURCE_GROUP_ADMIN a outros usuários.

Gerenciar grupos de recursos no Cloud SQL

É possível configurar e gerenciar grupos de recursos no nível do usuário no Cloud SQL para otimizar a alocação de recursos no banco de dados. Isso permite controlar e priorizar a alocação de recursos da CPU entre várias cargas de trabalho de sessão de banco de dados na instância.

Para mais detalhes sobre a configuração do grupo de recursos do MySQL e o comportamento de referência, consulte Grupos de recursos na documentação do MySQL.

Para gerenciar grupos de recursos no Cloud SQL, faça o seguinte:

Antes de começar

Antes de criar um grupo de recursos, verifique o seguinte:

  • Você fez login no banco de dados com uma conta de usuário que tem o privilégio RESOURCE_GROUP_ADMIN. O usuário root padrão e todas as contas de banco de dados atribuídas à função cloudsqlsuperuser têm esse privilégio por padrão.

  • A instância do Cloud SQL está executando o MySQL 8.0 ou mais recente.

Criar um grupo de recursos

Crie grupos de recursos no nível do usuário com uma prioridade de linha de execução entre 0 (maior prioridade) e 19 (menor prioridade). A prioridade de linha de execução padrão para conexões padrão é 0.

Para criar um grupo de recursos, execute a seguinte instrução:

CREATE RESOURCE GROUP GROUP_NAME
  TYPE = USER
  THREAD_PRIORITY = PRIORITY_VALUE;

Substitua:

  • GROUP_NAME: o nome do grupo de recursos que você quer criar.
  • PRIORITY_VALUE: a prioridade de programação da CPU para o grupo de recursos, de 0 (maior prioridade) a 19 (menor prioridade).

Modificar a prioridade de um grupo de recursos

Para modificar a prioridade de programação da CPU de um grupo de recursos, execute a seguinte instrução:

ALTER RESOURCE GROUP GROUP_NAME
  THREAD_PRIORITY = PRIORITY_VALUE;

Substitua:

  • GROUP_NAME: o nome do grupo de recursos que você quer modificar.
  • PRIORITY_VALUE: a nova prioridade de programação da CPU.

Descartar um grupo de recursos

Para descartar um grupo de recursos, execute a seguinte instrução:

DROP RESOURCE GROUP GROUP_NAME;

Substitua:

  • GROUP_NAME: o nome do grupo de recursos que você quer descartar.

Atribuir conexões e consultas a um grupo de recursos

Para aplicar restrições de recursos a uma carga de trabalho, atribua conexões ativas ou consultas específicas aos grupos de recursos do usuário.

Para atribuir conexões de sessão a um grupo:

  1. Conceda permissão ao usuário da carga de trabalho:

    GRANT RESOURCE_GROUP_USER ON *.* TO 'USERNAME'@'%';

    Substitua:

    • USERNAME: o usuário do banco de dados a quem você quer conceder o privilégio.
  2. Quando o usuário se conectar, execute:

    SET RESOURCE GROUP GROUP_NAME;

    Substitua:

    • GROUP_NAME: o nome do grupo de recursos a que você quer atribuir a conexão.

    Ou especifique um ID de linha de execução específico:

    SET RESOURCE GROUP GROUP_NAME FOR THREAD_ID;

    Substitua:

    • GROUP_NAME: o nome do grupo de recursos a que você quer atribuir a conexão.
    • THREAD_ID: o ID da linha de execução de banco de dados específica que você quer atribuir.

Para atribuir uma única consulta a um grupo (por meio de uma dica do otimizador):

Use a dica de comentário do otimizador RESOURCE_GROUP na instrução DML ou SELECT:

SELECT /*+ RESOURCE_GROUP(GROUP_NAME) */
  COLUMN_NAME_1,
  SUM(COLUMN_NAME_2)
FROM TABLE_NAME
GROUP BY COLUMN_NAME_1;

Substitua:

  • GROUP_NAME: o nome do grupo de recursos em que você quer executar a consulta.
  • COLUMN_NAME_1: a coluna pela qual você quer agrupar os resultados.
  • COLUMN_NAME_2: o valor da coluna que você quer somar.
  • TABLE_NAME: a tabela que você quer consultar.

Monitorar grupos de recursos

Para inspecionar grupos de recursos configurados:

SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS;

Para conferir as linhas de execução de conexão ativas e os grupos de recursos atribuídos a elas, execute a seguinte consulta:

SELECT THREAD_ID, NAME, TYPE, RESOURCE_GROUP
  FROM performance_schema.threads;

A seguir