Aurora MySQL
4 DBAs

Amazon fornisce un'impressionante numero di servizi in Cloud. La concorrenza sul servizi in Cloud e' molto forte ma non c'e' dubbio che l'offerta di Amazon AWS sia la piu' completa ed innovativa su molteplici tecnologie. Tra i molti servizi offerti vi sono anche quelli relativi alle basi di dati. Oltre alla possibilita' di installare DB su sistemi in Cloud o di utilizzare servizi verticali dedicati viene offerto con Amazon RDS (Relational Database Service) un ampio ventaglio di RDBMS.

Aurora MySQL e' uno dei servizi disponibili su Amazon RDS ed e' l'oggetto di questa breve paginetta.
Questo documento descrive le caratteristiche degli ambienti Aurora MySQL presentando in modo sintetico e pratico le differenze rispetto ad un'installazione MySQL on-premise.

Dopo una breve introduzione (MySQL, RDS, Aurora MySQL), si entra nell'architettura di Aurora vedendo il DB cluster, l'installazione, i superpoteri dell'amministratore, e la configurazione. Si passa quindi all'utilizzo con gli accessi, il monitoring, la gestione, il backup/restore.

Per ovvie ragioni di spazio questo documento e' stato scritto per DBA MySQL o quantomeno per chi MySQL gia' lo conosce ed lo usa...
Per chi non conosce MySQL si consiglia la lettura di un documento introduttivo su MySQL come Introduzione a MySQL oppure Qualcosa in piu' su MySQL ed infine del documento Statistiche prestazionali in MySQL che elenca strumenti e tecniche per analizzare le prestazioni in MySQL.

MySQL

Architettura MySQL MySQL e' DBMS relazionale Open Source piu' diffuso per le applicazioni web e la sua semplicita' di gestione e di utilizzo e' il suo principale punto di forza.

L'architettura di MySQL e' semplicissima: vi e' un solo processo che utilizza al suo interno un thread per ogni connessione! Gli utenti si collegano a MySQL utilizzando una connessione TCP-IP sulla porta socket 3306. Il processo mysqld e' in LISTEN su tale porta e quando arriva una nuova richiesta di connessione effettua l'attivazione del thread corrispondente.
I database MySQL contengono le tabelle che possono essere gestite da Engine differenti anche se quello piu' utilizzato ora e' l'InnoDB.

L'ecosistema di applicazioni ed ambienti compatibili con MySQL ed i suoi fork e' molto ampio e completo.

RDS

Amazon Web Services (AWS) è la piattaforma cloud più completa e utilizzata del mondo. Tra i molteplici servizi offerti Amazon RDS (Relational Database Service) semplifica l'impostazione, il funzionamento e il dimensionamento di database relazionali nel cloud.

Le basi dati RDS sono facilmente scalabili ed automatizzano alcune attivita' di amministrazione del database (eg. upgrade, backup, monitoring). Tutte le basi dati vengono gestite da console grafica oppure con la CLI AWS oppure con le API RDS in modo semplice e consistente.

Amazon RDS rende disponibili diverse classi di istanza database con Engine: MySQL, MySQL, MariaDB, Oracle Database, Microsoft SQL Server ed Amazon Aurora (MySQL e MySQL). In questa paginetta vedremo le caratteristiche del servizio RDS Aurora MySQL!

Come come i servizi EC2 anche i servizi RDS vengono erogati nelle diverse Region disponibili su AWS (eg. us-east-1 in Virginia, us-west-2 in Oregon, eu-south-1 in Italia a Milano). In ogni Region sono generalmente presenti piu' Availability Zones (AZs) che sono implementate con alimentazioni, reti, strutture indipendenti per garantire un'elevata alta affidabilita'. AWS Regions

I tipi di istanza AWS comprendono una combinazione di diverse capacità di CPU, memoria, storage e rete per semplificare la configurazione mantenendo il massimo della flessibilita'. Amazon RDS supporta tre tipi di classi di istanza: standard, ottimizzate per la memoria e a prestazioni espandibili. Tra queste Aurora utilizza solo quelle ottimizzate per la memoria (db.r*) e a prestazioni espandibili (db.t*). Le istanze Aurora MySQL saranno quindi da scegliere tra queste due classi: si parte da 2 CPU e si arriva fino a 128 CPU e 1TB di RAM con 40Gb di banda.

