Cloud SQL for PostgreSQL
4 DBAs

Google e' noto per il suo motore di ricerca, che e' piu' utilizzati e completi, ma fornisce anche un ottimo insieme di servizi in Cloud. Tra i molti servizi offerti vi sono anche quelli relativi alle basi di dati relazionali gestite che prendono il nome di Google Cloud SQL.

Cloud SQL for PostgreSQL e' uno dei servizi disponibili su Google Cloud ed e' l'oggetto di questa breve paginetta.
Questo documento descrive le caratteristiche degli ambienti Cloud SQL for PostgreSQL presentando in modo sintetico e pratico le differenze rispetto ad un'installazione PostgreSQL on-premise.

Dopo una breve introduzione (PostgreSQL, Cloud SQL), si entra nell'architettura di Cloud SQL for Postgres vedendo l'installazione, la configurazione ed i superpoteri dell'amministratore. Si passa quindi all'utilizzo con gli accessi, la gestione, il monitoring, i backup/restore.

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

PostgreSQL

Architettura PostgreSQL PostgreSQL e' considerato a ragione il piu' completo e robusto RDBMS Open Source. Le sue prestazioni ed affidabilita' sono paragonabili a quelle dei piu' diffusi RDBMS commerciali e su alcune funzionalita' e' il database di riferimento (eg. GIS). I suoi principali punti di forza sono una licenza molto aperta per tutti gli utilizzi, la gestione completa ed efficiente delle transazioni (ACID), ottime prestazioni ed affidabilita', un SQL ricco di funzionalita' (eg. subquery, referential integrity, inheritance, trigger, stored fuctions, 2PC, full-text, JSON, analytics, native partitioning, stored procedures, ...), allineato ai piu' recenti standard ed estensibile (extension), funzionalita' Object-Relational, strumenti di amministrazione e gestione completi, funzionalita' di replicazione/HA/DR incluse nel database.

La gestione delle transazioni in PostgreSQL avviene con la tecnica del MVCC (Multiversion Concurrency Control) e la consistenza dei dati su disco e' assicurata con il logging sui WAL (Write-Ahead Logging).
Un'instanza Postgres contiene piu' database. All'interno di ogni database viene mantenuto un ricco Catalog che consente di controllare con query SQL gli oggetti presenti nella base dati (eg. pg_database, pg_class, pg_tables, ...) e l'andamento delle attivita' (eg. pg_stat_activity, pg_locks, pg_settings, pg_stats,...).

L'ecosistema di strumenti, applicazioni ed ambienti compatibili con Postgres e' molto ampio e completo.

Google Cloud SQL

Google Cloud e' una delle piattaforma cloud piu' utilizzate del mondo. Tra i molteplici servizi offerti Cloud SQL semplifica l'impostazione, il funzionamento e il dimensionamento di database relazionali nel cloud.

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

Google Cloud SQL rende disponibili diversi database: PostgreSQL, MySQL e Microsoft SQL Server. In questa paginetta vedremo le caratteristiche del servizio Cloud SQL for Postgres!

Come come i servizi di compute anche i servizi Cloud SQL vengono erogati nelle diverse Region disponibili su Google Cloud (eg. Oregon: us-west1, N.Virginia: us-east4, Milano: europe-west8). In ogni Region sono generalmente presenti piu' Zone che sono implementate con alimentazioni, reti, strutture indipendenti per garantire un'elevata alta affidabilita'. Google Cloud Regions

Con Cloud SQL e' possibile creare una combinazione di diverse capacità di CPU, memoria, storage e rete in modo semplice e mantenendo il massimo della flessibilita', per ospitare un'istanza di database praticamente di qualsiasi dimensione.
Si parte da una singola CPU per arrivare ad un massimo di 96 CPUs e 624 GB di memoria oltre alla possibilita' di definire repliche sia per scalare con le attivita' in lettura che per fornire una maggiore HA.

Cloud SQL for PostgreSQL

Cloud SQL for PostgreSQL fornisce un database PostgreSQL gestito in cui una serie di attivita' vengono svolte in modo guidato o completamente automatico: installazione, upgrade, backup, monitoraggio, replica, ...

Sono disponibili le diverse versioni di PostgreSQL dalla 9.6 alla 14, ma ovviamente e' consigliabile utilizzare le versioni piu' recenti.

Non vi sono differenze per le applicazioni rispetto ad un'installazione on-premises. Le differenze si rendono evidenti nella gestione e nell'amministrazione e nel seguito cercheremo di vedere tutte le particolarita' di Cloud SQL PostgreSQL.

Per il sizing non e' necessario preallocare o definire la dimensione dello storage. Un database su Cloud SQL puo' crescere dinamicamente allocando via via lo spazio necessario fino ad un massimo di 64 TB.

Installazione

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

L'installazione di un'istanza Cloud SQL for PostgreSQL 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 Cloud SQL impostera' in automatico i principali parametri di tuning in modo ottimizzato.

Basta solo utilizzare il wizard per creare l'istanza di database voluta. La prima scelta da fare e'... vogliamo un database PostgreSQL!

