CPU-Zuweisung mit MySQL-Ressourcengruppen verwalten

In diesem Dokument wird beschrieben, wie Sie MySQL-Ressourcengruppen in Cloud SQL for MySQL konfigurieren und verwenden können, um die CPU-Ressourcen zuweisung für Ihre verschiedenen Datenverarbeitungsanforderungen zu verwalten und zu priorisieren.

Übersicht

Mit MySQL-Ressourcengruppen, die in MySQL 8.0 eingeführt wurden, können Sie die CPU-Ressourcenzuweisung zwischen verschiedenen Threads verwalten und priorisieren, die auf einer einzelnen Datenbankinstanz ausgeführt werden. Dies ist nützlich, um das Problem des „noisy neighbor“ zu vermeiden, bei dem Aufgaben mit niedriger Priorität wie tägliche Analysen oder Batchberichte die CPU-Auslastung in die Höhe treiben und die Leistung kritischer Clientverbindungen mit hoher Priorität wie Online-Transaktionsverarbeitung (OLTP) beeinträchtigen können.

Ressourcengruppen werden in allen Cloud SQL for MySQL 8.0- und höher-Instanzen unterstützt, sowohl in der Cloud SQL Enterprise- als auch in der Cloud SQL Enterprise Plus-Version.

Unterschiede zwischen Community-MySQL- und Cloud SQL-Ressourcengruppen

Cloud SQL for MySQL ist ein vollständig verwalteter Dienst. Um die Zuverlässigkeit der Instanz zu gewährleisten und die internen Prozesse von Cloud SQL zu schützen, gelten im Vergleich zum Verhalten von Community-MySQL die folgenden Unterschiede und Einschränkungen:

CPU-Kernaffinität wird nicht unterstützt

Die Angabe von CPU-Pinning auf Kernebene wird nicht unterstützt. Sie können beispielsweise nicht VCPU = 2-3 oder VCPU = 0 angeben, wenn Sie eine Ressourcengruppe in Cloud SQL for MySQL erstellen. Da die zugrunde liegende VM-Kern-Topologie abstrahiert ist, schlägt jeder Versuch, die Klausel VCPU in einer CREATE RESOURCE GROUP- oder ALTER RESOURCE GROUP-Anweisung zu verwenden, mit dem folgenden Fehler „Zugriff verweigert“ fehl.

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

Verbotene Systemressourcengruppen

Das Erstellen von Systemressourcengruppen wird in Cloud SQL nicht unterstützt. Nur Ressourcengruppen auf Nutzerebene (TYPE = USER) sind zulässig, mit Threadprioritäten von 0 (höchste Nutzerpriorität) bis 19 (niedrigste Nutzerpriorität).

Systemressourcengruppen sind verboten, um zu verhindern, dass Nutzerarbeitslasten kritische Cloud SQL-Hintergrundjobs wie Sicherungen, Monitoring und Replikation beeinträchtigen.

Die Ausführung des Befehls CREATE RESOURCE GROUP mit TYPE = SYSTEM schlägt mit dem folgenden Fehler fehl:

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

Automatisches Binlogging und Replikation von Ressourcengruppen-DDLs

In Community-MySQL werden Ressourcengruppen-Vorgänge wie CREATE, ALTER und DROP RESOURCE GROUP nie in das Binärlog geschrieben. Cloud SQL überschreibt dieses Standardverhalten, sodass alle Befehle zur Definition von Ressourcengruppen in das Binärlog geschrieben werden.

Dadurch wird sichergestellt, dass Ressourcengruppen automatisch auf Lesereplikate repliziert werden. So können Sie Hinweise zum Abfrageoptimierer (oder RESOURCE_GROUP-Hinweise) auf Replikaten verwenden, um Abfragefehler aufgrund fehlender Gruppen zu vermeiden. Gruppendefinitionen werden auch im Binärlogstream für die Wiederherstellung zu einem bestimmten Zeitpunkt (Point-in-Time Recovery, PITR) erfasst.

Thread-Sitzungszuweisungen wie SET RESOURCE GROUP werden nicht in die Binärlogs geschrieben.

Administratorberechtigungen werden cloudsqlsuperuser gewährt

Für die Arbeit mit Ressourcengruppen benötigen Sie die folgenden administrativen Datenbankberechtigungen:

  • RESOURCE_GROUP_ADMIN: Ressourcengruppen erstellen, ändern und löschen
  • RESOURCE_GROUP_USER: Threads zuweisen oder Hinweise in Abfragen verwenden

In Cloud SQL werden beide Berechtigungen standardmäßig der Rolle cloudsqlsuperuser gewährt.

MySQL-Administratoren können die Datenbankberechtigung RESOURCE_GROUP_USER oder RESOURCE_GROUP_ADMIN auch anderen Nutzern gewähren.

Ressourcengruppen in Cloud SQL verwalten

