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
- Gruppi di risorse di sistema vietati
- Binlogging automatico e replica dei DDL dei gruppi di risorse
- Privilegi amministrativi pre-concessi
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 risorseRESOURCE_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:
- Creare un gruppo di risorse: crea gruppi di risorse a livello di utente e specifica le priorità dei thread personalizzate.
- Modificare la priorità di un gruppo di risorse: regola la priorità di pianificazione della CPU di un gruppo di risorse a livello di utente esistente.
- Eliminare un gruppo di risorse: rimuovi un gruppo di risorse quando non è più necessario.
- Assegnare connessioni e query a un gruppo di risorse: mappa sessioni attive, utenti di database o query specifiche a un gruppo di risorse.
- Monitorare i gruppi di risorse: controlla i gruppi di risorse configurati e le allocazioni dei thread.
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'utenterootpredefinito e tutti gli account di database a cui è stato assegnato il ruolocloudsqlsuperuserdispongono 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, da0(priorità più alta) a19(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:
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.
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
- Monitorare le istanze Cloud SQL
- Utilizzare i dati di sistema per migliorare le prestazioni del sistema
- Ottimizzare l'utilizzo elevato della CPU
- Utilizzare Query Insights per migliorare le prestazioni delle query
- Monitorare le query attive