Gérer l'allocation du processeur avec les groupes de ressources MySQL

Ce document explique comment configurer et utiliser des groupes de ressources MySQL dans Cloud SQL pour MySQL afin de gérer et de hiérarchiser l'allocation des ressources de processeur pour vos différents besoins de traitement des données.

Présentation

Les groupes de ressources MySQL, introduits dans MySQL 8.0, vous permettent de gérer et de hiérarchiser l'allocation des ressources de processeur entre différents threads s'exécutant sur une seule instance de base de données. Cela est utile pour atténuer le problème du "voisin bruyant", où les tâches de faible priorité, telles que les analyses quotidiennes ou les rapports par lot, peuvent entraîner une augmentation de l'utilisation du processeur et dégrader les performances des connexions client critiques et prioritaires, telles que le traitement transactionnel en ligne (OLTP).

Les groupes de ressources sont compatibles avec toutes les instances Cloud SQL pour MySQL 8.0 et versions ultérieures, à la fois dans l'édition Cloud SQL Enterprise et dans l'édition Cloud SQL Enterprise Plus.

Différences entre les groupes de ressources MySQL de la communauté et Cloud SQL

Cloud SQL pour MySQL est un service entièrement géré. Pour garantir la fiabilité des instances et protéger les processus internes de Cloud SQL, les différences et restrictions suivantes s'appliquent par rapport au comportement de MySQL de la communauté :

L'affinité des cœurs de processeur n'est pas acceptée

La spécification de l'épinglage du processeur au niveau du cœur n'est pas acceptée. Par exemple, vous ne pouvez pas spécifier VCPU = 2-3 ni VCPU = 0 lorsque vous créez un groupe de ressources dans Cloud SQL pour MySQL. Étant donné que la topologie du cœur de la VM sous-jacente est abstraite, toute tentative d'utilisation de la clause VCPU dans une instruction CREATE RESOURCE GROUP ou ALTER RESOURCE GROUP échoue avec l'erreur d'accès refusé suivante.

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

Groupes de ressources système interdits

La création de groupes de ressources système n'est pas acceptée dans Cloud SQL. Seuls les groupes de ressources au niveau de l'utilisateur (TYPE = USER) sont autorisés, avec des priorités de thread allant de 0 (priorité utilisateur la plus élevée) à 19 (priorité utilisateur la plus basse).

Les groupes de ressources système sont interdits pour empêcher les charges de travail utilisateur de priver les tâches d'arrière-plan critiques de Cloud SQL, telles que les sauvegardes, la surveillance et la réplication.

L'exécution de la commande CREATE RESOURCE GROUP avec TYPE = SYSTEM échouera avec l'erreur suivante :

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

Journalisation binaire et réplication automatiques des LDD de groupe de ressources

Dans MySQL de la communauté, les opérations de groupe de ressources telles que CREATE, ALTER et DROP RESOURCE GROUP ne sont jamais écrites dans le journal binaire. Cloud SQL remplace ce comportement par défaut afin que toutes les commandes de définition de groupe de ressources soient écrites dans le journal binaire.

Cela garantit que les groupes de ressources sont automatiquement répliqués dans les instances répliquées avec accès en lecture, ce qui vous permet d'utiliser des indications d'optimiseur de requête (ou des indications RESOURCE_GROUP) sur les instances répliquées pour éviter les échecs de requête dus à des groupes manquants. Les définitions de groupe sont également capturées dans le flux de journal binaire pour la récupération à un moment précis (PITR).

Les attributions de session de thread telles que SET RESOURCE GROUP ne sont pas écrites dans les journaux binaires.

Les droits d'administrateur sont accordés à cloudsqlsuperuser

Pour utiliser des groupes de ressources, vous avez besoin des droits d'administrateur de base de données suivants :

  • RESOURCE_GROUP_ADMIN: créer, modifier et supprimer des groupes de ressources
  • RESOURCE_GROUP_USER: attribuer des threads ou utiliser des indications dans les requêtes

Dans Cloud SQL, les deux droits sont accordés par défaut au rôle cloudsqlsuperuser.

Les administrateurs MySQL peuvent également accorder le droit de base de données RESOURCE_GROUP_USER ou RESOURCE_GROUP_ADMIN à d'autres utilisateurs.

Gérer les groupes de ressources dans Cloud SQL

