Gestire l'allocazione della CPU con i gruppi di risorse MySQL

Questo documento descrive come configurare e utilizzare i gruppi di risorse MySQL in Cloud SQL per MySQL per gestire e dare la priorità all'allocazione delle risorse CPU per le diverse esigenze di elaborazione dei dati.

Panoramica

I gruppi di risorse MySQL, introdotti in MySQL 8.0, consentono di gestire e dare la priorità all'allocazione delle risorse CPU tra i diversi thread in esecuzione su una singola istanza di database. Questa funzionalità è utile per mitigare il problema del "vicino rumoroso", in cui le attività a bassa priorità, come l'analisi giornaliera o i report batch, possono aumentare l'utilizzo della CPU e ridurre le prestazioni delle connessioni client critiche e ad alta priorità, come l'elaborazione delle transazioni online (OLTP).

I gruppi di risorse sono supportati su tutte le istanze Cloud SQL per MySQL 8.0 e versioni successive, sia nella versione Cloud SQL Enterprise che Cloud SQL Enterprise Plus.

Differenze tra i gruppi di risorse MySQL della community e Cloud SQL

Cloud SQL per MySQL è un servizio completamente gestito. Per garantire l'affidabilità dell'istanza e proteggere i processi interni di Cloud SQL, si applicano le seguenti differenze e limitazioni rispetto al comportamento di MySQL della community:

L'affinità dei core della CPU non è supportata

La specifica dell'affinità della CPU a livello di core non è supportata. Ad esempio, non puoi specificare VCPU = 2-3 o VCPU = 0 quando crei un gruppo di risorse in Cloud SQL per MySQL. Poiché la topologia dei core della VM sottostante è astratta, qualsiasi tentativo di utilizzare la clausola VCPU in un'istruzione CREATE RESOURCE GROUP o ALTER RESOURCE GROUP non riesce e viene visualizzato il seguente errore di accesso negato.

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

Gruppi di risorse di sistema vietati

La creazione di gruppi di risorse di sistema non è supportata in Cloud SQL. Sono consentiti solo i gruppi di risorse a livello di utente (TYPE = USER), con priorità dei thread che vanno da 0 (priorità utente più alta) a 19 (priorità utente più bassa).

I gruppi di risorse di sistema sono vietati per impedire che i workload utente blocchino i job in background critici di Cloud SQL, come backup, monitoraggio e replica.

L'esecuzione del comando CREATE RESOURCE GROUP con TYPE = SYSTEM non riesce e viene visualizzato il seguente errore:

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

Binlogging automatico e replica dei DDL dei gruppi di risorse

In MySQL della community, le operazioni sui gruppi di risorse come CREATE, ALTER e DROP RESOURCE GROUP non vengono mai scritte nel log binario. Cloud SQL sostituisce questo comportamento predefinito in modo che tutti i comandi di definizione dei gruppi di risorse vengano scritti nel log binario.

In questo modo, i gruppi di risorse vengono replicati automaticamente nelle repliche di lettura, il che ti consente di utilizzare gli hint dell'ottimizzatore di query (o gli hint RESOURCE_GROUP) nelle repliche per evitare errori di query dovuti a gruppi mancanti. Le definizioni dei gruppi vengono acquisite anche nel flusso del log binario per il recupero point-in-time (PITR).

Le assegnazioni delle sessioni dei thread, come SET RESOURCE GROUP, non vengono scritte nei log binari.

I privilegi amministrativi vengono concessi a cloudsqlsuperuser

Per lavorare con i gruppi di risorse, devi disporre dei seguenti privilegi di database amministrativi:

  • RESOURCE_GROUP_ADMIN: crea, modifica ed elimina i gruppi di risorse
  • RESOURCE_GROUP_USER: assegna thread o utilizza hint nelle query

In Cloud SQL, entrambi i privilegi vengono concessi per impostazione predefinita al ruolo cloudsqlsuperuser.

Gli amministratori di MySQL possono anche concedere il privilegio di database RESOURCE_GROUP_USER o RESOURCE_GROUP_ADMIN ad altri utenti.

Gestire i gruppi di risorse in Cloud SQL

