PostgreSQL
 sql >> Database >  >> RDS >> PostgreSQL

Approfondimento del fornitore di cloud:PostgreSQL su Google Cloud Platform (GCP)

Da dove iniziare?

Il posto migliore che ho trovato per iniziare non è stato altro che la documentazione ufficiale. C'è anche un canale Youtube GCP per chi preferisce la multimedialità. Una volta che mi sono trovato nella terra della documentazione di Cloud SQL, sono passato a Concepts dove ci viene promesso di "sviluppare una comprensione profonda" del prodotto.

Allora iniziamo!

Caratteristiche Google Cloud di PostgreSQL

Google Cloud SQL per PostgreSQL offre tutte le funzionalità standard che ci aspetteremmo da una soluzione gestita:alta disponibilità con failover automatico, backup automatici, crittografia a riposo e in transito, registrazione e monitoraggio avanzati e ovviamente una ricca API per interagire con tutti i servizi.

E per un po' di storia, il supporto di PostgreSQL è iniziato a marzo 2017, fino ad allora l'unico motore di database supportato era MySQL.

Cloud SQL esegue PostgreSQL sulla piattaforma informatica di seconda generazione di Google. L'elenco completo delle funzionalità è disponibile qui e anche qui. Esaminando il primo è evidente che non c'è mai stata una piattaforma di prima generazione per PostgreSQL.

I database in esecuzione sulla piattaforma di seconda generazione dovrebbero funzionare a velocità 7 volte più veloci e beneficiare di una capacità di archiviazione 20 volte superiore. Il blog che annuncia la piattaforma di seconda generazione entra nei dettagli dell'esecuzione del test sysbench per confrontare Google Cloud SQL con l'allora principale concorrente AWS in entrambe le incarnazioni RDS e Aurora. I risultati mi hanno sorpreso in quanto mostrano che Cloud SQL ha prestazioni migliori, mentre i recenti test eseguiti utilizzando l'AWS Benchmark rilasciato circa un anno dopo hanno concluso il contrario. Più o meno nello stesso periodo in cui era disponibile il supporto PostgreSQL. Anche se sono impaziente all'idea di eseguire il benchmark da solo, suppongo che ci siano due potenziali fattori che potrebbero aver influenzato i risultati:il benchmark sysbench di Google utilizzava parametri diversi e AWS potrebbe aver migliorato i propri prodotti durante quel periodo.

Compatibilità GCP PostgreSQL

Come previsto, Google Cloud SQL per PostgreSQL è quasi un sostituto immediato della versione community e supporta tutti i linguaggi procedurali PL/pgSQL SQL.

Alcune funzionalità non sono disponibili per motivi di sicurezza, ad esempio l'accesso SUPERUSER. Altre caratteristiche sono state rimosse a causa dei potenziali rischi posti alla stabilità e alle prestazioni del prodotto. Infine, alcune opzioni e parametri non possono essere modificati, sebbene le richieste di modifica di tale comportamento possano essere effettuate tramite il gruppo di discussione di Cloud SQL.

Cloud SQL è anche compatibile con il protocollo PostgreSQL.

Quando si tratta di isolamento delle transazioni, Cloud SQL segue il comportamento predefinito di PostgreSQL, impostando per impostazione predefinita il livello di isolamento Read Committed.

Per alcuni dei parametri di configurazione del server, Cloud SQL implementa intervalli diversi per ragioni non spiegate nella documentazione, ancora una cosa importante da ricordare.

Rete

Esistono diversi modi per connettersi al database, a seconda che l'istanza si trovi su una rete privata o pubblica (le applicazioni si connettono dall'esterno di GCP). Comune a entrambi i casi è il VPC predefinito gestito da Google in cui risiedono tutte le istanze del database Cloud SQL.

IP privato

I client che si connettono a un indirizzo IP privato vengono instradati tramite una connessione peering tra i VPC che ospitano il client e rispettivamente l'istanza del database. Sebbene non sia specifico di PostgreSQL, è importante rivedere i requisiti di rete, al fine di evitare problemi di connessione. One gotcha:una volta abilitata, la capacità dell'IP privato non può essere rimossa.

Connessione da applicazioni esterne

