sql >> Database >  >> RDS >> PostgreSQL

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

Waar te beginnen?

De beste plaats die ik kon vinden om te beginnen was niemand minder dan de officiële documentatie. Er is ook een GCP Youtube-kanaal voor degenen die de voorkeur geven aan multimedia. Toen ik me eenmaal in het Cloud SQL-documentatieland bevond, wendde ik me tot Concepts, waar ons wordt beloofd een "diep begrip" van het product te ontwikkelen.

Dus laten we beginnen!

PostgreSQL Google Cloud-functies

Google Cloud SQL voor PostgreSQL biedt alle standaardfuncties die we van een beheerde oplossing mogen verwachten:hoge beschikbaarheid met automatische failover, automatische back-ups, versleuteling in rust en onderweg, geavanceerde logboekregistratie en controle, en natuurlijk een rijke API om met alle services te communiceren.

En voor een stukje geschiedenis begon de PostgreSQL-ondersteuning in maart 2017, tot dan toe was MySQL de enige ondersteunde database-engine.

Cloud SQL voert PostgreSQL uit op het computerplatform van de tweede generatie van Google. De volledige lijst met functies is hier en ook hier beschikbaar. Als we de eerste bekijken, is het duidelijk dat er nooit een First Generation-platform voor PostgreSQL is geweest.

Databases die op het platform van de tweede generatie draaien, zullen naar verwachting 7x sneller werken en profiteren van 20x meer opslagcapaciteit. De blog die het Second Generation-platform aankondigt, gaat in op de details van het uitvoeren van de sysbench-test om Google Cloud SQL te vergelijken met de toenmalige belangrijkste concurrent AWS in beide incarnaties RDS en Aurora. De resultaten verrasten me omdat ze laten zien dat Cloud SQL beter presteert, terwijl de recente tests die zijn uitgevoerd met de AWS Benchmark die ongeveer een jaar later werd uitgebracht, het tegenovergestelde concludeerden. Dat is rond dezelfde tijd dat PostgreSQL-ondersteuning beschikbaar was. Hoewel ik kriebel bij het idee om de benchmark zelf uit te voeren, vermoed ik dat er twee potentiële factoren zijn die de resultaten kunnen hebben beïnvloed:de sysbench-benchmark van Google gebruikte verschillende parameters en AWS heeft mogelijk hun producten in die tijd verbeterd.

GCP PostgreSQL-compatibiliteit

Zoals verwacht is Google Cloud SQL voor PostgreSQL bijna een vervanging voor de communityversie en ondersteunt het alle procedurele PL/pgSQL SQL-talen.

Sommige functies zijn om veiligheidsredenen niet beschikbaar, bijvoorbeeld SUPERUSER-toegang. Andere functies zijn verwijderd vanwege mogelijke risico's voor de stabiliteit en prestaties van het product. Ten slotte kunnen sommige opties en parameters niet worden gewijzigd, hoewel verzoeken om dat gedrag te wijzigen kunnen worden ingediend via de Cloud SQL-discussiegroep.

Cloud SQL is ook wire-compatibel met het PostgreSQL-protocol.

Als het gaat om transactie-isolatie, volgt Cloud SQL het standaard PostgreSQL-gedrag, standaard ingesteld op Read Committed-isolatieniveau.

Voor sommige serverconfiguratieparameters implementeert Cloud SQL verschillende bereiken om redenen die niet worden uitgelegd in de documentatie, wat nog steeds belangrijk is om te onthouden.

Netwerken

Er zijn meerdere manieren om verbinding te maken met de database, afhankelijk van of de instantie zich op een privénetwerk of een openbaar netwerk bevindt (applicaties die verbinding maken van buiten GCP). Gemeenschappelijk voor beide gevallen is de vooraf gedefinieerde VPC die wordt beheerd door Google, waar alle Cloud SQL-database-instanties zich bevinden.

Privé IP

Clients die verbinding maken met een privé-IP-adres worden gerouteerd via een peeringverbinding tussen de VPC's die de client hosten en respectievelijk de database-instantie. Hoewel het niet specifiek is voor PostgreSQL, is het belangrijk om de netwerkvereisten te herzien om verbindingsproblemen te voorkomen. Eén probleem:eenmaal ingeschakeld, kan de privé-IP-mogelijkheid niet worden verwijderd.

Verbinding maken vanaf externe applicaties

Verbindingen van applicaties die buiten GCP worden gehost, kunnen en moeten worden versleuteld. Om de verschillende aanvallen te voorkomen, moeten de clientverbindingen en de toepassing bovendien het verstrekte clientcertificaat installeren. De procedure voor het genereren en configureren van de certificaten is nogal ingewikkeld en vereist aangepaste tools om ervoor te zorgen dat certificaten periodiek worden vernieuwd. Dat is misschien een van de redenen waarom Google de mogelijkheid biedt om de Cloud SQL Proxy te gebruiken.