Cloud SQL Create Database Instance

A differenza di un'installazione PostgreSQL on premise non e' necessaria una configurazione iniziale. I principali parametri di tuning sono gia' configurati, il file pg_hba non puo', e non deve, essere impostato.
A volte e' opportuna qualche configurazione specifica ma questa verra' impostata con la configurazione dell'istanza e con i Database Flag come vederemo nel seguito.

Configurazione

Ricordate i file postgresql.conf e pg_hba.conf? Dimenticateli! Siamo in Cloud ed e' tutto diverso...

Per effettuare la configurazione di Cloud SQL for PostgreSQL non e' necessario modificare alcun file. Le configurazioni si effettuano da interfaccia grafica e con i Database Flag.
I parametri disponibili sono quasi tutti quelli presenti in Postgres con alcune differenze perche' alcuni parametri vengono calcolati in automatico ed altri prendono nomi differenti.

Le prime impostazioni di un'istanza Postgres sono quelle sul tipo di sistema ospite e sulla configurazione in generale:

Google Cloud for SQL PostgreSQL - Impostazioni Machine Type Google Cloud for SQL PostgreSQL - Impostazioni Storage Google Cloud for SQL PostgreSQL - Impostazioni Generali

I database Flag sono i parametri di configurazione di Postgres. La maggioranza sono identici a quelli della versione community, alcuni sono specifici di Cloud SQL e si riconoscono facilmente dal nome: Google Cloud for SQL PostgreSQL - Impostazioni Storage

E' possibile eseguire le modifiche nella finistra di manutenzione o applicarle immediatamente. Cosi' come avviene per i parametri di PostgreSQL on premise alcune impostazioni possono essere attive immediatamente mentre altre richiedono un riavvio.
Tutti i parametri disponibili sono visibili nella vista di sistema standard pg_settings. In generale i parametri che richiedono il riavvio sono gli stessi in Cloud SQL. Ad esempio quando serve inserire un valore nel parametro shared_preload_libraries e' necessario un riavvio sia con una versione community on-premises che su Cloud SQL for PostgreSQL.

Molti parametri che un DBA deve impostare per eseguire un tuning iniziale di una base dati con Cloud SQL for PostgreSQL sono impostati automaticamente con default molto ragionevoli basati sulla dimensione della macchina ospite configurata. Tra i piu' importanti: max_connections, shared_buffers, effective_cache_size, ... maggiori dettagli si trovano nella documentazione ufficiale.

Superpoteri

Ricordate che l'utente postgres del sistema operativo ha tutti i poteri e che l'utente postgres 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 Database Flag, i file di log sono accessibili solo da console o da CLI.
E' presente l'utente postgres del database ma... non ha i superpoteri: al suo posto Google utilizza l'utente cloudsqladmin che ha tutti i poteri ma che e' utilizzato solo da Google Cloud per attivita' di servizio.
Al momento della creazione di un'istanza viene creato l'utente postgres con il massimo dei poteri ed e' possibile creare ulteriori utenti con i privilegi voluti ma nessuno sara' superuser.

Accessi

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

psql testdb --user=test --host=IP_pubblico
Password for user test: 
psql (14.4, server 14.4)
SSL connection (protocol: TLSv1.3, cipher: TLS_AES_256_GCM_SHA384, bits: 256, compression: off)

In pratica e' sufficiente utilizzare l'IP dell'istanza come host nella stringa di connessione.
Lo stesso avviene per un'eventuale istanza di replica che, naturalmente, puo' essere acceduta in sola lettura.

Naturalmente saranno le applicazioni a dover accedere al database in modo protetto e con la minore latenza possibile. L'integrazione con gli altri servizi e' uno dei punti forti dell'offerta complessiva di Google in Cloud.

Gestione

La gestione di un'istanza Google Cloud SQL PostgreSQL e' differente rispetto a quella di un'istanza on-premises ma e' anche terribilmente semplice!

Google Cloud for SQL PostgreSQL - Barra gestione

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

Le stesse funzionalita' sono richiamabili anche da CLI o da API.

Monitoring

Sono molteplici le possibilita' di monitoraggio dei servizi Cloud SQL. Una serie di statistiche utili sono riportate nel System insights [NdA tra cui anche alcune particolarmente sottili come il controllo sul wraparound degli XID]. Google Cloud for SQL PostgreSQL - CPU load Il Query insights invece riporta il dettaglio del carico riconoscendo le singole query responsabili.

Google Cloud for SQL PostgreSQL - Query insights La maggioranza delle metriche del database sono specifiche di PostgreSQL, che un DBA conosce bene perche' ottenute dalle classiche viste di sistema (eg. pg_stat_activity, pg_stat_database, pg_stat_bgwriter), ma sono disponibili anche alcune metriche ulteriori.
L'abilitazione di degli Insights e' molto semplice e si effettua da console. Dal punto di vista "tecnico" l'implementazione e' molto semplice: l'utente cloudsqladmin esegue una serie di query a tempo sulle viste di sistema di PostgreSQL (eg. pg_stat_statement)!