Le connessioni da applicazioni ospitate al di fuori di GCP possono e devono essere crittografate. Inoltre, per evitare i vari attacchi, le connessioni client e l'applicazione devono installare il certificato client fornito. La procedura per la generazione e la configurazione dei certificati è alquanto complicata e richiede strumenti personalizzati per garantire il rinnovo periodico dei certificati. Questo potrebbe essere uno dei motivi per cui Google offre la possibilità di utilizzare il proxy Cloud SQL.

Connessione tramite proxy Cloud SQL

L'installazione è abbastanza semplice, come ho scoperto in effetti per tutte le istruzioni nella documentazione di Google Cloud SQL. In una nota correlata, inviare un feedback sulla documentazione è semplicissimo e la funzione screenshot è stata la prima volta per me.

Esistono diversi modi per autorizzare le connessioni proxy e ho scelto di configurare un account di servizio, proprio come indicato nella documentazione di Cloud SQL Proxy.

Una volta che tutto è a posto, è ora di avviare il proxy:

~/usr/local/google $ ./cloud_sql_proxy -instances=omiday:us-west1:s9s201907141919=tcp:5432 -credential_file=omiday-427c34fce588.json

2019/07/14 21:22:43 failed to setup file descriptor limits: failed to set rlimit {&{8500 4096}} for max file descriptors: invalid argument

2019/07/14 21:22:43 using credential file for authentication; [email protected]

2019/07/14 21:22:43 Listening on 127.0.0.1:5432 for omiday:us-west1:s9s201907141919

2019/07/14 21:22:43 Ready for new connections

Per connetterci all'istanza remota stiamo usando il proxy specificando localhost invece dell'indirizzo IP pubblico dell'istanza:

~ $ psql "user=postgres dbname=postgres password=postgres hostaddr=127.0.0.1"

Pager usage is off.

psql (11.4, server 9.6.11)

Type "help" for help.

Nota che non c'è crittografia poiché ci stiamo connettendo localmente e il proxy si occupa di crittografare il traffico che scorre nel cloud.

Un'attività DBA comune è visualizzare le connessioni al database eseguendo una query su pg_stat_activity. La documentazione afferma che le connessioni proxy verranno visualizzate come cloudqlproxy~1.2.3.4, quindi volevo verificare tale affermazione. Ho aperto due sessioni come postgres, una tramite proxy e l'altra dal mio indirizzo di casa, quindi andrà bene la seguente query:

[email protected]:5432 postgres> select * from pg_stat_activity where usename = 'postgres';

-[ RECORD 1 ]----+-----------------------------------------------------------

datid            | 12996

datname          | postgres

pid              | 924

usesysid         | 16389

usename          | postgres

application_name | psql

client_addr      |

client_hostname  |

client_port      | -1

backend_start    | 2019-07-15 04:25:37.614205+00

xact_start       | 2019-07-15 04:28:43.477681+00

query_start      | 2019-07-15 04:28:43.477681+00

state_change     | 2019-07-15 04:28:43.477684+00

wait_event_type  |

wait_event       |

state            | active

backend_xid      |

backend_xmin     | 8229

query            | select * from pg_stat_activity where usename = 'postgres';

-[ RECORD 2 ]----+-----------------------------------------------------------

datid            | 12996

datname          | postgres

pid              | 946

usesysid         | 16389

usename          | postgres

application_name | psql

client_addr      | <MY_HOME_IP_ADDRESS>

client_hostname  |

client_port      | 60796

backend_start    | 2019-07-15 04:27:50.378282+00

xact_start       |

query_start      |

state_change     | 2019-07-15 04:27:50.45613+00

wait_event_type  |

wait_event       |

state            | idle

backend_xid      |

backend_xmin     |

query            |

Sembra che le connessioni proxy siano invece identificate come client_port ==-1 e un client_addr vuoto. Questo può essere ulteriormente confermato confrontando i timestamp per backend_start e il log proxy di seguito:

2019/07/14 21:25:37 New connection for "omiday:us-west1:s9s201907141919"

Alta disponibilità PostgreSQL su Google Cloud

Google Cloud SQL per PostgreSQL garantisce un'elevata disponibilità utilizzando la sincronizzazione dei dati di archiviazione di basso livello mediante dischi persistenti regionali. Il failover è automatico, con un intervallo di controllo del battito cardiaco di un secondo e un failover attivato dopo circa 60 secondi.