Verbinding maken met Cloud SQL Proxy

De installatie is redelijk eenvoudig, wat in feite het geval is gebleken voor alle instructies in de Google Cloud SQL-documentatie. Overigens, het indienen van feedback over documentatie is doodeenvoudig, en de screenshotfunctie was een primeur voor mij.

Er zijn meerdere manieren om proxyverbindingen te autoriseren en ik heb ervoor gekozen om een ​​serviceaccount te configureren, zoals beschreven in de Cloud SQL Proxy-documentatie.

Zodra alles op zijn plaats is, is het tijd om de proxy te starten:

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

Om verbinding te maken met de externe instantie gebruiken we nu de proxy door localhost op te geven in plaats van het openbare IP-adres van de instantie:

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

Houd er rekening mee dat er geen codering is, aangezien we lokaal verbinding maken en de proxy zorgt voor de codering van het verkeer dat naar de cloud stroomt.

Een veelvoorkomende DBA-taak is het bekijken van de verbindingen met de database door pg_stat_activity op te vragen. In de documentatie staat dat proxyverbindingen worden weergegeven als cloudsqlproxy~1.2.3.4, dus ik wilde die claim verifiëren. Ik heb twee sessies geopend als postgres, één via proxy en de andere vanaf mijn thuisadres, dus de volgende vraag is voldoende:

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

Het lijkt erop dat de proxyverbindingen in plaats daarvan worden geïdentificeerd als client_port ==-1 en een lege client_addr. Dit kan bovendien worden bevestigd door de tijdstempels voor backend_start en proxylog hieronder te vergelijken:

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

PostgreSQL High Availability op Google Cloud

Google Cloud SQL voor PostgreSQL zorgt voor hoge beschikbaarheid door synchronisatie van opslaggegevens op laag niveau door middel van regionale persistente schijven. Failover is automatisch, met een hartslagcontrole-interval van één seconde en een failover wordt geactiveerd na ongeveer 60 seconden.

Prestaties en controle

