sql >> Databasteknik >  >> RDS >> PostgreSQL

Cloud Vendor Deep-Dive:PostgreSQL på Google Cloud Platform (GCP)

Var ska jag börja?

Det bästa stället jag kunde hitta att börja var ingen annan än den officiella dokumentationen. Det finns också en GCP Youtube-kanal för dem som föredrar multimedia. När jag väl befann mig i Cloud SQL-dokumentationslandet vände jag mig till Concepts där vi lovas att "utveckla en djup förståelse" av produkten.

Så låt oss komma igång!

PostgreSQL Google Cloud-funktioner

Google Cloud SQL för PostgreSQL erbjuder alla standardfunktioner vi kan förvänta oss av en hanterad lösning:hög tillgänglighet med automatisk failover, automatisk säkerhetskopiering, kryptering i vila och under överföring, avancerad loggning och övervakning, och naturligtvis ett rikt API för att interagera med alla tjänster.

Och för lite historia började PostgreSQL-stödet i mars 2017, fram till dess var den enda databasmotorn som stöddes MySQL.

Cloud SQL kör PostgreSQL på Googles andra generationens datorplattform. Den fullständiga listan över funktioner finns här och även här. När man granskar den förra är det uppenbart att det aldrig fanns en första generationens plattform för PostgreSQL.

Databaser som körs på andra generationens plattform förväntas köras i hastigheter 7 gånger snabbare och dra nytta av 20 gånger mer lagringskapacitet. Bloggen som tillkännager den andra generationens plattform går in på detaljerna för att köra sysbench-testet för att jämföra Google Cloud SQL med den dåvarande huvudkonkurrenten AWS i båda inkarnationerna RDS och Aurora. Resultaten överraskade mig eftersom de visar att Cloud SQL presterar bättre medan de senaste testerna som utfördes med AWS Benchmark som släpptes ungefär ett år senare drog slutsatsen motsatsen. Det är ungefär samtidigt som PostgreSQL-stöd var tillgängligt. Medan jag kliar på tanken på att köra benchmark själv, gissar jag att det finns två potentiella faktorer som kunde ha påverkat resultaten:Googles sysbench benchmark använde olika parametrar och AWS kan ha förbättrat sina produkter under den tiden.

GCP PostgreSQL-kompatibilitet

Som förväntat är Google Cloud SQL för PostgreSQL nästan en drop-in ersättning för communityversionen och stöder alla PL/pgSQL SQL procedurspråk.

Vissa funktioner är inte tillgängliga på grund av säkerhetsskäl, till exempel SUPERUSER-åtkomst. Andra funktioner togs bort på grund av potentiella risker för produktens stabilitet och prestanda. Slutligen kan vissa alternativ och parametrar inte ändras, även om förfrågningar om att ändra det beteendet kan göras via Cloud SQL Discussion Group.

Cloud SQL är också trådkompatibelt med PostgreSQL-protokollet.

När det kommer till transaktionsisolering följer Cloud SQL PostgreSQL-standardbeteendet, som standard till Read Committed-isoleringsnivå.

För vissa av serverkonfigurationsparametrarna implementerar Cloud SQL olika intervall av skäl som inte förklaras i dokumentationen, vilket fortfarande är viktigt att komma ihåg.

Nätverk

Det finns flera sätt att ansluta till databasen, beroende på om instansen är på ett privat nätverk eller ett offentligt nätverk (applikationer som ansluter utanför GCP). Gemensamt för båda fallen är den fördefinierade VPC som hanteras av Google där alla Cloud SQL-databasinstanser finns.

Privat IP

Klienter som ansluter till en privat IP-adress dirigeras via en peering-anslutning mellan VPC:erna som är värd för klienten och respektive databasinstansen. Även om det inte är specifikt för PostgreSQL är det viktigt att se över nätverkskraven för att undvika anslutningsproblem. One gotcha:när den har aktiverats kan den privata IP-kapaciteten inte tas bort.

Ansluter från externa applikationer

Anslutningar från applikationer som finns utanför GCP kan och bör krypteras. Dessutom, för att undvika de olika attackerna, måste klientanslutningar och applikationer installera det medföljande klientcertifikatet. Proceduren för att generera och konfigurera certifikaten är något komplicerad, och kräver anpassade verktyg för att säkerställa att certifikaten förnyas med jämna mellanrum. Det kan vara en av anledningarna till att Google erbjuder möjligheten att använda Cloud SQL Proxy.