Puoi configurare e gestire i gruppi di risorse a livello di utente in Cloud SQL per ottimizzare l'allocazione delle risorse nel database. In questo modo, puoi controllare e dare la priorità all'allocazione delle risorse CPU tra i vari workload delle sessioni di database sull'istanza.

Per ulteriori dettagli sulla configurazione dei gruppi di risorse MySQL e sul comportamento di riferimento, consulta la sezione Gruppi di risorse nella documentazione di MySQL.

Per gestire i gruppi di risorse in Cloud SQL, puoi:

Prima di iniziare

Prima di creare un gruppo di risorse, verifica quanto segue:

  • Hai eseguito l'accesso al database con un account utente con il privilegio RESOURCE_GROUP_ADMIN. L'utente root predefinito e tutti gli account di database a cui è stato assegnato il ruolo cloudsqlsuperuser dispongono di questo privilegio per impostazione predefinita.

  • L'istanza Cloud SQL esegue MySQL 8.0 o versioni successive.

Creare un gruppo di risorse

Crea gruppi di risorse a livello di utente con una priorità dei thread compresa tra 0 (priorità più alta) e 19 (priorità più bassa). La priorità dei thread predefinita per le connessioni standard è 0.

Per creare un gruppo di risorse, esegui la seguente istruzione:

CREATE RESOURCE GROUP GROUP_NAME
  TYPE = USER
  THREAD_PRIORITY = PRIORITY_VALUE;

Sostituisci quanto segue:

  • GROUP_NAME: il nome del gruppo di risorse che vuoi creare.
  • PRIORITY_VALUE: la priorità di pianificazione della CPU per il gruppo di risorse, da 0 (priorità più alta) a 19 (priorità più bassa).

Modificare la priorità di un gruppo di risorse

Per modificare la priorità di pianificazione della CPU di un gruppo di risorse esistente, esegui la seguente istruzione:

ALTER RESOURCE GROUP GROUP_NAME
  THREAD_PRIORITY = PRIORITY_VALUE;

Sostituisci quanto segue:

  • GROUP_NAME: il nome del gruppo di risorse che vuoi modificare.
  • PRIORITY_VALUE: la nuova priorità di pianificazione della CPU.

Eliminare un gruppo di risorse

Per eliminare un gruppo di risorse, esegui la seguente istruzione:

DROP RESOURCE GROUP GROUP_NAME;

Sostituisci quanto segue:

  • GROUP_NAME: il nome del gruppo di risorse che vuoi eliminare.

Assegnare connessioni e query a un gruppo di risorse

Per applicare i vincoli delle risorse a un workload, assegna connessioni attive o query specifiche ai gruppi di risorse utente.

Per assegnare le connessioni di sessione a un gruppo:

  1. Concedi l'autorizzazione all'utente del workload:

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

    Sostituisci quanto segue:

    • USERNAME: l'utente del database a cui vuoi concedere il privilegio.
  2. Quando l'utente si connette, esegui:

    SET RESOURCE GROUP GROUP_NAME;

    Sostituisci quanto segue:

    • GROUP_NAME: il nome del gruppo di risorse a cui vuoi assegnare la connessione.

    In alternativa, specifica un ID thread specifico:

    SET RESOURCE GROUP GROUP_NAME FOR THREAD_ID;

    Sostituisci quanto segue:

    • GROUP_NAME: il nome del gruppo di risorse a cui vuoi assegnare la connessione.
    • THREAD_ID: l'ID del thread di database specifico che vuoi assegnare.

Per assegnare una singola query a un gruppo (tramite un hint dell'ottimizzatore):

Utilizza l'hint del commento dell'ottimizzatore RESOURCE_GROUP nell'istruzione DML o SELECT:

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

Sostituisci quanto segue:

  • GROUP_NAME: il nome del gruppo di risorse in cui vuoi eseguire la query.
  • COLUMN_NAME_1: la colonna in base alla quale vuoi raggruppare i risultati.
  • COLUMN_NAME_2: il valore della colonna che vuoi sommare.
  • TABLE_NAME: la tabella su cui vuoi eseguire la query.

Monitorare i gruppi di risorse

Per esaminare i gruppi di risorse configurati:

SELECT * FROM INFORMATION_SCHEMA.RESOURCE_GROUPS;

Per visualizzare i thread di connessione attivi e i gruppi di risorse assegnati, esegui la seguente query:

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

Passaggi successivi