Prestazioni e monitoraggio

La sezione Prestazioni della documentazione indica le regole generali del cloud:mantenere il database (sia le repliche di scrittura che di lettura) vicino all'applicazione e ridimensionare verticalmente l'istanza. Ciò che spicca è la raccomandazione di eseguire il provisioning di un'istanza con almeno 60 GB di RAM quando le prestazioni sono importanti.

Stackdriver fornisce monitoraggio e registrazione, nonché l'accesso ai log di PostgreSQL:

Controllo accessi

Questo è implementato a livello di progetto, istanza e database.

Controllo dell'accesso al progetto

Il controllo dell'accesso al progetto è il controllo dell'accesso specifico per il cloud:utilizza il concetto di ruoli IAM per consentire ai membri del progetto (utenti, gruppi o account di servizio) l'accesso a varie risorse Cloud SQL. L'elenco dei ruoli è in qualche modo autoesplicativo, per una descrizione dettagliata di ciascun ruolo e delle autorizzazioni associate, fare riferimento a API Explorer o Cloud SQL Admin API per uno dei linguaggi di programmazione supportati.

Per dimostrare come funzionano i ruoli IAM, creiamo un account di servizio di sola lettura (visualizzatore):

Avvia una nuova istanza proxy sulla porta 5433 utilizzando l'account di servizio associato al ruolo di spettatore:

~/usr/local/google $ ./cloud_sql_proxy -instances=omiday:us-west1:s9s201907141919=tcp:5433 -credential_file=omiday-4508243deca9.json

2019/07/14 21:49:56 failed to setup file descriptor limits: failed to set rlimit {&{8500 4096}} for max file descriptors: invalid argument

2019/07/14 21:49:56 using credential file for authentication; [email protected]

2019/07/14 21:49:56 Listening on 127.0.0.1:5433 for omiday:us-west1:s9s201907141919

2019/07/14 21:49:56 Ready for new connections

Apri una connessione psql a 127.0.0.1:5433:

~ $ psql "user=postgres dbname=postgres password=postgres hostaddr=127.0.0.1 port=5433"

Il comando esce con:

psql: server closed the connection unexpectedly

      This probably means the server terminated abnormally

      before or while processing the request.

Ops! Controlliamo i log dei proxy:

2019/07/14 21:50:33 New connection for "omiday:us-west1:s9s201907141919"

2019/07/14 21:50:33 couldn't connect to "omiday:us-west1:s9s201907141919": ensure that the account has access to "omiday:us-west1:s9s201907141919" (and make sure there's no typo in that name). Error during createEphemeral for omiday:us-west1:s9s201907141919: googleapi: Error 403: The client is not authorized to make this request., notAuthorized

Controllo dell'accesso alle istanze

L'accesso a livello di istanza dipende dall'origine della connessione:

La combinazione di metodi di autorizzazione sostituisce l'onnipresente pg_hba.conf.

Backup e ripristino

Per impostazione predefinita, i backup automatici sono abilitati:

Sebbene i backup non influiscano sulle operazioni di lettura e scrittura del database, influiscono sulle prestazioni e pertanto si consiglia di programmare i backup durante i periodi di minore attività.

Per la ridondanza, i backup possono essere archiviati in due regioni (a pagamento) con la possibilità di selezionare posizioni personalizzate.

Per risparmiare spazio di archiviazione, usa la compressione. I file compressi .gz vengono ripristinati in modo trasparente.

Cloud SQL supporta anche la clonazione delle istanze. Per il set di dati più piccolo l'operazione ha richiesto circa 3 minuti:

Ora di inizio della clonazione 10:07:10:

I log di PostgreSQL mostrano che PostgreSQL è diventato disponibile sull'istanza clonata a 10:10:47:

Questo è ancora un modo più semplice del backup e del ripristino, per creare una copia di un'istanza per scopi di test, sviluppo o risoluzione dei problemi.

