PostgreSQL
 sql >> Datenbank >  >> RDS >> PostgreSQL

Cloud Vendor Deep Dive:PostgreSQL auf der Google Cloud Platform (GCP)

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.