Infine lo storage... senza entrare nei dettagli dell'architettura Aurora utilizza storage SSD GP (General Purpose) e cresce automaticamente di 10GB fino a 128TiB: c'e' spazio sufficiente per qualsiasi database... o quasi!

Aurora MySQL

Aurora MySQL e' un'implementazione Amazon di un database compatibile a livello applicativo a MySQL. Sono disponibili diverse versioni di Aurora corrispondenti a differenti versioni di MySQL come riportato nella seguente tabella:
(Source: Your database stinks)

Database
Version
First release
Last release
Date (from)
Date (no new)
Date (no snap.)
Notes
Aurora MySQL33.03.04.02021-11 Compatible with MySQL 8.0
22.02.12.02018-02 2024-02Compatible with MySQL 5.7
11.11.23.42014-11 2023-02Compatible with MySQL 5.6

In generale una versione di Aurora MySQL ha le stesse identiche funzionalita' della corrispondente versione di MySQL. Questo e' vero dal punto di vista delle applicazioni ma vi sono pero' importanti differenze nell'architettura.
Le differenze si rendono evidenti nella gestione e nell'amministrazione e nel seguito cercheremo di vedere tutte le particolarita' di Aurora MySQL.

Aurora DB cluster

Aurora Cluster Quando si attiva un'istanza Aurora in realta' viene attivato un DB Cluster. In un DB cluster e' sempre presente un'istanza DB principale in lettura/scrittura e possono essere attive fino a 15 ulteriori istanze in sola lettura. Le istanze in sola lettura possono essere utilizzate per ridurre il carico in lettura ed e' disponibile un punto di accesso bilanciato tra le istanze in lettura.
La scalabilita' in lettura di Aurora e' quindi molto elevata: fino a 15 nodi.

Dal punto di vista dello storage questo e' comune a tutte le istanze DB, e viene replicato sei volte su tre diverse Availability Zones. E' sempre costituito da dischi SSD (di tipo GP). Le repliche sono sincrone e, con la tripla replica, garantiscono un'elevata HA. Lo storage e' indipendente dal numero di instanze DB ed e' sempre configurato come un cluster. Il motore del database e' ottimizzato per operare in cloud e si integra in modo completo con il particolare meccanismo dello storage.

Non e' necessario preallocare o definire la dimensione dello storage. Aurora cresce dinamicamente allocando 10GB alla volta fino ad una dimensione di 128TB.

Sia le istanze DB che lo storage sono ospitate nella stessa Region.

Con Aurora e' anche possibile definire un Global Cluster. Un Global Database Cluster e' composto da diversi DB Cluster, ciascuno in una Region differente. Il DB Cluster principale e' l'unico che accetta le scritture e possono essere presenti fino a 5 DB Cluster secondari. Ogni DB Cluster utilizza uno Storage allocato nella stessa Region e gli storage vengono replicati tra loro in modo asincrono con un sistema di replica dedicato a bassa latenza.

Quanto riportato in questo paragrafo vale per tutti i servizi RDS Aurora ovvero sia per quelli compatibili MySQL che PostgreSQL.
Curiosi di saperne di piu'? Volte vedere quali sono i nodi che compongono il vostro cluster? Provate questa query:

select *
  from information_schema.replica_host_status;

Deve essere sottolineato che la modalita' di replica di Aurora MySQL Cluster e' molto diversa dalla replica di MySQL RDS che utilizza la Replica nativa di MySQL sia nella modalita' sincrona che asincrona.
E' invece implementata nello stesso modo la replica di Aurora PostgreSQL Cluster [NdA per Aurora PostgreSQL la vista di controllo e' aurora_replica_status()].

Installazione

Ricordate i comandi rpm o apt del sistema operativo per installare i pacchetti PosgreSQL? Dimenticatelo! Siamo in Cloud ed e' tutto diverso...

L'installazione di Aurora MySQL-compatible non richiede alcuna competenza tecnica specifica e si effettua solo con qualche click. Anche la configurazione iniziale della base dati, che tipicamente richiede competenze specifiche sul motore, e' molto semplificata. Infatti RDS imposta in automatico i principali parametri di tuning in modo ottimizzato.