Best practice di Google Cloud per PostgreSQL

  • Configura una policy di attivazione per le istanze che non devono essere eseguite 24 ore su 24, 7 giorni su 7.
  • Posiziona l'istanza del database nella stessa zona, o regione, con le istanze del motore di calcolo e le applicazioni App Engine per evitare la latenza di rete.
  • Crea l'istanza del database nella stessa zona di Compute Engine. Se si utilizza qualsiasi altro tipo di connessione, accettare la zona predefinita.
  • Gli utenti creati utilizzando Cloud SQL sono per impostazione predefinita superutenti cloud. Usa PostgreSQL ALTER ROLE per modificare i loro permessi.
  • Utilizza l'ultima versione del proxy Cloud SQL.
  • I nomi delle istanze dovrebbero includere un timestamp per poter riutilizzare il nome durante l'eliminazione e la ricreazione delle istanze.
  • pg_dump per impostazione predefinita include oggetti di grandi dimensioni. Se il database contiene BLOB-s, esegui il dump durante i periodi di bassa attività per evitare che l'istanza non risponda.
  • Utilizza gcloud sql Connect per connetterti rapidamente da un client esterno senza la necessità di inserire nella whitelist l'indirizzo IP del client.
  • Iscriviti per annunciare il gruppo al fine di ricevere notifiche sugli aggiornamenti dei prodotti e avvisi come problemi durante la creazione di istanze:
  • Assicurati che le applicazioni implementino tecniche di gestione della connessione al database.
  • Le istanze interrotte per più di 90 giorni verranno eliminate a meno che non siano in stato sospeso.
  • Esegui un failover manuale per testare il comportamento dell'applicazione e la durata del tempo di inattività.
  • Utilizza la versione predefinita del motore.
  • Lo spazio di archiviazione per le istanze configurate per aumentare automaticamente lo spazio di archiviazione aumenterà con incrementi di 25 GB. Poiché lo spazio di archiviazione non può essere recuperato, imposta un limite di aumento della dimensione stimata del database nel prossimo ciclo di budget e monitora le query incontrollate,
  • Utilizza i tempi di manutenzione "precedenti" per le istanze di test:
  • Le applicazioni devono utilizzare connessioni attive e backoff esponenziale per ripristinare rapidamente dopo il riavvio di un'istanza.
  • L'applicazione che si basa sulle repliche di lettura dovrebbe prendere in considerazione l'utilizzo di 3 repliche per evitare problemi causati dall'errore dei dischi persistenti regionali che potrebbero causare la non disponibilità di entrambe le repliche.
  • Configura le repliche di lettura per migliorare le prestazioni di lettura.
  • Il riavvio dell'istanza è necessario quando si aggiorna l'elenco di indirizzi IP autorizzati ad accedere a un'istanza pubblica per disconnettere le connessioni esistenti.
  • Esamina il gruppo dedicato StackOverflow Cloud SQL per ulteriori informazioni.

Elenco di controllo di avvio per Cloud SQL

La sezione dell'elenco di controllo nella documentazione fornisce una panoramica delle attività consigliate durante la configurazione di un'istanza Cloud SQL per PostgreSQL pronta per la produzione. In particolare, le applicazioni devono essere progettate per gestire i riavvii di Cloud SQL. Inoltre, mentre non ci sono limiti di query al secondo, ci sono limiti di connessione.

Supporto per estensioni GCP PostgreSQL

Cloud SQL supporta la maggior parte delle estensioni PostgreSQL. Al momento della stesura di questo documento, su 52 estensioni della community ci sono 22 estensioni non supportate e 2 estensioni PostGIS non supportate.

postgis_raster

postgis_sfcgal

Per le estensioni PostgreSQL possiamo rivedere il repository contrib PostgreSQL o, meglio, differire l'output di pg_available_extensions:

A monte:

~ $ psql -U postgres -p 54396

Pager usage is off.

psql (11.4, server 9.6.14)

Type "help" for help.

[email protected][local]:54396 postgres# select * from pg_available_extensions order by name;

      name        | default_version | installed_version |                               comment

--------------------+-----------------+-------------------+----------------------------------------------------------------------

adminpack          | 1.1 |                   | administrative functions for PostgreSQL

autoinc            | 1.0 |                   | functions for autoincrementing fields

bloom              | 1.0 |                   | bloom access method - signature file based index

btree_gin          | 1.0 |                   | support for indexing common datatypes in GIN

btree_gist         | 1.2 |                   | support for indexing common datatypes in GiST

chkpass            | 1.0 |                   | data type for auto-encrypted passwords

citext             | 1.3 |                   | data type for case-insensitive character strings