De sectie Prestaties van de documentatie wijst op algemene vuistregels voor de cloud:houd de database (zowel schrijver- als leesreplica's) dicht bij de toepassing en schaal de instantie verticaal. Wat opvalt, is de aanbeveling om een ​​instantie te voorzien van ten minste 60 GB RAM wanneer prestaties belangrijk zijn.

Stackdriver biedt monitoring en logging, evenals toegang tot PostgreSQL-logboeken:

Toegangscontrole

Dit wordt geïmplementeerd op project-, instantie- en databaseniveau.

Projecttoegangscontrole

Projecttoegangscontrole is cloudspecifieke toegangscontrole — het gebruikt het concept van IAM-rollen om projectleden (gebruikers, groepen of serviceaccounts) toegang te geven tot verschillende Cloud SQL-bronnen. De lijst met rollen spreekt voor zich, voor een gedetailleerde beschrijving van elke rol en bijbehorende machtigingen raadpleegt u API's Explorer of Cloud SQL Admin API voor een van de ondersteunde programmeertalen.

Om te demonstreren hoe IAM-rollen werken, maken we een alleen-lezen (viewer) serviceaccount:

Start een nieuwe proxy-instantie op poort 5433 met het serviceaccount dat is gekoppeld aan de kijkersrol:

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

Open een psql-verbinding naar 127.0.0.1:5433:

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

Het commando wordt afgesloten met:

psql: server closed the connection unexpectedly

      This probably means the server terminated abnormally

      before or while processing the request.

Oeps! Laten we de proxylogboeken eens bekijken:

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

Exemplaar toegangscontrole

Toegang op instantieniveau is afhankelijk van de verbindingsbron:

De combinatie van autorisatiemethoden vervangt de alomtegenwoordige pg_hba.conf.

Back-up en herstel

Standaard zijn automatische back-ups ingeschakeld:

Hoewel back-ups geen invloed hebben op de lees- en schrijfbewerkingen van de database, hebben ze wel invloed op de prestaties en daarom wordt aanbevolen om back-ups te plannen tijdens perioden met minder activiteit.

Voor redundantie kunnen back-ups worden opgeslagen in twee regio's (tegen betaling) met de mogelijkheid om aangepaste locaties te selecteren.

Gebruik compressie om opslagruimte te besparen. .gz gecomprimeerde bestanden worden transparant hersteld.

Cloud SQL ondersteunt ook het klonen van instanties. Voor de kleinste dataset duurde de operatie ongeveer 3 minuten:

Begintijd klonen 10:07:10:

De PostgreSQL-logboeken laten zien dat PostgreSQL om 10 uur beschikbaar kwam op de gekloonde instantie:10:47:

Dat is nog steeds een gemakkelijkere manier dan back-up en herstel, voor het maken van een kopie van een instance voor test-, ontwikkelings- of probleemoplossingsdoeleinden.

Praktische tips voor Google Cloud voor PostgreSQL

  • Configureer een activeringsbeleid voor instanties die niet 24/7 hoeven te draaien.
  • Plaats de database-instantie in dezelfde zone of regio met de compute-engine-instanties en App Engine-apps om netwerklatentie te voorkomen.
  • Maak de database-instantie in dezelfde zone als de Compute Engine. Als u een ander verbindingstype gebruikt, accepteer dan de standaardzone.
  • Gebruikers die zijn gemaakt met Cloud SQL zijn standaard cloudsupergebruikers. Gebruik PostgreSQL ALTER ROLE om hun rechten te wijzigen.
  • Gebruik de nieuwste versie van Cloud SQL Proxy.
  • Instantienamen moeten een tijdstempel bevatten om de naam opnieuw te kunnen gebruiken bij het verwijderen en opnieuw maken van instanties.
  • pg_dump neemt standaard grote objecten op. Als de database BLOB's bevat, voert u de dump uit tijdens perioden van lage activiteit om te voorkomen dat de instantie niet meer reageert.
  • Gebruik gcloud sql connect om snel verbinding te maken vanaf een externe client zonder dat u het IP-adres van de client op de witte lijst hoeft te zetten.
  • Abonneer u om een ​​groep aan te kondigen om meldingen over productupdates en waarschuwingen te ontvangen, zoals problemen bij het maken van instanties:
  • Zorg ervoor dat toepassingen technieken voor databaseverbindingsbeheer implementeren.
  • Instances die meer dan 90 dagen zijn gestopt, worden verwijderd, tenzij ze niet zijn opgeschort.
  • Voer een handmatige failover uit om het gedrag van de applicatie en de duur van de downtime te testen.
  • Gebruik de standaard engineversie.
  • Opslagruimte voor instanties die zijn geconfigureerd om de opslagruimte automatisch te vergroten, wordt in stappen van 25 GB groter. Aangezien opslagruimte niet kan worden teruggewonnen, stelt u een verhogingslimiet in voor de geschatte grootte van de database voor de volgende budgetcyclus en controleert u op hol geslagen zoekopdrachten,
  • Gebruik de "vroegere" onderhoudstiming voor testinstanties:
  • Applicaties moeten live verbindingen en exponentiële back-off gebruiken om snel te herstellen nadat een instantie opnieuw is opgestart.
  • Applicaties die afhankelijk zijn van leesreplica's moeten overwegen om 3 replica's te gebruiken om problemen te voorkomen die worden veroorzaakt door falende regionale persistente schijven waardoor beide replica's niet meer beschikbaar zijn.
  • Configureer leesreplica's om de leesprestaties te verbeteren.
  • Het opnieuw opstarten van de instantie is vereist bij het bijwerken van de lijst met IP-adressen die toegang hebben tot een openbare instantie om bestaande verbindingen te verbreken.
  • Bekijk de speciale StackOverflow Cloud SQL-groep voor aanvullende informatie.

Startchecklist voor Cloud SQL

De checklistsectie in de documentatie biedt een overzicht van aanbevolen activiteiten bij het opzetten van een productieklare Cloud SQL voor PostgreSQL-instantie. Applicaties moeten met name zijn ontworpen om het opnieuw opstarten van Cloud SQL aan te kunnen. Hoewel er geen limieten voor zoekopdrachten per seconde zijn, zijn er wel verbindingslimieten.

Ondersteuning voor PostgreSQL GCP-extensies

Cloud SQL ondersteunt de meeste PostgreSQL-extensies. Op dit moment zijn er van de 52 community-extensies 22 niet-ondersteunde extensies en 2 niet-ondersteunde PostGIS-extensies.

postgis_raster

postgis_sfcgal

Voor PostgreSQL-extensies kunnen we ofwel de PostgreSQL contrib-repository bekijken, of beter, de uitvoer van pg_available_extensions diff maken:

Upstream:

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

Niet-ondersteunde extensies 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

Logboekregistratie

Bewerkingen die worden uitgevoerd binnen Cloud SQL worden samen met alle details vastgelegd op het tabblad Activiteit. Voorbeeld van het maken van een instantie, met alle instantiedetails:

PostgreSQL-migratie naar GCP

Om migratie van PostgreSQL-installaties op locatie mogelijk te maken, maakt Google gebruik van pgBouncer.

Houd er rekening mee dat er geen GCP-consolewizard is voor PostgreSQL-migraties.

DBA Pas op!

Hoge beschikbaarheid en replicatie

Een hoofdknooppunt kan geen failover uitvoeren naar een leesreplica. Dezelfde sectie beschrijft andere belangrijke aspecten van leesreplica's:

  • kan op elk moment offline worden gehaald om te patchen
  • volg het hoofdknooppunt in een andere zone niet na een failover - aangezien de replicatie synchroon is, kan dit de replicatievertraging beïnvloeden
  • er is geen taakverdeling tussen replica's, met andere woorden, er kan niet naar één enkele eindpunttoepassing worden verwezen
  • de grootte van de replica-instantie moet minimaal de grootte van het hoofdknooppunt zijn
  • geen replicatie tussen regio's
  • van replica's kan geen back-up worden gemaakt
  • alle replica's moeten worden verwijderd voordat een hoofdinstantie kan worden hersteld vanaf een back-up of kan worden verwijderd
  • cascadereplicatie is niet beschikbaar

Gebruikers

Standaard is de "cloud-superuser" postgres, die lid is van de rol cloudsqlsuperuser. Op zijn beurt neemt cloudsqlsuperuser de standaard PostgreSQL-rollen over:

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

Merk op dat de rollen SUPERUSER en REPLICATION niet beschikbaar zijn.

Back-up en herstel

Back-ups kunnen niet worden geëxporteerd.

Back-ups kunnen niet worden gebruikt voor het upgraden van een instantie, d.w.z. herstellen naar een andere PostgreSQL-engine.

Functies zoals PITR, logische replicatie en JIT-compilatie zijn niet beschikbaar. Functieverzoeken kunnen worden ingediend in de Issue Tracker van Google.

Encryptie

Bij het maken van een instantie is SSL/TLS ingeschakeld maar niet afgedwongen:

In deze modus kan codering worden aangevraagd, maar certificaatvalidatie is niet beschikbaar.

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

Een poging om via psql verbinding te maken met een SSL-afgedwongen instantie levert een zelfverklarende fout op:

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

psql: FATAL:  connection requires a valid client certificate

Opslag

  • Opslag kan worden verhoogd nadat de instantie is gemaakt, maar nooit verminderd, dus pas op voor de kosten die verband houden met de groeiende opslagruimte, of configureer de verhogingslimiet.
  • Opslag is beperkt tot 30 TB.

CPU

Instances kunnen worden gemaakt met minder dan één core, maar de optie is niet beschikbaar in de Cloud SQL Console omdat de instance moet worden gemaakt door een van de voorbeeldmachinetypen op te geven, in dit geval:niveau:

Voorbeeld van het maken van een instantie met gedeelde code met gcloud in Cloud Shell:

Het aantal CPU's is beperkt tot 64, een relatief lage limiet voor grote installaties, gezien het feit dat toen 9.2 werd gebenchmarkt, high-end servers begonnen met 32 ​​cores.

Instantielocaties

Multiregionale locatie is alleen beschikbaar voor back-ups.

Toegang via openbare IP

Standaard schakelt de GCP-consolewizard alleen openbare IP-adrestoegang in, maar toegang wordt geweigerd totdat het netwerk van de client is geconfigureerd:

Onderhoud

Updates kunnen de onderhoudsperiode overschrijden en leesreplica's worden op elk moment bijgewerkt.

De documentatie specificeert niet hoe lang de onderhoudsperiode is. De informatie wordt verstrekt bij het maken van de instantie:

Wijzigingen in CPU-telling, geheugengrootte of de zone waar de instantie zich bevindt locatie vereist dat de database enkele minuten offline is.

Gebruikers

Cloud SQL gebruikt de termen "rol" en "gebruiker" door elkaar.

Hoge beschikbaarheid

De kosten in een configuratie met hoge beschikbaarheid zijn het dubbele van de stand-alone instantie, en dat is inclusief opslag.

Automatische failover wordt gestart na ongeveer 60 seconden nadat het primaire knooppunt niet meer beschikbaar is. Volgens Oracle MAA-rapport vertaalt dit zich in $ 5.800 per minuut verlies. Gezien het feit dat het 2 tot 3 minuten duurt voordat de applicaties de storing weer kunnen verbinden, verdubbelt tot verdrievoudigt. Bovendien lijkt het hartslaginterval van 60 seconden geen configureerbare optie te zijn.

Replicatie

Leesreplica's zijn niet toegankelijk via een enkel eindpunt, die elk een nieuw IP-adres krijgen:

Regionale persistente schijven bieden gegevensredundantie ten koste van schrijfprestaties.

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.

Conclusie

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. SQLite JSON_REPLACE()

  2. Aangepaste op triggers gebaseerde upgrades voor PostgreSQL

  3. Verschillende abonnementen voor identieke servers

  4. hoe te controleren of de database consistent is na onvolledig herstel