Hvor skal jeg starte?
Det bedste sted, jeg kunne finde at starte, var intet andet end den officielle dokumentation. Der er også en GCP Youtube-kanal for dem, der foretrækker multimedie. Da jeg fandt mig selv ind i Cloud SQL-dokumentationslandet, vendte jeg mig til Concepts, hvor vi er lovet at "udvikle en dyb forståelse" af produktet.
Så lad os komme i gang!
PostgreSQL Google Cloud-funktioner
Google Cloud SQL til PostgreSQL tilbyder alle de standardfunktioner, vi kan forvente af en administreret løsning:høj tilgængelighed med automatisk failover, automatisk sikkerhedskopiering, kryptering i hvile og under transport, avanceret logning og overvågning, og selvfølgelig en rig API til at interagere med alle tjenester.
Og for lidt af historien startede PostgreSQL-support i marts 2017, indtil da var den eneste understøttede databasemotor MySQL.
Cloud SQL kører PostgreSQL på Googles anden generation af computerplatform. Den fulde liste over funktioner er tilgængelig her og også her. Ved at gennemgå førstnævnte er det tydeligt, at der aldrig har været en First Generation-platform til PostgreSQL.
Databaser, der kører på anden generations platform, forventes at køre med hastigheder 7x hurtigere og drage fordel af 20x mere lagerkapacitet. Bloggen, der annoncerer Second Generation-platformen, går i detaljer med at køre sysbench-testen for at sammenligne Google Cloud SQL med den daværende hovedkonkurrent AWS i begge inkarnationer RDS og Aurora. Resultaterne overraskede mig, da de viser, at Cloud SQL klarer sig bedre, mens de seneste test udført ved hjælp af AWS Benchmark, der blev udgivet omkring et år senere, konkluderede det modsatte. Det er omkring samme tid PostgreSQL-understøttelse var tilgængelig. Mens jeg klør ved tanken om selv at køre benchmark, gætter jeg på, at der er to potentielle faktorer, der kunne have påvirket resultaterne:Googles sysbench benchmark brugte forskellige parametre, og AWS kan have forbedret deres produkter i løbet af den tid.
GCP PostgreSQL-kompatibilitet
Som forventet er Google Cloud SQL til PostgreSQL næsten en drop-in-erstatning for fællesskabsversionen og understøtter alle PL/pgSQL SQL proceduresprog.
Nogle funktioner er ikke tilgængelige på grund af sikkerhedsmæssige årsager, for eksempel SUPERBRUGER-adgang. Andre funktioner blev fjernet på grund af potentielle risici for produktets stabilitet og ydeevne. Endelig kan nogle muligheder og parametre ikke ændres, selvom anmodninger om at ændre denne adfærd kan foretages via Cloud SQL-diskussionsgruppen.
Cloud SQL er også trådkompatibel med PostgreSQL-protokollen.
Når det kommer til transaktionsisolering, følger Cloud SQL PostgreSQL-standardadfærden, der som standard er Read Committed isolationsniveau.
For nogle af serverkonfigurationsparametrene implementerer Cloud SQL forskellige intervaller af årsager, der er uforklarlige i dokumentationen, hvilket stadig er en vigtig ting at huske.
Netværk
Der er flere måder at oprette forbindelse til databasen på, afhængigt af om forekomsten er på et privat netværk eller et offentligt netværk (applikationer, der opretter forbindelse uden for GCP). Fælles for begge tilfælde er den foruddefinerede VPC, der administreres af Google, hvor alle Cloud SQL-databaseforekomster findes.
Privat IP
Klienter, der opretter forbindelse til en privat IP-adresse, dirigeres via en peering-forbindelse mellem de VPC'er, der hoster klienten, og henholdsvis databaseinstansen. Selvom det ikke er specifikt for PostgreSQL, er det vigtigt at gennemgå netværkskravene for at undgå forbindelsesproblemer. One gotcha:når den er aktiveret, kan den private IP-funktion ikke fjernes.
Opretter forbindelse fra eksterne applikationer
Forbindelser fra applikationer, der hostes uden for GCP, kan og bør krypteres. Derudover skal klientforbindelser og applikation installere det medfølgende klientcertifikat for at undgå de forskellige angreb. Proceduren for at generere og konfigurere certifikaterne er noget kompliceret og kræver brugerdefinerede værktøjer for at sikre, at certifikater fornyes med jævne mellemrum. Det kan være en af grundene til, at Google tilbyder muligheden for at bruge Cloud SQL Proxy.
Opretter forbindelse ved hjælp af Cloud SQL Proxy
Opsætningen er ret ligetil, hvilket jeg faktisk har fundet ud af er tilfældet for alle instruktioner i Google Cloud SQL-dokumentationen. På en relateret note er det meget simpelt at indsende dokumentationsfeedback, og skærmbilledefunktionen var den første for mig.
Der er flere måder at godkende proxyforbindelser på, og jeg valgte at konfigurere en tjenestekonto, ligesom det er beskrevet i Cloud SQL Proxy-dokumentationen.
Når alt er på plads, er det tid til at starte proxyen:
~/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
For at oprette forbindelse til fjerninstansen bruger vi nu proxyen ved at angive localhost i stedet for instansens offentlige IP-adresse:
~ $ 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.
Bemærk, at der ikke er nogen kryptering, da vi opretter forbindelse lokalt, og proxyen sørger for at kryptere trafikken, der flyder ind i skyen.
En almindelig DBA-opgave er at se forbindelserne til databasen ved at forespørge pg_stat_activity. Dokumentationen angiver, at proxyforbindelser vil blive vist som cloudsqlproxy~1.2.3.4, så jeg ønskede at bekræfte denne påstand. Jeg har åbnet to sessioner som postgres, den ene via proxy og den anden fra min hjemmeadresse, så følgende forespørgsel vil duge:
[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 |
Det ser ud til, at proxyforbindelserne i stedet er identificeret som client_port ==-1 og en tom client_addr. Dette kan yderligere bekræftes ved at sammenligne tidsstemplerne for backend_start og proxy-log nedenfor:
2019/07/14 21:25:37 New connection for "omiday:us-west1:s9s201907141919"
PostgreSQL High Availability på Google Cloud
Google Cloud SQL til PostgreSQL sikrer høj tilgængelighed ved hjælp af synkronisering af lagerdata på lavt niveau ved hjælp af regionale persistente diske. Failover er automatisk med et hjerteslagskontrolinterval på et sekund, og en failover udløses efter ca. 60 sekunder.
Ydeevne og overvågning
Sektionen Ydelse i dokumentationen påpeger generelle tommelfingerregler i skyen:hold databasen (både forfattere og læsereplikaer) tæt på applikationen, og skaler instansen lodret. Det, der skiller sig ud, er anbefalingen om at klargøre en instans med mindst 60 GB RAM, når ydeevnen er vigtig.
Stackdriver giver overvågning og logning samt adgang til PostgreSQL-logfiler:
Adgangskontrol
Dette er implementeret på projekt-, instans- og databaseniveau.
Projektadgangskontrol
Projektadgangskontrol er den skyspecifikke adgangskontrol — den bruger konceptet med IAM-roller for at give projektmedlemmer (brugere, grupper eller tjenestekonti) adgang til forskellige Cloud SQL-ressourcer. Listen over roller er noget selvforklarende, for en detaljeret beskrivelse af hver rolle og tilhørende tilladelser henvises til APIs Explorer eller Cloud SQL Admin API for et af de understøttede programmeringssprog.
For at demonstrere, hvordan IAM-roller fungerer, lad os oprette en skrivebeskyttet (seer) tjenestekonto:
Start en ny proxy-instans på port 5433 ved hjælp af den servicekonto, der er knyttet til seerrolle:
~/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
Åbn en psql-forbindelse til 127.0.0.1:5433:
~ $ psql "user=postgres dbname=postgres password=postgres hostaddr=127.0.0.1 port=5433"
Kommandoen afsluttes med:
psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
Ups! Lad os tjekke proxy-logfilerne:
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
Forekomstadgangskontrol
Adgang på instansniveau afhænger af forbindelseskilden:
Kombinationen af godkendelsesmetoder erstatter den allestedsnærværende pg_hba.conf.
Sikkerhedskopiering og gendannelse
Som standard er automatiske sikkerhedskopier aktiveret:
Mens sikkerhedskopier ikke påvirker databasens læse- og skriveoperationer, påvirker de ydeevnen og derfor anbefales det, at sikkerhedskopiering planlægges i perioder med lavere aktivitet.
For redundans kan sikkerhedskopier gemmes i to regioner (ekstra gebyrer pålægges) med mulighed for at vælge tilpassede placeringer.
For at spare lagerplads skal du bruge komprimering. .gz-komprimerede filer gendannes gennemsigtigt.
Cloud SQL understøtter også instanskloning. For det mindste datasæt tog operationen omkring 3 minutter:
Starttidspunkt for kloning 10:07:10:
PostgreSQL-logfilerne viser, at PostgreSQL blev tilgængelig på den klonede instans kl. 10:10:47:
Det er stadig en nemmere måde end sikkerhedskopiering og gendannelse til at oprette en kopi på af en instans med henblik på test, udvikling eller fejlfinding.
Google Cloud Best Practices for PostgreSQL
- Konfigurer en aktiveringspolitik for forekomster, der ikke skal køre 24/7.
- Placer databaseforekomsten i samme zone eller region med compute engine-forekomsterne og App Engine-applikationerne for at undgå netværksforsinkelse.
- Opret databaseforekomsten i samme zone som Compute Engine. Hvis du bruger en anden forbindelsestype, accepterer du standardzonen.
- Brugere, der er oprettet ved hjælp af Cloud SQL, er som standard cloud-superbrugere. Brug PostgreSQL ALTER ROLE til at ændre deres tilladelser.
- Brug den seneste Cloud SQL Proxy-version.
- Forekomstnavne bør indeholde et tidsstempel for at kunne genbruge navnet ved sletning og genskabelse af forekomster.
- pg_dump inkluderer som standard store objekter. Hvis databasen indeholder BLOB-er, skal du udføre dumpet i perioder med lav aktivitet for at forhindre, at forekomsten ikke reagerer.
- Brug gcloud sql connect til hurtigt at oprette forbindelse fra en ekstern klient uden behov for at hvidliste klientens IP-adresse.
- Abonner på at annoncere gruppe for at modtage meddelelser om produktopdateringer og advarsler såsom problemer ved oprettelse af forekomster:
- Sørg for, at applikationer implementerer teknikker til administration af databaseforbindelser.
- Forekomster, der er stoppet i mere end 90 dage, slettes, medmindre de ikke er i en suspenderet tilstand.
- Udfør en manuel failover for at teste applikationsadfærd og nedetidslængde.
- Brug standardversionen af motoren.
- Lagerplads for forekomster, der er konfigureret til automatisk at øge lagerpladsen, vil vokse i trin på 25 GB. Da lagerplads ikke kan genvindes, skal du indstille en stigningsgrænse for den estimerede størrelse af databasen over den næste budgetcyklus, og overvåge løbske forespørgsler,
- Brug den "tidligere" vedligeholdelsestid til testforekomster:
- Applikationer bør bruge aktive forbindelser og eksponentiel backoff for hurtigt at komme sig efter en genstart af forekomsten.
- Applikationer, der er afhængige af læste replikaer, bør overveje at bruge 3 replikaer for at undgå problemer forårsaget af svigtende regionale persistente diske, der fører til, at begge replikaer bliver utilgængelige.
- Konfigurer læsereplikaer for at forbedre læseydelsen.
- Genstart af instans er påkrævet, når du opdaterer listen over IP-adresser, der har adgang til en offentlig instans, for at afbryde eksisterende forbindelser.
- Gennemgå den dedikerede StackOverflow Cloud SQL-gruppe for at få yderligere oplysninger.
Startcheckliste til Cloud SQL
Tjeklisteafsnittet i dokumentationen giver et overblik over anbefalede aktiviteter ved opsætning af en produktionsklar Cloud SQL til PostgreSQL-instans. Specielt skal applikationer være designet til at håndtere Cloud SQL-genstarter. Selvom der ikke er nogen grænser for forespørgsler pr. sekund, er der forbindelsesgrænser.
Understøttelse af PostgreSQL GCP-udvidelser
Cloud SQL understøtter de fleste PostgreSQL-udvidelser. Når dette skrives, er der ud af 52 fællesskabsudvidelser 22 ikke-understøttede udvidelser og 2 ikke-understøttede PostGIS-udvidelser.
postgis_raster
postgis_sfcgal
For PostgreSQL-udvidelser kan vi enten gennemgå PostgreSQL-bidragslageret, eller bedre, differentiere outputtet af pg_available_extensions:
Opstrøms:
~ $ 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)
Ikke-understøttede udvidelser i 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
Logføring
Operationer udført i Cloud SQL logges under fanen Aktivitet sammen med alle detaljerne. Eksempel fra oprettelse af en instans, der viser alle instansdetaljer:
PostgreSQL-migrering til GCP
For at give migrering af lokale PostgreSQL-installationer udnytter Google pgBouncer.
Bemærk, at der ikke er nogen GCP-konsolguide til PostgreSQL-migreringer.
DBA Pas på!
Høj tilgængelighed og replikering
En masterknude kan ikke failover til en læst replika. Det samme afsnit beskriver andre vigtige aspekter af læste replikaer:
- kan til enhver tid tages offline til patching
- følg ikke masternoden i en anden zone efter en failover – da replikeringen er synkron, kan dette påvirke replikeringsforsinkelsen
- der er ingen belastningsbalancering mellem replikaer, med andre ord, ingen enkelt endepunktsapplikationer kan peges på
- replikforekomststørrelsen skal mindst være størrelsen af masterknuden
- ingen replikering på tværs af regioner
- kopier kan ikke sikkerhedskopieres
- alle replikaer skal slettes, før en masterinstans kan gendannes fra backup eller slettes
- Kaskadende replikering er ikke tilgængelig
Brugere
Som standard er "cloud superuser" postgres, som er medlem af cloudsqlsuperuser-rollen. Til gengæld arver cloudsqlsuperuser standard PostgreSQL-rollerne:
[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} |
Bemærk, at rollerne SUPERBRUGER og REPLIKATION ikke er tilgængelige.
Sikkerhedskopiering og gendannelse
Sikkerhedskopier kan ikke eksporteres.
Sikkerhedskopier kan ikke bruges til at opgradere en instans, dvs. gendannelse til en anden PostgreSQL-motor.
Funktioner såsom PITR, logisk replikering og JIT-kompilering er ikke tilgængelige. Funktionsanmodninger kan indgives i Googles Issue Tracker.
Kryptering
Ved oprettelse af forekomster er SSL/TLS aktiveret, men ikke håndhævet:
I denne tilstand kan der anmodes om kryptering, men certifikatvalidering er ikke tilgængelig.
~ $ 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.
Forsøg på at oprette forbindelse ved hjælp af psql til en SSL-tvungen instans vil returnere en selvforklarende fejl:
~ $ psql "sslmode=require user=postgres dbname=postgres password=postgres hostaddr=35.233.149.65"
psql: FATAL: connection requires a valid client certificate
Lagring
- Lagerplads kan øges efter oprettelse af forekomster, men aldrig reduceres, så pas på omkostningerne forbundet med den voksende lagerplads, eller konfigurer stigningsgrænsen.
- Lagerplads er begrænset til 30 TB.
CPU
Forekomster kan oprettes med mindre end én kerne, men muligheden er ikke tilgængelig i Cloud SQL Console, da forekomsten skal oprettes ved at angive en af eksempelmaskintyperne, i dette tilfælde – niveau:
Eksempel på oprettelse af en delt kodeforekomst ved hjælp af gcloud inde i Cloud Shell:
Antallet af CPU'er er begrænset til 64, en relativt lav grænse for store installationer i betragtning af, at dengang 9.2 blev benchmarked, startede avancerede servere med 32 kerner.
Forekomstplaceringer
Multiregional placering er kun tilgængelig for sikkerhedskopiering.
Adgang via offentlig IP
Som standard aktiverer GCP Console Wizard kun offentlig IP-adresseadgang, dog nægtes adgang, indtil klientens netværk er konfigureret:
Vedligeholdelse
Opdateringer kan overskride vedligeholdelsesvinduet, og læste replikaer opdateres til enhver tid.
Dokumentationen angiver ikke, hvor lang varigheden af vedligeholdelsesvinduet er. Oplysningerne gives ved oprettelse af instansen:
Ændringer af CPU-antal, hukommelsesstørrelse eller den zone, hvor forekomsten er placeret kræver, at databasen er offline i adskillige minutter.
Brugere
Cloud SQL bruger udtrykkene "rolle" og "bruger" i flæng.
Høj tilgængelighed
Omkostningerne i en meget tilgængelig konfiguration er det dobbelte af den selvstændige instans, og det inkluderer lagerplads.
Automatisk failover startes efter ca. 60 sekunder efter, at den primære node er blevet utilgængelig. Ifølge Oracle MAA-rapporten omsættes dette til et tab på $5.800 pr. minut. I betragtning af, at det tager 2 til 3 minutter, før applikationerne kan tilslutte igen, fordobles afbrydelsen til tredobling. Derudover ser hjerteslagsintervallet på 60 sekunder ikke ud til at være en konfigurerbar mulighed.
replikering
Læste replikaer kan ikke tilgås ved hjælp af et enkelt slutpunkt, der hver modtager en ny IP-adresse:
Regionale persistente diske giver dataredundans på bekostning af skriveydeevne.
Cloud SQL vil ikke failover for at læse replikaer, derfor kan læsere ikke betragtes som en løsning med høj tilgængelighed
Eksterne replikaer og eksterne mastere er i øjeblikket ikke understøttet.
Opretter forbindelse til forekomst
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.
Konklusion
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.