cube               | 1.2 |                   | data type for multidimensional cubes

dblink             | 1.2 |                   | connect to other PostgreSQL databases from within a database

dict_int           | 1.0 |                   | text search dictionary template for integers

dict_xsyn          | 1.0 |                   | text search dictionary template for extended synonym processing

earthdistance      | 1.1 |                   | calculate great-circle distances on the surface of the Earth

file_fdw           | 1.0 |                   | foreign-data wrapper for flat file access

fuzzystrmatch      | 1.1 |                   | determine similarities and distance between strings

hstore             | 1.4 |                   | data type for storing sets of (key, value) pairs

hstore_plperl      | 1.0 |                   | transform between hstore and plperl

hstore_plperlu     | 1.0 |                   | transform between hstore and plperlu

hstore_plpython2u  | 1.0 |                   | transform between hstore and plpython2u

hstore_plpythonu   | 1.0 |                   | transform between hstore and plpythonu

insert_username    | 1.0 |                   | functions for tracking who changed a table

intagg             | 1.1 |                   | integer aggregator and enumerator (obsolete)

intarray           | 1.2 |                   | functions, operators, and index support for 1-D arrays of integers

isn                | 1.1 |                   | data types for international product numbering standards

lo                 | 1.1 |                   | Large Object maintenance

ltree              | 1.1 |                   | data type for hierarchical tree-like structures

ltree_plpython2u   | 1.0 |                   | transform between ltree and plpython2u

ltree_plpythonu    | 1.0 |                   | transform between ltree and plpythonu

moddatetime        | 1.0 |                   | functions for tracking last modification time

pageinspect        | 1.5 |                   | inspect the contents of database pages at a low level

pg_buffercache     | 1.2 |                   | examine the shared buffer cache

pg_freespacemap    | 1.1 |                   | examine the free space map (FSM)

pg_prewarm         | 1.1 |                   | prewarm relation data

pg_stat_statements | 1.4             | | track execution statistics of all SQL statements executed

pg_trgm            | 1.3 |                   | text similarity measurement and index searching based on trigrams

pg_visibility      | 1.1 |                   | examine the visibility map (VM) and page-level visibility info

pgcrypto           | 1.3 |                   | cryptographic functions

pgrowlocks         | 1.2 |                   | show row-level locking information

pgstattuple        | 1.4 |                   | show tuple-level statistics

plpgsql            | 1.0 | 1.0               | PL/pgSQL procedural language

postgres_fdw       | 1.0 |                   | foreign-data wrapper for remote PostgreSQL servers

refint             | 1.0 |                   | functions for implementing referential integrity (obsolete)

seg                | 1.1 |                   | data type for representing line segments or floating-point intervals

sslinfo            | 1.2 |                   | information about SSL certificates

tablefunc          | 1.0 |                   | functions that manipulate whole tables, including crosstab

tcn                | 1.0 |                   | Triggered change notifications

timetravel         | 1.0 |                   | functions for implementing time travel

tsearch2           | 1.0 |                   | compatibility package for pre-8.3 text search functions

tsm_system_rows    | 1.0 |                   | TABLESAMPLE method which accepts number of rows as a limit

tsm_system_time    | 1.0 |                   | TABLESAMPLE method which accepts time in milliseconds as a limit

unaccent           | 1.1 |                   | text search dictionary that removes accents

uuid-ossp          | 1.1 |                   | generate universally unique identifiers (UUIDs)

xml2               | 1.1 |                   | XPath querying and XSLT

Cloud SQL:

[email protected]:5432 postgres> select * from pg_available_extensions where name !~ '^postgis' order by name;

      name        | default_version | installed_version |                              comment

--------------------+-----------------+-------------------+--------------------------------------------------------------------

bloom              | 1.0 |                   | bloom access method - signature file based index

btree_gin          | 1.0 |                   | support for indexing common datatypes in GIN

btree_gist         | 1.2 |                   | support for indexing common datatypes in GiST

chkpass            | 1.0 |                   | data type for auto-encrypted passwords

citext             | 1.3 |                   | data type for case-insensitive character strings

cube               | 1.2 |                   | data type for multidimensional cubes

dict_int           | 1.0 |                   | text search dictionary template for integers

dict_xsyn          | 1.0 |                   | text search dictionary template for extended synonym processing