Sie können Ressourcengruppen auf Nutzerebene in Cloud SQL konfigurieren und verwalten, um die Ressourcenzuweisung in Ihrer Datenbank zu optimieren. So können Sie die CPU-Ressourcenzuweisung zwischen verschiedenen Datenbank-Sitzungsarbeitslasten in der Instanz steuern und priorisieren.

Weitere Informationen zur Konfiguration von MySQL-Ressourcengruppen und zum Referenzverhalten finden Sie unter Ressourcengruppen in der MySQL-Dokumentation.

So verwalten Sie Ressourcengruppen in Cloud SQL:

Hinweis

Prüfen Sie vor dem Erstellen einer Ressourcengruppe Folgendes:

  • Sie sind mit einem Nutzerkonto in der Datenbank angemeldet, das die Berechtigung RESOURCE_GROUP_ADMIN hat. Der Standardnutzer root und alle Datenbankkonten, denen die Rolle cloudsqlsuperuser zugewiesen ist, haben diese Berechtigung standardmäßig.

  • Auf Ihrer Cloud SQL-Instanz wird MySQL 8.0 oder höher ausgeführt.

Ressourcengruppe erstellen

Erstellen Sie Ressourcengruppen auf Nutzerebene mit einer Threadpriorität zwischen 0 (höchste Priorität) und 19 (niedrigste Priorität). Die Standard-Threadpriorität für Standardverbindungen ist 0.

Führen Sie die folgende Anweisung aus, um eine Ressourcengruppe zu erstellen:

CREATE RESOURCE GROUP GROUP_NAME
  TYPE = USER
  THREAD_PRIORITY = PRIORITY_VALUE;

Ersetzen Sie Folgendes:

  • GROUP_NAME: der Name der Ressourcengruppe, die Sie erstellen möchten.
  • PRIORITY_VALUE: die CPU-Planungspriorität für die Ressourcengruppe, von 0 (höchste Priorität) bis 19 (niedrigste Priorität).

Priorität einer Ressourcengruppe ändern

Führen Sie die folgende Anweisung aus, um die CPU-Planungspriorität einer vorhandenen Ressourcengruppe zu ändern:

ALTER RESOURCE GROUP GROUP_NAME
  THREAD_PRIORITY = PRIORITY_VALUE;

Ersetzen Sie Folgendes:

  • GROUP_NAME: der Name der Ressourcengruppe, die Sie ändern möchten.
  • PRIORITY_VALUE: die neue CPU-Planungspriorität.

Ressourcengruppe löschen

Führen Sie die folgende Anweisung aus, um eine Ressourcengruppe zu löschen:

DROP RESOURCE GROUP GROUP_NAME;

Ersetzen Sie Folgendes:

  • GROUP_NAME: der Name der Ressourcengruppe, die Sie löschen möchten.

Verbindungen und Abfragen einer Ressourcengruppe zuweisen

Wenn Sie Ressourceneinschränkungen für eine Arbeitslast erzwingen möchten, weisen Sie aktive Verbindungen oder bestimmte Abfragen Ihren Nutzerressourcengruppen zu.

So weisen Sie Sitzungsverbindungen einer Gruppe zu:

  1. Berechtigung für den Arbeitslastnutzer gewähren:

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

    Ersetzen Sie Folgendes:

    • USERNAME: der Datenbanknutzer, dem Sie die Berechtigung gewähren möchten.
  2. Führen Sie beim Herstellen der Verbindung durch den Nutzer Folgendes aus:

    SET RESOURCE GROUP GROUP_NAME;

    Ersetzen Sie Folgendes:

    • GROUP_NAME: der Name der Ressourcengruppe, der Sie die Verbindung zuweisen möchten.

    Oder geben Sie eine bestimmte Thread-ID an:

    SET RESOURCE GROUP GROUP_NAME FOR THREAD_ID;

    Ersetzen Sie Folgendes:

    • GROUP_NAME: der Name der Ressourcengruppe, der Sie die Verbindung zuweisen möchten.
    • THREAD_ID: die ID des bestimmten Datenbankthreads, den Sie zuweisen möchten.

So weisen Sie eine einzelne Abfrage einer Gruppe zu (über einen Hinweis zum Optimierer):

Verwenden Sie den Hinweis zum Optimierer RESOURCE_GROUP in Ihrer DML- oder SELECT-Anweisung:

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

Ersetzen Sie Folgendes:

  • GROUP_NAME: der Name der Ressourcengruppe, unter der Sie die Abfrage ausführen möchten.
  • COLUMN_NAME_1: die Spalte, nach der Sie die Ergebnisse gruppieren möchten.
  • COLUMN_NAME_2: der Spaltenwert, den Sie summieren möchten.
  • TABLE_NAME: die Tabelle, die Sie abfragen möchten.

Ressourcengruppen überwachen

So prüfen Sie konfigurierte Ressourcengruppen:

SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS;

Führen Sie die folgende Abfrage aus, um aktive Verbindungsthreads und die ihnen zugewiesenen Ressourcengruppen aufzurufen:

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

Nächste Schritte