Ansluter med Cloud SQL Proxy

Inställningen är ganska enkel, vilket jag faktiskt har funnit vara fallet för alla instruktioner i Google Cloud SQL-dokumentationen. På en relaterad anteckning är det väldigt enkelt att skicka in dokumentationsfeedback, och skärmdumpsfunktionen var den första för mig.

Det finns flera sätt att auktorisera proxyanslutningar och jag valde att konfigurera ett tjänstkonto, precis som beskrivs i Cloud SQL Proxy-dokumentationen.

När allt är på plats är det dags att starta proxyn:

~/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

För att ansluta till fjärrinstansen använder vi nu proxyn genom att ange localhost istället för instansens offentliga IP-adress:

~ $ 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.

Observera att det inte finns någon kryptering eftersom vi ansluter lokalt och proxyn tar hand om att kryptera trafiken som strömmar in i molnet.

En vanlig DBA-uppgift är att visa anslutningarna till databasen genom att fråga pg_stat_activity. Dokumentationen säger att proxyanslutningar kommer att visas som cloudsqlproxy~1.2.3.4 så jag ville verifiera det påståendet. Jag har öppnat två sessioner som postgres, en via proxy och den andra från min hemadress, så följande fråga räcker:

[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 verkar som att proxyanslutningarna istället identifieras som client_port ==-1 och en tom client_addr. Detta kan ytterligare bekräftas genom att jämföra tidsstämplarna för backend_start och proxylogg nedan:

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

PostgreSQL High Availability på Google Cloud

Google Cloud SQL för PostgreSQL säkerställer hög tillgänglighet med hjälp av datasynkronisering på låg nivå med hjälp av regionala beständiga diskar. Failover är automatisk, med ett hjärtslagskontrollintervall på en sekund, och en failover utlöses efter cirka 60 sekunder.

Prestanda och övervakning

Sektionen Prestanda i dokumentationen påpekar allmänna molntumregler:håll databasen (både skribent och läsrepliker) nära applikationen och skala instansen vertikalt. Det som sticker ut är rekommendationen att tillhandahålla en instans med minst 60 GB RAM när prestanda är viktigt.

Stackdriver tillhandahåller övervakning och loggning, samt tillgång till PostgreSQL-loggar:

Åtkomstkontroll

Detta är implementerat på projekt-, instans- och databasnivå.

Projektåtkomstkontroll

Projektåtkomstkontroll är den molnspecifika åtkomstkontrollen — den använder konceptet med IAM-roller för att ge projektmedlemmar (användare, grupper eller tjänstekonton) åtkomst till olika Cloud SQL-resurser. Listan över roller är något självförklarande, för en detaljerad beskrivning av varje roll och tillhörande behörigheter, se APIs Explorer eller Cloud SQL Admin API för ett av de programmeringsspråk som stöds.

För att visa hur IAM-roller fungerar, låt oss skapa ett skrivskyddat (visare) tjänstkonto:

Starta en ny proxyinstans på port 5433 med hjälp av tjänstkontot som är kopplat till tittarroll:

~/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

Öppna en psql-anslutning till 127.0.0.1:5433:

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

Kommandot avslutas med:

psql: server closed the connection unexpectedly

      This probably means the server terminated abnormally

      before or while processing the request.

Hoppsan! Låt oss kontrollera proxyloggarna:

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

Instansåtkomstkontroll

Åtkomst på instansnivå är beroende av anslutningskällan:

Kombinationen av auktoriseringsmetoder ersätter den allestädes närvarande pg_hba.conf.

Säkerhetskopiering och återställning

Som standard är automatiska säkerhetskopieringar aktiverade:

Även om säkerhetskopior inte påverkar databasläs- och skrivoperationer påverkar de prestandan och därför rekommenderas att säkerhetskopieringar schemaläggs under perioder med lägre aktivitet.

För redundans kan säkerhetskopior lagras i två regioner (extra avgifter tillkommer) med möjlighet att välja anpassade platser.

Använd komprimering för att spara lagringsutrymme. .gz-komprimerade filer återställs på ett transparent sätt.

Cloud SQL stöder också instanskloning. För den minsta datamängden tog operationen cirka 3 minuter:

Klonningens starttid 10:07:10:

PostgreSQL-loggarna visar att PostgreSQL blev tillgänglig på den klonade instansen kl. 10:10:47:

Det är fortfarande ett enklare sätt än säkerhetskopiering och återställning, för att skapa en kopia av en instans för test-, utvecklings- eller felsökningssyften.

Google Clouds bästa praxis för PostgreSQL

  • Konfigurera en aktiveringspolicy för instanser som inte måste köras dygnet runt.
  • Placera databasinstansen i samma zon eller region med beräkningsmotorinstanserna och App Engine-applikationerna för att undvika nätverkslatens.
  • Skapa databasinstansen i samma zon som Compute Engine. Om du använder någon annan anslutningstyp accepterar du standardzonen.
  • Användare som skapats med Cloud SQL är som standard superanvändare i molnet. Använd PostgreSQL ALTER ROLE för att ändra deras behörigheter.
  • Använd den senaste Cloud SQL Proxy-versionen.
  • Förekomstnamn bör innehålla en tidsstämpel för att kunna återanvända namnet när du tar bort och återskapar instanser.
  • pg_dump inkluderar som standard stora objekt. Om databasen innehåller BLOB-s utför dumpningen under perioder med låg aktivitet för att förhindra att instansen slutar svara.
  • Använd gcloud sql connect för att snabbt ansluta från en extern klient utan att behöva vitlista klientens IP-adress.
  • Prenumerera på att annonsera grupp för att få aviseringar om produktuppdateringar och varningar som problem när du skapar instanser:
  • Se till att applikationer implementerar databasanslutningshanteringstekniker.
  • Förekomster som stoppats i mer än 90 dagar kommer att raderas såvida de inte är avstängda.
  • Utför en manuell failover för att testa programbeteende och stilleståndslängd.
  • Använd standardversionen av motorn.
  • Lagringsutrymme för instanser som konfigurerats för att automatiskt öka lagringsutrymmet kommer att växa i steg om 25 GB. Eftersom lagringsutrymme inte kan återvinnas ställ in en ökningsgräns för den uppskattade storleken på databasen under nästa budgetcykel, och övervaka flyktiga frågor,
  • Använd den "tidigare" underhållstidpunkten för testinstanser:
  • Applikationer bör använda aktiva anslutningar och exponentiell backoff för att snabbt återhämta sig efter en omstart av instansen.
  • Applikationer som förlitar sig på läsrepliker bör överväga att använda 3 repliker för att undvika problem som orsakas av sviktande regionala beständiga diskar som leder till att båda replikerna blir otillgängliga.
  • Konfigurera läsrepliker för att förbättra läsprestanda.
  • Omstart av instansen krävs när listan över IP-adresser som får åtkomst till en offentlig instans uppdateras för att kunna koppla bort befintliga anslutningar.
  • Granska den dedikerade StackOverflow Cloud SQL-gruppen för ytterligare information.

Startchecklista för Cloud SQL

Checklistsektionen i dokumentationen ger en översikt över rekommenderade aktiviteter när du ställer in en produktionsklar Cloud SQL för PostgreSQL-instans. I synnerhet måste applikationer utformas för att hantera Cloud SQL-omstarter. Även om det inte finns några gränser för frågor per sekund finns det anslutningsgränser.

Stöd för PostgreSQL GCP-tillägg

Cloud SQL stöder de flesta av PostgreSQL-tilläggen. När detta skrivs av 52 community-tillägg finns det 22 tillägg som inte stöds och 2 PostGIS-tillägg som inte stöds.

postgis_raster

postgis_sfcgal

För PostgreSQL-tillägg kan vi antingen granska PostgreSQL-bidragsförrådet, eller bättre, diff utdata från pg_available_extensions:

Uppströ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)