earthdistance      | 1.1 |                   | calculate great-circle distances on the surface of the Earth

fuzzystrmatch      | 1.1 |                   | determine similarities and distance between strings

hstore             | 1.4 |                   | data type for storing sets of (key, value) pairs

intagg             | 1.1 |                   | integer aggregator and enumerator (obsolete)

intarray           | 1.2 |                   | functions, operators, and index support for 1-D arrays of integers

isn                | 1.1 |                   | data types for international product numbering standards

lo                 | 1.1 |                   | Large Object maintenance

ltree              | 1.1 |                   | data type for hierarchical tree-like structures

pg_buffercache     | 1.2 |                   | examine the shared buffer cache

pg_prewarm         | 1.1 |                   | prewarm relation data

pg_stat_statements | 1.4             | | track execution statistics of all SQL statements executed

pg_trgm            | 1.3 |                   | text similarity measurement and index searching based on trigrams

pgcrypto           | 1.3 |                   | cryptographic functions

pgrowlocks         | 1.2 |                   | show row-level locking information

pgstattuple        | 1.4 |                   | show tuple-level statistics

plpgsql            | 1.0 | 1.0               | PL/pgSQL procedural language

sslinfo            | 1.2 |                   | information about SSL certificates

tablefunc          | 1.0 |                   | functions that manipulate whole tables, including crosstab

tsm_system_rows    | 1.0 |                   | TABLESAMPLE method which accepts number of rows as a limit

tsm_system_time    | 1.0 |                   | TABLESAMPLE method which accepts time in milliseconds as a limit

unaccent           | 1.1 |                   | text search dictionary that removes accents

uuid-ossp          | 1.1 |                   | generate universally unique identifiers (UUIDs)

Estensioni non supportate in Cloud SQL:

adminpack          1.1 administrative functions for PostgreSQL

autoinc            1.0 functions for autoincrementing fields

dblink             1.2 connect to other PostgreSQL databases from within a database

file_fdw           1.0 foreign-data wrapper for flat file access

hstore_plperl      1.0 transform between hstore and plperl

hstore_plperlu     1.0 transform between hstore and plperlu

hstore_plpython2u  1.0 transform between hstore and plpython2u

hstore_plpythonu   1.0 transform between hstore and plpythonu

insert_username    1.0 functions for tracking who changed a table

ltree_plpython2u   1.0 transform between ltree and plpython2u

ltree_plpythonu    1.0 transform between ltree and plpythonu

moddatetime        1.0 functions for tracking last modification time

pageinspect        1.5 inspect the contents of database pages at a low level

pg_freespacemap    1.1 examine the free space map (FSM)

pg_visibility      1.1 examine the visibility map (VM) and page-level visibility info

postgres_fdw       1.0 foreign-data wrapper for remote PostgreSQL servers

refint             1.0 functions for implementing referential integrity (obsolete)

seg                1.1 data type for representing line segments or floating-point intervals

tcn                1.0 Triggered change notifications

timetravel         1.0 functions for implementing time travel

tsearch2           1.0 compatibility package for pre-8.3 text search functions

xml2               1.1 XPath querying and XSLT

Registrazione

Le operazioni eseguite in Cloud SQL vengono registrate nella scheda Attività insieme a tutti i dettagli. Esempio dalla creazione di un'istanza, che mostra tutti i dettagli dell'istanza:

Migrazione PostgreSQL a GCP

Per fornire la migrazione delle installazioni PostgreSQL locali, Google si avvale di pgBouncer.

Nota che non esiste una procedura guidata della console GCP per le migrazioni PostgreSQL.

Attenzione DBA!

Alta disponibilità e replica

Un nodo master non può eseguire il failover su una replica di lettura. La stessa sezione delinea altri aspetti importanti delle repliche di lettura:

  • può essere portato offline in qualsiasi momento per l'applicazione di patch
  • non seguire il nodo master in un'altra zona dopo un failover — poiché la replica è sincrona, ciò può influire sul ritardo di replica
  • non c'è bilanciamento del carico tra le repliche, in altre parole, nessuna singola applicazione endpoint può essere indirizzata
  • La dimensione dell'istanza della replica deve essere almeno la dimensione del nodo master
  • nessuna replica tra regioni
  • Non è possibile eseguire il backup delle repliche
  • Tutte le repliche devono essere eliminate prima che un'istanza master possa essere ripristinata dal backup o eliminata
  • La replica a cascata non è disponibile