Per completezza va infine ricordato che sono disponibili ulteriori strumenti di monitoraggio sia Cloud SQL (eg. analisi dei log), sia legacy PostgreSQL (eg. pgAdmin). Da questo punto di vista l'unica limitazione sarebbero le autorizzazioni ma in realta' anche gli strumenti piu' datati funzionano perfettamente.

Backup/restore

Questa e' una della parti che preferisco dei DBaaS perche' le problematiche dei backup e dei restore sono sempre state quelle che meno mi piacevano sui database on premises...

E' possibile scegliere se eseguire i backup automatici o meno nella configurazione dell'istanza. I backup dei database Cloud SQL vengono effettuati automaticamente durante la backup window e mantenuti per il periodo di ritenzione prescelto (impostabile fino a 365 giorni). In qualsiasi momento e' possibile eseguire un backup a richiesta.
I backup contengono l'intera istanza DB in tutte le sue parti. Nel caso di Google Cloud SQL PostgreSQL sono quindi presenti tutti i database e gli oggetti comuni ai database (eg. roles). Non e' possibile impostare backup parziali.
Vengono salvati anche i transaction log la cui ritenzione puo' essere impostata da 1 a 7 giorni.
I restore possono essere eseguiti al momento del backup o in modalita' PITR, sulla stessa istanza di partenza o su una nuova istanza.

I backup possono essere utilizzati solo per effettuare un restore. Per migrare i dati, eseguire ribaltamenti parziali, ... si utilizzano gli export (che vengono effettuati con pg_dump e pg_restore).

Sono presenti ulteriori funzionalita' sui backup per maggiori dettagli consultare la documentazione ufficiale.

Accesso all'host

Non e' possibile in nessun modo l'accesso alla VM/container che ospita la base dati. Ma se potessimo... ecco cosa vedremmo!

Il sistema operativo e' un Linux Debian su cui e' installato un PostgreSQL 14.4. La struttura dei processi presenta una serie di processi di background, tra cui il principale (Postmaster) e gli eventuali processi utente (postgres):

# ps -efa | grep postg postgres 8 1 0 Apr01 ? 00:00:69 /usr/pgsql-14.0/bin/postmaster -p 5432 postgres 24 8 0 Apr01 ? 00:00:30 postgres: checkpointer postgres 25 8 0 Apr01 ? 00:00:08 postgres: background writer postgres 26 8 0 Apr01 ? 00:01:44 postgres: walwriter postgres 27 8 0 Apr01 ? 00:00:02 postgres: autovacuum launcher postgres 28 8 0 Apr01 ? 00:00:01 postgres: archiver last was 000000010000000000000008 postgres 30 8 0 Apr01 ? 00:00:19 postgres: logical replication launcher postgres 32 8 0 Apr01 ? 00:00:12 postgres: cloudsqladmin cloudsqladmin 127.0.0.1(44172) idle postgres 332 8 0 Apr01 ? 00:00:13 postgres: walsender cloudsqlreplica 34.154.269.5(35998) streaming 0/9D248D8 postgres 666 8 0 Apr01 ? 00:00:17 postgres: cloudsqladmin cloudsqladmin 127.0.0.1(37844) idle postgres 1915 8 0 11:59 ? 00:00:00 postgres: test14 test14 93.69.269.129(23158) SELECT postgres 1940 8 0 11:59 ? 00:00:00 postgres: postgres bench 196.102.269.129(57797) idle postgres 2263 8 12 12:32 ? 00:03:02 postgres: bench bench 196.102.269.129(58144) UPDATE postgres 2264 8 12 12:32 ? 00:02:59 postgres: bench bench 196.102.269.129(58148) UPDATE postgres 2266 8 12 12:32 ? 00:02:59 postgres: bench bench 196.102.269.129(58153) SELECT postgres 2270 8 12 12:32 ? 00:02:59 postgres: bench bench 196.102.269.129(58157) idle # free total used free shared buff/cache available Mem: 8259048 7370748 777860 0 110440 4198340 Swap: 2097148 0 2097148

A parte gli scherzi l'accesso al sistema ospite non e' utilizzabile ed ogni configurazione o controllo si esegue dalla console.

Varie ed eventuali

Il documento Your server stinks! e' sempre aggiornato sui rilasci delle release PostgreSQL e su Google Cloud SQL.

Cloud SQL for PostgreSQL fornisce una sessantina di extension tra cui la quasi totalita' delle extension core di PostgreSQL ed aggiunge alcune estensioni ulteriori tra cui orafce, pg_cron, pgAudit, pg_proctab, pg_partman, plv8, pgrouting, pg_hint_plan, ...

Oltre a Cloud SQL sono molti i servizi DBaaS (DB as as Service) disponibili... sicuramente e' utile un confronto con i servizi di Amazon RDS e con Aurora PostgreSQL.


Titolo: Cloud SQL for PostgreSQL 4 DBAs
Livello: Avanzato (3/5)
Data: 14 Febbraio 2020
Versione: 1.0.1 - 1 Aprile 2022
Autore: mail [AT] meo.bogliolo.name