Vous pouvez configurer et gérer des groupes de ressources au niveau de l'utilisateur dans Cloud SQL pour optimiser l'allocation des ressources dans votre base de données. Cela vous permet de contrôler et de hiérarchiser l'allocation des ressources de processeur entre différentes charges de travail de session de base de données sur l'instance.

Pour en savoir plus sur la configuration des groupes de ressources MySQL et sur le comportement de référence, consultez la section Groupes de ressources dans la documentation MySQL.

Pour gérer les groupes de ressources dans Cloud SQL, vous pouvez procéder comme suit :

Avant de commencer

Avant de créer un groupe de ressources, vérifiez les points suivants :

  • Vous êtes connecté à la base de données avec un compte utilisateur disposant du droit RESOURCE_GROUP_ADMIN. L'utilisateur root par défaut et tous les comptes de base de données auxquels le rôle cloudsqlsuperuser est attribué disposent de ce droit par défaut.

  • Votre instance Cloud SQL exécute MySQL 8.0 ou une version ultérieure.

Créer un groupe de ressources

Créez des groupes de ressources au niveau de l'utilisateur avec une priorité de thread comprise entre 0 (priorité la plus élevée) et 19 (priorité la plus basse). La priorité de thread par défaut pour les connexions standards est 0.

Pour créer un groupe de ressources, exécutez l'instruction suivante :

CREATE RESOURCE GROUP GROUP_NAME
  TYPE = USER
  THREAD_PRIORITY = PRIORITY_VALUE;

Remplacez les éléments suivants :

  • GROUP_NAME : nom du groupe de ressources que vous souhaitez créer.
  • PRIORITY_VALUE : priorité de planification du processeur pour le groupe de ressources, de 0 (priorité la plus élevée) à 19 (priorité la plus basse).

Modifier la priorité d'un groupe de ressources

Pour modifier la priorité de planification du processeur d'un groupe de ressources existant, exécutez l'instruction suivante :

ALTER RESOURCE GROUP GROUP_NAME
  THREAD_PRIORITY = PRIORITY_VALUE;

Remplacez les éléments suivants :

  • GROUP_NAME : nom du groupe de ressources que vous souhaitez modifier.
  • PRIORITY_VALUE : nouvelle priorité de planification du processeur.

Supprimer un groupe de ressources

Pour supprimer un groupe de ressources, exécutez l'instruction suivante :

DROP RESOURCE GROUP GROUP_NAME;

Remplacez les éléments suivants :

  • GROUP_NAME : nom du groupe de ressources que vous souhaitez supprimer.

Attribuer des connexions et des requêtes à un groupe de ressources

Pour appliquer des contraintes de ressources à une charge de travail, attribuez des connexions actives ou des requêtes spécifiques à vos groupes de ressources utilisateur.

Pour attribuer des connexions de session à un groupe :

  1. Accordez l'autorisation à l'utilisateur de la charge de travail :

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

    Remplacez les éléments suivants :

    • USERNAME : utilisateur de base de données auquel vous souhaitez accorder le droit.
  2. Lorsque l'utilisateur se connecte, exécutez :

    SET RESOURCE GROUP GROUP_NAME;

    Remplacez les éléments suivants :

    • GROUP_NAME: nom du groupe de ressources auquel vous souhaitez attribuer la connexion.

    Ou spécifiez un ID de thread spécifique :

    SET RESOURCE GROUP GROUP_NAME FOR THREAD_ID;

    Remplacez les éléments suivants :

    • GROUP_NAME : nom du groupe de ressources auquel vous souhaitez attribuer la connexion.
    • THREAD_ID : ID du thread de base de données spécifique que vous souhaitez attribuer.

Pour attribuer une seule requête à un groupe (via une indication d'optimiseur) :

Utilisez l'indication de commentaire de l'optimiseur RESOURCE_GROUP dans votre instruction LMD ou SELECT :

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

Remplacez les éléments suivants :

  • GROUP_NAME : nom du groupe de ressources sous lequel vous souhaitez exécuter la requête.
  • COLUMN_NAME_1 : colonne par laquelle vous souhaitez regrouper vos résultats.
  • COLUMN_NAME_2 : valeur de colonne que vous souhaitez additionner.
  • TABLE_NAME : table que vous souhaitez interroger.

Surveiller les groupes de ressources

Pour inspecter les groupes de ressources configurés :

SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS;

Pour afficher les threads de connexion actifs et leurs groupes de ressources attribués, exécutez la requête suivante :

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

Étape suivante