Utenti

Per impostazione predefinita, il "superutente cloud" è postgres, che è un membro del ruolo cloudqlsuperuser. A sua volta, cloudqlsuperuser eredita i ruoli PostgreSQL predefiniti:

[email protected]:5432 postgres> \du+ postgres

                           List of roles

Role name  | Attributes       | Member of | Description

-----------+------------------------+---------------------+-------------

postgres   | Create role, Create DB | {cloudsqlsuperuser} |



[email protected]:5432 postgres> \du+ cloudsqlsuperuser

                              List of roles

   Role name       | Attributes       | Member of | Description

-------------------+------------------------+--------------+-------------

cloudsqlsuperuser  | Create role, Create DB | {pg_monitor} |

Nota che i ruoli SUPERUSER e REPLICATION non sono disponibili.

Backup e ripristino

I backup non possono essere esportati.

Non è possibile utilizzare i backup per aggiornare un'istanza, ad esempio per ripristinarla in un motore PostgreSQL diverso.

Funzioni come PITR, Replica logica e Compilazione JIT non sono disponibili. Le richieste di funzionalità possono essere archiviate in Issue Tracker di Google.

Crittografia

Al momento della creazione dell'istanza SSL/TLS è abilitato ma non applicato:

In questa modalità è possibile richiedere la crittografia, tuttavia la convalida del certificato non è disponibile.

~ $ psql "sslmode=verify-ca user=postgres dbname=postgres password=postgres hostaddr=35.233.149.65"

psql: root certificate file "/home/lelu/.postgresql/root.crt" does not exist

Either provide the file or change sslmode to disable server certificate verification.

~ $ psql "sslmode=require user=postgres dbname=postgres password=postgres hostaddr=35.233.149.65"

Pager usage is off.

psql (11.4, server 9.6.11)

SSL connection (protocol: TLSv1.2, cipher: ECDHE-RSA-AES128-GCM-SHA256, bits: 128, compression: off)

Type "help" for help.

Il tentativo di connessione tramite psql a un'istanza SSL forzata restituirà un errore autoesplicativo:

~ $ psql "sslmode=require user=postgres dbname=postgres password=postgres hostaddr=35.233.149.65"

psql: FATAL:  connection requires a valid client certificate

Archiviazione

  • Lo spazio di archiviazione può essere aumentato dopo la creazione dell'istanza, ma non è mai diminuito, quindi fai attenzione ai costi associati all'aumento dello spazio di archiviazione o configura il limite di aumento.
  • Lo spazio di archiviazione è limitato a 30 TB.

CPU

Le istanze possono essere create con meno di un core, tuttavia l'opzione non è disponibile nella Console Cloud SQL poiché l'istanza deve essere creata specificando uno dei tipi di macchina di esempio, in questo caso – livello:

Esempio di creazione di un'istanza di codice condiviso utilizzando gcloud all'interno di Cloud Shell:

Il numero di CPU è limitato a 64, un limite relativamente basso per installazioni, considerando che ai tempi del benchmark 9.2 i server di fascia alta iniziavano a 32 core.

Posizioni delle istanze

La posizione multiregionale è disponibile solo per i backup.

Accesso tramite IP pubblico

Per impostazione predefinita, la procedura guidata della console GCP abilita solo l'accesso all'indirizzo IP pubblico, tuttavia, l'accesso è negato fino a quando la rete del client non è configurata:

Manutenzione

Gli aggiornamenti possono superare la finestra di manutenzione e le repliche di lettura vengono aggiornate in qualsiasi momento.

La documentazione non specifica la durata della finestra di manutenzione. Le informazioni vengono fornite durante la creazione dell'istanza:

Modifiche al conteggio della CPU, alla dimensione della memoria o alla zona in cui si trova l'istanza individuato richiede che il database sia offline per diversi minuti.

Utenti

Cloud SQL utilizza i termini "ruolo" e "utente" in modo intercambiabile.

Alta disponibilità

Il costo in una configurazione ad alta disponibilità è il doppio dell'istanza standalone e include lo spazio di archiviazione.