Tillägg som inte stöds 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

Loggning

Operationer som utförs inom Cloud SQL loggas under fliken Aktivitet tillsammans med alla detaljer. Exempel från att skapa en instans, som visar alla instansdetaljer:

PostgreSQL-migrering till GCP

För att tillhandahålla migrering av lokala PostgreSQL-installationer använder Google pgBouncer.

Observera att det inte finns någon GCP-konsolguide för PostgreSQL-migreringar.

DBA Akta dig!

Hög tillgänglighet och replikering

En huvudnod kan inte övergå till en läsreplika. Samma avsnitt beskriver andra viktiga aspekter av läsrepliker:

  • kan tas offline när som helst för patchning
  • följ inte masternoden i en annan zon efter en failover – eftersom replikeringen är synkron kan detta påverka replikeringsfördröjningen
  • det finns ingen lastbalansering mellan repliker, med andra ord, inga enstaka endpoint-applikationer kan pekas på
  • storleken på replikinstansen måste vara minst storleken på huvudnoden
  • ingen replikering mellan regioner
  • repliker kan inte säkerhetskopieras
  • alla repliker måste tas bort innan en huvudinstans kan återställas från säkerhetskopia eller raderas
  • Kaskadereplikering är inte tillgänglig

Användare

Som standard är "molnets superanvändare" postgres som är medlem i rollen cloudsqlsuperuser. I sin tur ärver cloudsqlsuperuser standard PostgreSQL-rollerna:

[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} |

Observera att rollerna SUPERANVÄNDARE och REPLIKATION inte är tillgängliga.

Säkerhetskopiering och återställning

Säkerhetskopiering kan inte exporteras.

Säkerhetskopiering kan inte användas för att uppgradera en instans, dvs. återställa till en annan PostgreSQL-motor.

Funktioner som PITR, logisk replikering och JIT-kompilering är inte tillgängliga. Funktionsbegäranden kan lämnas in i Googles Issue Tracker.

Kryptering

Vid skapande av instanser är SSL/TLS aktiverat men inte verkställt:

I detta läge kan kryptering begäras, men certifikatvalidering är inte tillgänglig.

~ $ 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.

Försök att ansluta med psql till en SSL-förekomst kommer att returnera ett självförklarande fel:

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

psql: FATAL:  connection requires a valid client certificate

Lagring

  • Lagringsutrymmet kan ökas efter att instansen har skapats men aldrig minskas, så se upp för kostnader förknippade med det växande lagringsutrymmet, eller konfigurera ökningsgränsen.
  • Lagringsutrymmet är begränsat till 30 TB.

CPU

Instanser kan skapas med mindre än en kärna, men alternativet är inte tillgängligt i Cloud SQL Console eftersom instansen måste skapas genom att ange en av exempelmaskintyperna, i det här fallet – nivå:

Exempel på att skapa en delad kodinstans med gcloud inuti Cloud Shell:

Antalet processorer är begränsat till 64, en relativt låg gräns för stora installationer, med tanke på att när 9.2 benchmarkades började avancerade servrar med 32 kärnor.

Förekomstplatser

Multiregional plats är endast tillgänglig för säkerhetskopiering.

Åtkomst via offentlig IP

Som standard aktiverar GCP Console Wizard endast åtkomst till offentlig IP-adress, men åtkomst nekas tills klientens nätverk har konfigurerats:

Underhåll

Uppdateringar kan överskrida underhållsfönstret och läsrepliker uppdateras när som helst.

Dokumentationen anger inte hur lång underhållsperioden är. Informationen ges när instansen skapas:

Ändringar av CPU-antal, minnesstorlek eller zonen där instansen är lokaliserad kräver att databasen är offline i flera minuter.

Användare

Cloud SQL använder termerna "roll" och "användare" omväxlande.

Hög tillgänglighet

Kostnaden i en mycket tillgänglig konfiguration är dubbelt så hög som fristående instans, och det inkluderar lagring.

Automatisk failover initieras efter cirka 60 sekunder efter att den primära noden blivit otillgänglig. Enligt Oracle MAA-rapport, översätts detta till $5 800 per minut förlust. Med tanke på att det tar 2 till 3 minuter innan applikationerna kan återansluta avbrottet fördubblas till tre gånger. Dessutom verkar intervallet på 60 sekunder inte vara ett konfigurerbart alternativ.

replikering

Läsrepliker kan inte nås med en enda slutpunkt, var och en får en ny IP-adress:

Regionala beständiga diskar ger dataredundans på bekostnad av skrivprestanda.

Cloud SQL kommer inte att övervinnas för att läsa repliker, därför kan läsare inte betraktas som en lösning med hög tillgänglighet

Externa repliker och externa masters stöds för närvarande inte.

Ansluter till instans

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

Felsökning

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.

Slutsats

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.


  1. Migrera från DB2 till PostgreSQL - Vad du bör veta

  2. Hur man exporterar databasschema i Oracle till en dumpfil

  3. Fel med PHP-kommandon ur synkronisering

  4. Är en vy snabbare än en enkel fråga?