RDS Create Database Instance

A differenza di un'installazione MySQL on premise non e' necessaria una configurazione iniziale. I principali parametri di tuning sono gia' configurati, il file my.cnf non puo', e non deve, essere impostato.
A volte e' opportuna qualche configurazione specifica ma questa verra' impostata con i DBParameter Group o i Cluster Parameter Group come vederemo nel seguito.

Superpoteri

Ricordate che l'utente MySQL mysql del sistema operativo puo' eseguire tutte le configurazioni e che l'utente MySQL root del database ha tutti i poteri? Dimenticatelo! Siamo in Cloud ed e' tutto diverso...

Non c'e' alcun accesso al sistema operativo: i file di configurazione non si utilizzano e vengono utilizzati i Parameter Group, i file di log sono accessibili da console o da CLI.
Non esiste l'utente root MySQL! In un DB cluster Aurora MySQL version 2, vengono creati gli utenti admin ed rdsadmin. In un DB cluster Aurora MySQL version 3 (che e' compatibile con MySQL 8.0 e quindi dispone dei ruoli), vengono creati gli utenti admin, rdsadmin e viene creato il ruolo rds_superuser_role. L'utente rdsadmin che ha tutti i poteri ma e' utilizzabile solo da AWS per attivita' di servizio (eg. monitoring).
Tutti gli altri utenti applicativi vengono creati normalmente da SQL seguendo le best pratices di MySQL.

E' assolutamente consigliato utilizzare per ogni DBA un accesso IAM (Identity and Access Management).

Configurazione

Ricordate il file my.cnf? Dimenticatelo! Siamo in Cloud ed e' tutto diverso...

Per effettuare la configurazione di Aurora MySQL non e' necessario modificare alcun file. Le configurazioni si effettuano sui Parameter Group. I Parameter Group possono essere a livello di singolo database o dell'intero cluster a seconda che il parametro sia per un singolo database o comune a tutte le istanze, vengono quindi chiamati DB Parameter Group o Cluster Parameter Group.
I parametri disponibili sono quasi tutti quelli presenti in MySQL con alcune differenze perche' alcuni parametri vengono calcolati in automatico a seconda dell'Instance Class scelta.

In Aurora MySQL sono presenti due gruppi di parametri configurabili da interfaccia grafica: quelli a livello di cluster e quelli a livello di istanza [NdA con MySQL RDS Single Instance vi e' un solo gruppo di parametri e su un'installazione tradizionale di MySQL i parametri sono gestiti nel file MySQL.conf].

Creazione di un nuovo DB Cluster Parameter Group:

Aurora MySQL QPM - Create DB Cluster Parameter Group Creazione di un nuovo DB Parameter Group:

Aurora MySQL QPM - Create DB Parameter Group Impostazione dei parametri:

Aurora QPM - apg_plan_mgmt.capture_plan_baselines Una volta preparate le configurazioni va assegnato il DB [Cluster] Parameter Group all'istanza:

Aurora MySQL - add Cluster Parameter Group E' possibile eseguire le modifiche nella finistra di manutenzione o applicarle immediatamente:

Aurora MySQL - Modify DB Instance

Cosi' come avviene per i parametri di MySQL on premise alcuni possono essere modificati senza eseguire un riavvio mentre altri richiedono un riavvio.
In generale i parametri che richiedono il riavvio sono gli stessi per MySQL Community, per MySQL RDS o per Aurora MySQL.

Accessi

Dal punto di vista dell'accesso applicativo alla base dati non presenta differenze rispetto all'utilizzo di un'istanza on premises:

mysql --host=aws-aurora-01-cluster.cluster-cen6969.eu-central-1.rds.amazonaws.com -P 3306 -u admin -p
Welcome to the MySQL monitor.  Commands end with ; or \g.
Your MySQL connection id is 69
Server version: 8.0.33 Source distribution

Type 'help;' or '\h' for help. Type '\c' to clear the buffer.

mysql>

In pratica e' sufficiente utilizzare l'endopoint dell'istanza come host nella stringa di connessione.
Deve essere ricordato che con Aurora sono disponibili piu' endpoint per l'accesso in lettura/scrittura e per l'accesso in sola lettura.

