Wo anfangen?
Der beste Ausgangspunkt, den ich finden konnte, war nichts anderes als die offizielle Dokumentation. Es gibt auch einen GCP-YouTube-Kanal für diejenigen, die Multimedia bevorzugen. Nachdem ich mich im Dokumentationsland von Cloud SQL wiedergefunden hatte, wandte ich mich an Concepts, wo uns versprochen wird, „ein tiefes Verständnis“ des Produkts zu entwickeln.
Also fangen wir an!
PostgreSQL Google Cloud-Funktionen
Google Cloud SQL für PostgreSQL bietet alle Standardfunktionen, die wir von einer verwalteten Lösung erwarten:Hochverfügbarkeit mit automatischem Failover, automatische Sicherungen, Verschlüsselung im Ruhezustand und während der Übertragung, erweiterte Protokollierung und Überwachung und mehr Natürlich eine reichhaltige API, um mit allen Diensten zu interagieren.
Und zur Erinnerung:Die PostgreSQL-Unterstützung begann im März 2017, bis dahin war MySQL die einzige unterstützte Datenbank-Engine.
Cloud SQL führt PostgreSQL auf der Computerplattform der zweiten Generation von Google aus. Die vollständige Liste der Funktionen finden Sie hier und auch hier. Betrachtet man Ersteres, so wird deutlich, dass es nie eine Plattform der ersten Generation für PostgreSQL gab.
Datenbanken, die auf der Plattform der zweiten Generation laufen, sollen mit 7x schnelleren Geschwindigkeiten laufen und von 20x mehr Speicherkapazität profitieren. Der Blog, der die Plattform der zweiten Generation ankündigt, geht auf die Details der Durchführung des Sysbench-Tests ein, um Google Cloud SQL mit dem damaligen Hauptkonkurrenten AWS in beiden Inkarnationen RDS und Aurora zu vergleichen. Die Ergebnisse haben mich überrascht, da sie zeigen, dass Cloud SQL besser abschneidet, während die kürzlich durchgeführten Tests mit dem etwa ein Jahr später veröffentlichten AWS-Benchmark das Gegenteil ergaben. Das ist ungefähr zur gleichen Zeit, als die PostgreSQL-Unterstützung verfügbar war. Während mich die Idee, den Benchmark selbst durchzuführen, juckt, vermute ich, dass es zwei potenzielle Faktoren gibt, die die Ergebnisse beeinflusst haben könnten:Googles Sysbench-Benchmark verwendete andere Parameter, und AWS könnte seine Produkte in dieser Zeit verbessert haben. P>
GCP-PostgreSQL-Kompatibilität
Wie erwartet ist Google Cloud SQL für PostgreSQL fast ein Drop-in-Ersatz für die Community-Version und unterstützt alle PL/pgSQL-SQL-Prozedursprachen.
Einige Funktionen sind aus Sicherheitsgründen nicht verfügbar, zum Beispiel der SUPERUSER-Zugriff. Andere Funktionen wurden aufgrund potenzieller Risiken für die Produktstabilität und -leistung entfernt. Schließlich können einige Optionen und Parameter nicht geändert werden, obwohl Anfragen zur Änderung dieses Verhaltens über die Cloud SQL-Diskussionsgruppe gestellt werden können.
Cloud SQL ist auch mit dem PostgreSQL-Protokoll kompatibel.
Wenn es um die Transaktionsisolation geht, folgt Cloud SQL dem Standardverhalten von PostgreSQL und verwendet standardmäßig die Isolationsstufe "Read Committed".
Für einige der Serverkonfigurationsparameter implementiert Cloud SQL unterschiedliche Bereiche aus Gründen, die in der Dokumentation nicht erklärt werden, was immer noch wichtig ist.
Netzwerk
Es gibt mehrere Möglichkeiten, eine Verbindung zur Datenbank herzustellen, je nachdem, ob sich die Instanz in einem privaten Netzwerk oder einem öffentlichen Netzwerk befindet (Anwendungen, die eine Verbindung von außerhalb der GCP herstellen). Beiden Fällen gemeinsam ist die von Google verwaltete vordefinierte VPC, in der sich alle Cloud SQL-Datenbankinstanzen befinden.
Private IP
Clients, die sich mit einer privaten IP-Adresse verbinden, werden über eine Peering-Verbindung zwischen den VPCs geroutet, die den Client bzw. die Datenbankinstanz hosten. Obwohl es nicht spezifisch für PostgreSQL ist, ist es wichtig, die Netzwerkanforderungen zu überprüfen, um Verbindungsprobleme zu vermeiden. Ein Problem:Einmal aktiviert, kann die private IP-Funktion nicht mehr entfernt werden.
Von externen Anwendungen verbinden
Verbindungen von Anwendungen, die außerhalb der GCP gehostet werden, können und sollten verschlüsselt werden. Um die verschiedenen Angriffe zu vermeiden, müssen Client-Verbindungen und Anwendungen außerdem das bereitgestellte Client-Zertifikat installieren. Das Verfahren zum Generieren und Konfigurieren der Zertifikate ist etwas kompliziert und erfordert benutzerdefinierte Tools, um sicherzustellen, dass Zertifikate regelmäßig erneuert werden. Das mag einer der Gründe sein, warum Google die Möglichkeit bietet, den Cloud SQL Proxy zu verwenden.
Verbindung über Cloud SQL-Proxy herstellen
Die Einrichtung ist ziemlich einfach, was meiner Erfahrung nach bei allen Anweisungen in der Google Cloud SQL-Dokumentation der Fall ist. In diesem Zusammenhang ist das Einreichen von Dokumentationsfeedback kinderleicht, und die Screenshot-Funktion war eine Premiere für mich.
Es gibt mehrere Möglichkeiten, Proxy-Verbindungen zu autorisieren, und ich habe mich für die Konfiguration eines Dienstkontos entschieden, genau wie in der Cloud SQL-Proxy-Dokumentation beschrieben.
Sobald alles eingerichtet ist, ist es Zeit, den Proxy zu 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
Um eine Verbindung zur Remote-Instanz herzustellen, verwenden wir jetzt den Proxy, indem wir localhost anstelle der öffentlichen IP-Adresse der Instanz angeben:
~ $ 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.
Beachten Sie, dass es keine Verschlüsselung gibt, da wir uns lokal verbinden und der Proxy sich um die Verschlüsselung des in die Cloud fließenden Datenverkehrs kümmert.
Eine häufige DBA-Aufgabe ist das Anzeigen der Verbindungen zur Datenbank durch Abfragen von pg_stat_activity. Die Dokumentation besagt, dass Proxy-Verbindungen als „cloudsqlproxy~1.2.3.4“ angezeigt werden, also wollte ich diese Behauptung überprüfen. Ich habe zwei Sitzungen als Postgres geöffnet, eine über Proxy und die andere von meiner Privatadresse aus, also reicht die folgende Abfrage:
[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 |
Es scheint, dass die Proxy-Verbindungen stattdessen als client_port ==-1 und eine leere client_addr identifiziert werden. Dies kann zusätzlich bestätigt werden, indem die Zeitstempel für backend_start und das Proxy-Protokoll unten verglichen werden:
2019/07/14 21:25:37 New connection for "omiday:us-west1:s9s201907141919"
Hochverfügbarkeit von PostgreSQL in Google Cloud
Google Cloud SQL für PostgreSQL gewährleistet eine hohe Verfügbarkeit durch die Synchronisierung von Speicherdaten auf niedriger Ebene mithilfe regionaler nichtflüchtiger Speicher. Das Failover erfolgt automatisch, mit einem Heartbeat-Prüfintervall von einer Sekunde und einem Failover, das nach etwa 60 Sekunden ausgelöst wird.
Leistung und Überwachung
Der Leistungsabschnitt der Dokumentation weist auf allgemeine Cloud-Faustregeln hin:Halten Sie die Datenbank (sowohl Writer als auch Read Replicas) in der Nähe der Anwendung und skalieren Sie die Instanz vertikal. Was auffällt, ist die Empfehlung, eine Instanz mit mindestens 60 GB RAM bereitzustellen, wenn Leistung wichtig ist.
Stackdriver bietet Überwachung und Protokollierung sowie Zugriff auf PostgreSQL-Protokolle:
Zugriffskontrolle
Dies wird auf Projekt-, Instanz- und Datenbankebene implementiert.
Projektzugriffskontrolle
Projektzugriffssteuerung ist die Cloud-spezifische Zugriffssteuerung – sie verwendet das Konzept der IAM-Rollen, um Projektmitgliedern (Benutzern, Gruppen oder Dienstkonten) Zugriff auf verschiedene Cloud SQL-Ressourcen zu gewähren. Die Liste der Rollen ist einigermaßen selbsterklärend. Eine detaillierte Beschreibung jeder Rolle und der zugehörigen Berechtigungen finden Sie unter APIs Explorer oder Cloud SQL Admin API für eine der unterstützten Programmiersprachen.
Um zu demonstrieren, wie IAM-Rollen funktionieren, erstellen wir ein schreibgeschütztes Dienstkonto (Betrachter):
Starten Sie eine neue Proxy-Instanz auf Port 5433 mit dem Dienstkonto, das dem zugeordnet ist Zuschauerrolle:
~/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
Öffne eine psql-Verbindung zu 127.0.0.1:5433:
~ $ psql "user=postgres dbname=postgres password=postgres hostaddr=127.0.0.1 port=5433"
Der Befehl endet mit:
psql: server closed the connection unexpectedly
This probably means the server terminated abnormally
before or while processing the request.
Ups! Sehen wir uns die Proxy-Protokolle an:
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
Instanzzugriffskontrolle
Zugriff auf Instanzebene ist abhängig von der Verbindungsquelle:
Die Kombination von Autorisierungsmethoden ersetzt die allgegenwärtige pg_hba.conf.
Sicherung und Wiederherstellung
Standardmäßig sind automatische Sicherungen aktiviert:
Sicherungen wirken sich zwar nicht auf Lese- und Schreibvorgänge in der Datenbank aus, wirken sich aber auf die Leistung aus Daher wird empfohlen, Sicherungen in Zeiten geringerer Aktivität zu planen.
Für Redundanz können Backups in zwei Regionen gespeichert werden (zusätzliche Gebühren fallen an) mit der Option, benutzerdefinierte Speicherorte auszuwählen.
Um Speicherplatz zu sparen, verwenden Sie die Komprimierung. .gz-komprimierte Dateien werden transparent wiederhergestellt.
Cloud SQL unterstützt auch das Klonen von Instanzen. Für den kleinsten Datensatz dauerte der Vorgang etwa 3 Minuten:
Klonstartzeit 10:07:10:
Die PostgreSQL-Protokolle zeigen, dass PostgreSQL auf der geklonten Instanz um 10 verfügbar wurde:10:47:
Das ist immer noch ein einfacherer Weg als Sichern und Wiederherstellen, um eine Kopie zu erstellen einer Instanz zu Test-, Entwicklungs- oder Fehlerbehebungszwecken.
Best Practices für Google Cloud für PostgreSQL
- Konfigurieren Sie eine Aktivierungsrichtlinie für Instanzen, die nicht rund um die Uhr ausgeführt werden müssen.
- Platzieren Sie die Datenbankinstanz in derselben Zone oder Region wie die Compute Engine-Instanzen und App Engine-Anwendungen, um Netzwerklatenz zu vermeiden.
- Erstellen Sie die Datenbankinstanz in derselben Zone wie die Compute Engine. Wenn Sie einen anderen Verbindungstyp verwenden, akzeptieren Sie die Standardzone.
- Benutzer, die mit Cloud SQL erstellt wurden, sind standardmäßig Cloud-Superuser. Verwenden Sie PostgreSQL ALTER ROLE, um ihre Berechtigungen zu ändern.
- Verwenden Sie die neueste Cloud SQL Proxy-Version.
- Instanznamen sollten einen Zeitstempel enthalten, um den Namen beim Löschen und Neuerstellen von Instanzen wiederverwenden zu können.
- pg_dump schließt standardmäßig große Objekte ein. Wenn die Datenbank BLOB-s enthält, führen Sie den Speicherauszug in Zeiten geringer Aktivität durch, um zu verhindern, dass die Instanz nicht mehr reagiert.
- Verwenden Sie gcloud sql connect, um schnell eine Verbindung von einem externen Client herzustellen, ohne die IP-Adresse des Clients auf die weiße Liste setzen zu müssen.
- Abonnieren Sie die Ankündigungsgruppe, um Benachrichtigungen über Produktaktualisierungen und Warnungen wie Probleme beim Erstellen von Instanzen zu erhalten:
- Stellen Sie sicher, dass Anwendungen Verwaltungstechniken für Datenbankverbindungen implementieren.
- Instanzen, die länger als 90 Tage angehalten wurden, werden gelöscht, es sei denn, sie befinden sich nicht in einem angehaltenen Zustand.
- Führen Sie ein manuelles Failover durch, um das Anwendungsverhalten und die Länge der Ausfallzeit zu testen.
- Verwenden Sie die Standard-Engine-Version.
- Der Speicherplatz für Instanzen, die so konfiguriert sind, dass der Speicherplatz automatisch erhöht wird, wächst in Schritten von 25 GB. Da der Speicherplatz nicht zurückgewonnen werden kann, legen Sie eine Erhöhungsgrenze für die geschätzte Größe der Datenbank im nächsten Budgetzyklus fest und überwachen Sie außer Kontrolle geratene Abfragen,
- Verwenden Sie den „früheren“ Wartungszeitpunkt für Testinstanzen:
- Anwendungen sollten Live-Verbindungen und exponentielles Backoff verwenden, um nach einem Neustart der Instanz schnell wiederhergestellt zu werden.
- Anwendungen, die auf Lesereplikate angewiesen sind, sollten die Verwendung von 3 Replikaten in Betracht ziehen, um Probleme zu vermeiden, die durch den Ausfall regionaler persistenter Festplatten verursacht werden und dazu führen, dass beide Replikate nicht mehr verfügbar sind.
- Lesereplikate konfigurieren, um die Leseleistung zu verbessern.
- Ein Neustart der Instanz ist erforderlich, wenn die Liste der IP-Adressen aktualisiert wird, denen der Zugriff auf eine öffentliche Instanz gestattet ist, um bestehende Verbindungen zu trennen.
- Weitere Informationen finden Sie in der dedizierten StackOverflow Cloud SQL-Gruppe.
Start-Checkliste für Cloud SQL
Der Checklistenabschnitt in der Dokumentation bietet einen Überblick über empfohlene Aktivitäten beim Einrichten einer produktionsbereiten Cloud SQL for PostgreSQL-Instanz. Insbesondere müssen Anwendungen so konzipiert sein, dass sie Cloud SQL-Neustarts verarbeiten können. Auch wenn es keine Beschränkungen für Anfragen pro Sekunde gibt, gibt es Verbindungsbeschränkungen.
Unterstützung für PostgreSQL-GCP-Erweiterungen
Cloud SQL unterstützt die meisten PostgreSQL-Erweiterungen. Zum jetzigen Zeitpunkt gibt es von den 52 Community-Erweiterungen 22 nicht unterstützte Erweiterungen und 2 nicht unterstützte PostGIS-Erweiterungen.
postgis_raster
postgis_sfcgal
Für PostgreSQL-Erweiterungen können wir entweder das PostgreSQL-Contrib-Repository überprüfen oder besser die Ausgabe von pg_available_extensions vergleichen:
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
CloudSQL:
[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)
Nicht unterstützte Erweiterungen 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
Protokollierung
In Cloud SQL durchgeführte Vorgänge werden zusammen mit allen Details auf der Registerkarte "Aktivität" protokolliert. Beispiel für das Erstellen einer Instanz mit allen Instanzdetails:
PostgreSQL-Migration zur GCP
Um die Migration lokaler PostgreSQL-Installationen bereitzustellen, nutzt Google pgBouncer.
Beachten Sie, dass es keinen GCP Console-Assistenten für PostgreSQL-Migrationen gibt.
DBA aufgepasst!
Hohe Verfügbarkeit und Replikation
Ein Master-Knoten kann nicht auf eine Read Replica umschalten. Derselbe Abschnitt umreißt andere wichtige Aspekte von Read Replicas:
- kann jederzeit zum Patchen offline genommen werden
- folgen Sie nach einem Failover nicht dem Master-Knoten in einer anderen Zone – da die Replikation synchron ist, kann sich dies auf die Replikationsverzögerung auswirken
- Es gibt keinen Lastenausgleich zwischen Replikaten, d. h. es kann nicht auf einzelne Endpunktanwendungen verwiesen werden
- Die Größe der Replikatinstanz muss mindestens der Größe des Master-Knotens entsprechen
- keine regionsübergreifende Replikation
- Repliken können nicht gesichert werden
- Alle Replikate müssen gelöscht werden, bevor eine Masterinstanz aus einer Sicherung wiederhergestellt oder gelöscht werden kann
- kaskadierende Replikation ist nicht verfügbar
Benutzer
Standardmäßig ist der „Cloud-Superuser“ postgres, der Mitglied der Rolle „cloudsqlsuperuser“ ist. Der cloudqlsuperuser wiederum erbt die standardmäßigen PostgreSQL-Rollen:
[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} |
Beachten Sie, dass die Rollen SUPERUSER und REPLICATION nicht verfügbar sind.
Sicherung und Wiederherstellung
Backups können nicht exportiert werden.
Backups können nicht zum Upgraden einer Instanz verwendet werden, d. h. zum Wiederherstellen in einer anderen PostgreSQL-Engine.
Funktionen wie PITR, logische Replikation und JIT-Kompilierung sind nicht verfügbar. Funktionsanfragen können im Issue Tracker von Google eingereicht werden.
Verschlüsselung
Bei der Instanzerstellung wird SSL/TLS aktiviert, aber nicht erzwungen:
In diesem Modus kann eine Verschlüsselung angefordert werden, eine Zertifikatvalidierung ist jedoch nicht verfügbar.
~ $ 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.
Der Versuch, mit psql eine Verbindung zu einer SSL-erzwungenen Instanz herzustellen, gibt einen selbsterklärenden Fehler zurück:
~ $ psql "sslmode=require user=postgres dbname=postgres password=postgres hostaddr=35.233.149.65"
psql: FATAL: connection requires a valid client certificate
Speicherung
- Der Speicher kann nach der Instanzerstellung erhöht, aber nie verringert werden. Achten Sie also auf die Kosten, die mit dem wachsenden Speicherplatz verbunden sind, oder konfigurieren Sie das Erhöhungslimit.
- Der Speicherplatz ist auf 30 TB begrenzt.
Prozessor
Instanzen können mit weniger als einem Kern erstellt werden, die Option ist jedoch in der Cloud SQL-Konsole nicht verfügbar, da die Instanz erstellt werden muss, indem einer der Beispielmaschinentypen angegeben wird, in diesem Fall – Stufe:
Beispiel für das Erstellen einer Instanz mit gemeinsam genutztem Code mit gcloud in Cloud Shell:
Die Anzahl der CPUs ist auf 64 begrenzt, eine relativ niedrige Grenze für große Installationen, wenn man bedenkt, dass High-End-Server damals, als 9.2 Benchmarking durchgeführt wurde, mit 32 Kernen begannen.
Instanzstandorte
Multiregionaler Standort ist nur für Sicherungen verfügbar.
Zugriff über öffentliche IP
Standardmäßig ermöglicht der GCP Console-Assistent nur den Zugriff auf öffentliche IP-Adressen, der Zugriff wird jedoch verweigert, bis das Netzwerk des Clients konfiguriert ist:
Wartung
Updates können das Wartungsfenster überschreiten und Read Replicas werden jederzeit aktualisiert.
Die Dokumentation gibt nicht an, wie lange das Wartungsfenster dauert. Die Informationen werden beim Erstellen der Instanz bereitgestellt:
Änderungen an der CPU-Anzahl, der Speichergröße oder der Zone, in der sich die Instanz befindet Zum Auffinden muss die Datenbank einige Minuten lang offline sein.
Benutzer
Cloud SQL verwendet die Begriffe „Rolle“ und „Benutzer“ synonym.
Hohe Verfügbarkeit
Die Kosten in einer hochverfügbaren Konfiguration sind doppelt so hoch wie bei einer eigenständigen Instanz, und dazu gehört auch Speicherplatz.
Automatisches Failover wird etwa 60 Sekunden nachdem der primäre Knoten nicht mehr verfügbar ist initiiert. Laut dem MAA-Bericht von Oracle bedeutet dies einen Verlust von 5.800 US-Dollar pro Minute. Wenn man bedenkt, dass es 2 bis 3 Minuten dauert, bis die Anwendungen die Verbindung wieder herstellen können, verdoppelt sich der Ausfall auf das Dreifache. Außerdem scheint das Heartbeat-Intervall von 60 Sekunden keine konfigurierbare Option zu sein.
Replikation
Auf Read Replicas kann nicht über einen einzelnen Endpunkt zugegriffen werden, wobei jeder eine neue IP-Adresse erhält:
Regional persistent disks provide data redundancy at the cost of write performance.
Cloud SQL will not failover to read replicas, hence readers cannot be considered a high availability solution
External replicas and external masters are currently not supported.
Connecting to Instance
Google does not automatically renew the instance SSL certificates, however, both the initiation and rotation procedures can be automated.
If the application is built on the App Engine platform additional limits apply, such as 60 seconds for a database request to complete, 60 concurrent connections for PHP applications. The “App Engine Limits” section in Quotas and limits provides more details:
IP addresses in the range 172.17.0.0/16 are reserved.
Administration
Once started, operations cannot be canceled. Runaway queries can still be stopped by using the pg_terminate_backend and pg_cancel_backend PostgreSQL built-in functions.
A short demonstration using two psql sessions and starting a long running query in the second session:
[email protected]:5432 postgres> select now(); select pg_sleep(3600); select now();
now
-------------------------------
2019-07-16 02:08:18.739177+00
(1 row)
In the first session, cancel the long running query:
[email protected]:5432 postgres> select pid, client_addr, client_port, query, backend_start from pg_stat_activity where usename = 'postgres';
-[ RECORD 1 ]-+-------------------------------------------------------------------------------------------------------------
pid | 2182
client_addr | 173.180.222.170
client_port | 56208
query | select pid, client_addr, client_port, query, backend_start from pg_stat_activity where usename = 'postgres';
backend_start | 2019-07-16 01:57:34.99011+00
-[ RECORD 2 ]-+-------------------------------------------------------------------------------------------------------------
pid | 2263
client_addr | 173.180.222.170
client_port | 56276
query | select pg_sleep(3600);
backend_start | 2019-07-16 02:07:43.860829+00
[email protected]:5432 postgres> select pg_cancel_backend(2263); select now();
-[ RECORD 1 ]-----+--
pg_cancel_backend | t
-[ RECORD 1 ]----------------------
now | 2019-07-16 02:09:09.600399+00
Comparing the timestamps between the two sessions:
ERROR: canceling statement due to user request
now
-------------------------------
2019-07-16 02:09:09.602573+00
(1 row)
It’s a match!
While restarting an instance is a recommended method when attempting to resolve database instance issues, avoid restarting before the first restart completed.
Data Import and Export
CSV import/export is limited to one database.
Exporting data as an SQL dump that can be imported later, requires a custom pg_dump command.
To quote from the documentation:
pg_dump -U [USERNAME] --format=plain --no-owner --no-acl [DATABASE_NAME] \
| sed -E 's/(DROP|CREATE|COMMENT ON) EXTENSION/-- \1 EXTENSION/g' > [SQL_FILE].sql
Pricing
Charge Type | Instance ON | Instance OFF |
Storage | Yes | Yes |
Instance | No | Yes |
Troubleshooting
Logging
All actions are recorded and can be viewed under the Activity tab.
Resources
Review the Diagnosing Issues with Cloud SQL instances and Known issues sections in the documentation.
Fazit
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.