Il failover automatico viene avviato dopo circa 60 secondi dopo che il nodo primario non è più disponibile. Secondo il rapporto Oracle MAA, questo si traduce in una perdita di $ 5.800 al minuto. Considerando che ci vogliono dai 2 ai 3 minuti prima che le applicazioni possano ricollegarsi, l'interruzione raddoppia o triplica. Inoltre, l'intervallo heartbeat di 60 secondi non sembra essere un'opzione configurabile.

Replica

Non è possibile accedere alle repliche di lettura utilizzando un singolo endpoint, ognuno dei quali riceve un nuovo indirizzo IP:

Regional persistent disks provide data redundancy at the cost of write performance.

Cloud SQL will not failover to read replicas, hence readers cannot be considered a high availability solution

External replicas and external masters are currently not supported.

Connecting to Instance

Google does not automatically renew the instance SSL certificates, however, both the initiation and rotation procedures can be automated.

If the application is built on the App Engine platform additional limits apply, such as 60 seconds for a database request to complete, 60 concurrent connections for PHP applications. The “App Engine Limits” section in Quotas and limits provides more details:

IP addresses in the range 172.17.0.0/16 are reserved.

Administration

Once started, operations cannot be canceled. Runaway queries can still be stopped by using the pg_terminate_backend and pg_cancel_backend PostgreSQL built-in functions.

A short demonstration using two psql sessions and starting a long running query in the second session:

[email protected]:5432 postgres> select now(); select pg_sleep(3600); select now();

            now

-------------------------------

2019-07-16 02:08:18.739177+00

(1 row)

In the first session, cancel the long running query:

[email protected]:5432 postgres> select pid, client_addr, client_port, query, backend_start from pg_stat_activity where usename = 'postgres';

-[ RECORD 1 ]-+-------------------------------------------------------------------------------------------------------------

pid           | 2182

client_addr   | 173.180.222.170

client_port   | 56208

query         | select pid, client_addr, client_port, query, backend_start from pg_stat_activity where usename = 'postgres';

backend_start | 2019-07-16 01:57:34.99011+00

-[ RECORD 2 ]-+-------------------------------------------------------------------------------------------------------------

pid           | 2263

client_addr   | 173.180.222.170

client_port   | 56276

query         | select pg_sleep(3600);

backend_start | 2019-07-16 02:07:43.860829+00



[email protected]:5432 postgres> select pg_cancel_backend(2263); select now();

-[ RECORD 1 ]-----+--

pg_cancel_backend | t



-[ RECORD 1 ]----------------------

now | 2019-07-16 02:09:09.600399+00

Comparing the timestamps between the two sessions:

ERROR:  canceling statement due to user request

            now

-------------------------------

2019-07-16 02:09:09.602573+00

(1 row)

It’s a match!

While restarting an instance is a recommended method when attempting to resolve database instance issues, avoid restarting before the first restart completed.

Data Import and Export

CSV import/export is limited to one database.

Exporting data as an SQL dump that can be imported later, requires a custom pg_dump command.

To quote from the documentation:

pg_dump -U [USERNAME] --format=plain --no-owner --no-acl [DATABASE_NAME] \

    | sed -E 's/(DROP|CREATE|COMMENT ON) EXTENSION/-- \1 EXTENSION/g' > [SQL_FILE].sql

Pricing

Charge Type

Instance ON

Instance OFF

Storage

Yes

Yes

Instance

No

Yes

Troubleshooting

Logging

All actions are recorded and can be viewed under the Activity tab.

Resources

Review the Diagnosing Issues with Cloud SQL instances and Known issues sections in the documentation.

Conclusione

Although missing some important features the PostgreSQL DBA is used to, namely PITR and Logical Replication, Google Cloud SQL provides out of the box high-availability, replication, encryption, and automatic storage increase, just to name a few, making manage PostgreSQL an appealing solution for organizations looking to quickly deploy their PostgreSQL workloads or even migrating from Oracle.

Developers can take advantage of cheap instances such as shared CPU (less than one CPU).

Google approaches the PostgreSQL engine adoption in a conservative manner, the stable offering lagging behind current upstream by 3 versions.

Just as with any solution provider consider getting support which can come in handy during edge scenarios such as when instances are suspended.

For professional support, Google maintains a list of partners which currently includes one of the PostgreSQL professional services , namely EDB.