[NdA La connessione via SSL, non e' obbligatoria di default ma e' possibile richiederla con il parametro cluster require_secure_transport]

Monitoring

Performance Insights Sono molteplici le possibilita' di monitoraggio dei servizi RDS: l'instance status fornisce alcune infomrazioni riassuntive, le recommendations forniscono suggerimenti (eg. un aggiornamento di minor release), l'Enhanced Monitoring riporta le statistiche del sistema ospite (eg. uso di CPU, memoria) i database logs riportano il contenuto dei log la cui configurazione e' analoga a quella dei sistemi on-premise, ...
Lo strumento piu' ricco di informazioni e' sicuramente il Performance Insights. Performance Insights raccoglie e mantiene, per il periodo indicato, una serie di metriche relative al database ed al sistema ospite. La dashboard riporta fino a 10 differenti metriche che vengono scelte tra quelle piu' significative.

La maggioranza delle metriche del database sono specifiche di MySQL ma sono disponibili anche alcune metriche non native ovvero aggiunte da Amazon a quelle standard del database.
L'abilitazione di Performance Insights e' molto semplice e si effettua da console. Dal punto di vista "tecnico" l'utente rdsadmin eseguira' una serie di query a tempo sulle viste di sistema di MySQL (eg. pg_stat_statement). Enable Performance Insights

Per completezza va infine ricordato che sono disponibili ulteriori strumenti di monitoraggio come: CloudWatch, EventBridge, CloudTrail, ... CloudWatch on Aurora

E' naturalmente sempre possibile utilizzare strumenti di terze parti per il monitoraggio sia legacy MySQL (eg. phpMyAdmin) che specifici per AWS. Da questo punto di vista l'unica limitazione sarebbero le autorizzazioni ma in realta' anche gli strumenti piu' datati funzionano perfettamente.

Gestione

La gestione di un'istanza Aurora MySQL e' differente rispetto a quella di un'istanza on-premises ma e' anche terribilmente semplice!

Per avviare un'istanza dalla console di gestione: scegliere Databases quindi scegliere l'istanza di interesse e da Actions scegliere Start.

La console permette di effettuare tutte le normali attivita' di gestione compresa la modifica di un'istanza e l'ugrade di una minor release.
Quando la modifica richiede un riavvio e' possibile eseguirlo immediatamente oppure farlo eseguire automaticamente alla successiva finestra di manutenzione.

Le stesse funzionalita' sono richiamabili anche da AWS CLI ed RDS API.

Backup/restore

I backup dei database RDS vengono effettuati automaticamente durante la Backup window e mantenuti per il periodo di ritenzione prescelto [NdA se la ritenzione e' 0 non vengono effettuati backup].
I backup contengono l'intera istanza DB in tutte le sue parti. Nel caso di Aurora MySQL sono quindi presenti tutti i database e gli oggetti comuni ai database (eg. roles). Non e' possibile impostare backup parziali.
I restore vengono effettuati con la modalita' PITR (Point In Time Recovery) e comportano la creazione di una nuova istanza.
Con un restore e' possibile associare parameter group, security group ed option group differenti rispetto all'istanza di partenza. Va pero' posta attenzione che i nuovi parametri permettano di operare correttamente... e' quindi consigliato mantenere i default che riportano le definizioni precedenti.

Una seconda possibilita' e' quella di eseguire un salvataggio manuale chiamato Snapshot. Anche con il restore da snapshot viene creata una nuova istanza di database.

Sono presenti ulteriori funzionalita' sui backup (eg. export su S3, utilizzare Region differenti, ...) per maggiori dettagli consultare la documentazione ufficiale.

Varie ed eventuali

Il documento Your server stinks! e' sempre aggiornato sui rilasci delle release MySQL e dei servizi RDS.

Abbiamo accennato alle poche cose in meno presenti in Aurora MySQL... c'e' anche qualcosa in piu'? Certamente: Fast Insert, Parallel Query, ... ad esempio:

show global status like 'Aurora_fast_insert%';                


Titolo: Aurora 4 MySQL DBA
Livello: Avanzato (3/5)
Data: 14 Febbraio 2020
Versione: 1.0.2 - 14 Febbraio 2023 ❤️
Autore: mail [AT] meo.bogliolo.name