PostgreSQL
 sql >> Base de données >  >> RDS >> PostgreSQL

Analyse approfondie des fournisseurs de cloud :PostgreSQL sur Google Cloud Platform (GCP)

Par où commencer ?

Le meilleur endroit que j'ai pu trouver pour commencer n'était autre que la documentation officielle. Il existe également une chaîne Youtube GCP pour ceux qui préfèrent le multimédia. Une fois dans le monde de la documentation Cloud SQL, je me suis tourné vers Concepts, où l'on nous promet de "développer une compréhension approfondie" du produit.

Alors commençons !

Fonctionnalités PostgreSQL de Google Cloud

Google Cloud SQL pour PostgreSQL offre toutes les fonctionnalités standard que nous attendons d'une solution gérée :haute disponibilité avec basculement automatique, sauvegardes automatiques, chiffrement au repos et en transit, journalisation et surveillance avancées, et de bien sûr une API riche pour interagir avec tous les services.

Et pour un peu d'histoire, la prise en charge de PostgreSQL a commencé en mars 2017, jusqu'alors le seul moteur de base de données pris en charge était MySQL.

Cloud SQL exécute PostgreSQL sur la plate-forme informatique de deuxième génération de Google. La liste complète des fonctionnalités est disponible ici et également ici. En examinant le premier, il est évident qu'il n'y a jamais eu de plate-forme de première génération pour PostgreSQL.

Les bases de données exécutées sur la plate-forme de deuxième génération devraient fonctionner à des vitesses 7 fois plus rapides et bénéficier d'une capacité de stockage 20 fois supérieure. Le blog annonçant la plate-forme de deuxième génération entre dans les détails de l'exécution du test sysbench pour comparer Google Cloud SQL avec le principal concurrent AWS de l'époque dans les deux incarnations RDS et Aurora. Les résultats m'ont surpris car ils montrent que Cloud SQL fonctionne mieux alors que les récents tests effectués à l'aide d'AWS Benchmark publiés environ un an plus tard ont conclu le contraire. C'est à peu près au même moment que le support PostgreSQL était disponible. Bien que l'idée d'exécuter moi-même le benchmark me démange, je suppose qu'il y a deux facteurs potentiels qui auraient pu influencer les résultats :le benchmark sysbench de Google a utilisé différents paramètres et AWS a peut-être amélioré ses produits pendant cette période.

Compatibilité GCP PostgreSQL

Comme prévu, Google Cloud SQL pour PostgreSQL remplace quasiment la version communautaire et prend en charge tous les langages procéduraux SQL PL/pgSQL.

Certaines fonctionnalités ne sont pas disponibles pour des raisons de sécurité, par exemple l'accès SUPERUSER. D'autres fonctionnalités ont été supprimées en raison des risques potentiels posés à la stabilité et aux performances du produit. Enfin, certaines options et paramètres ne peuvent pas être modifiés, bien que les demandes de modification de ce comportement puissent être effectuées via le groupe de discussion Cloud SQL.

Cloud SQL est également compatible avec le protocole PostgreSQL.

En ce qui concerne l'isolation des transactions, Cloud SQL suit le comportement par défaut de PostgreSQL, en utilisant par défaut le niveau d'isolation en lecture validée.

Pour certains des paramètres de configuration du serveur, Cloud SQL implémente différentes plages pour des raisons non expliquées dans la documentation, ce qui reste important à retenir.

Mise en réseau

Il existe plusieurs façons de se connecter à la base de données, selon que l'instance se trouve sur un réseau privé ou sur un réseau public (applications se connectant depuis l'extérieur de GCP). Le point commun aux deux cas est le VPC prédéfini géré par Google où résident toutes les instances de base de données Cloud SQL.

IP privée

Les clients se connectant à une adresse IP privée sont acheminés via une connexion de peering entre les VPC hébergeant le client et respectivement l'instance de base de données. Bien que cela ne soit pas spécifique à PostgreSQL, il est important de revoir les exigences du réseau, afin d'éviter les problèmes de connexion. Un piège :une fois activée, la fonctionnalité d'adresse IP privée ne peut pas être supprimée.

Connexion à partir d'applications externes

Les connexions provenant d'applications hébergées en dehors de GCP peuvent et doivent être chiffrées. De plus, afin d'éviter les diverses attaques, les connexions client et l'application doivent installer le certificat client fourni. La procédure de génération et de configuration des certificats est quelque peu compliquée, nécessitant des outils personnalisés pour s'assurer que les certificats sont renouvelés périodiquement. C'est peut-être l'une des raisons pour lesquelles Google offre la possibilité d'utiliser le proxy Cloud SQL.

Se connecter à l'aide du proxy Cloud SQL

La configuration est assez simple, ce qui est en fait le cas pour toutes les instructions de la documentation Google Cloud SQL. Dans le même ordre d'idées, soumettre des commentaires sur la documentation est extrêmement simple et la fonction de capture d'écran était une première pour moi.

Il existe plusieurs façons d'autoriser les connexions proxy et j'ai choisi de configurer un compte de service, comme indiqué dans la documentation Cloud SQL Proxy.

Une fois que tout est en place, il est temps de démarrer le proxy :

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

Pour se connecter à l'instance distante, nous utilisons maintenant le proxy en spécifiant localhost au lieu de l'adresse IP publique de l'instance :

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

Notez qu'il n'y a pas de chiffrement puisque nous nous connectons localement et que le proxy se charge de chiffrer le trafic entrant dans le cloud.

Une tâche DBA courante consiste à afficher les connexions à la base de données en interrogeant pg_stat_activity. La documentation indique que les connexions proxy seront affichées en tant que cloudsqlproxy~1.2.3.4, je voulais donc vérifier cette affirmation. J'ai ouvert deux sessions en tant que postgres, une via proxy et l'autre depuis mon adresse personnelle, donc la requête suivante fera l'affaire :

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

Il semble que les connexions proxy soient plutôt identifiées comme client_port ==-1 et un client_addr vide. Cela peut également être confirmé en comparant les horodatages de backend_start et du journal proxy ci-dessous :

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

Haute disponibilité PostgreSQL sur Google Cloud

Google Cloud SQL pour PostgreSQL garantit une haute disponibilité grâce à la synchronisation des données de stockage de bas niveau au moyen de disques persistants régionaux. Le basculement est automatique, avec un intervalle de vérification des pulsations d'une seconde et un basculement déclenché après environ 60 secondes.

Performances et surveillance

La section Performances de la documentation indique les règles générales du cloud :conservez la base de données (réplicas en écriture et en lecture) à proximité de l'application et redimensionnez verticalement l'instance. Ce qui ressort, c'est la recommandation de provisionner une instance avec au moins 60 Go de RAM lorsque les performances sont importantes.

Stackdriver fournit une surveillance et une journalisation, ainsi qu'un accès aux journaux PostgreSQL :

Contrôle d'accès

Ceci est implémenté au niveau du projet, de l'instance et de la base de données.

Contrôle d'accès au projet

Le contrôle d'accès au projet est le contrôle d'accès spécifique au cloud :il utilise le concept de rôles IAM afin de permettre aux membres du projet (utilisateurs, groupes ou comptes de service) d'accéder à diverses ressources Cloud SQL. La liste des rôles est quelque peu explicite. Pour une description détaillée de chaque rôle et des autorisations associées, reportez-vous à l'explorateur d'API ou à l'API d'administration Cloud SQL pour l'un des langages de programmation pris en charge.

Pour démontrer le fonctionnement des rôles IAM, créons un compte de service en lecture seule (lecteur) :

Démarrez une nouvelle instance de proxy sur le port 5433 en utilisant le compte de service associé au rôle de spectateur :

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

Ouvrir une connexion psql vers 127.0.0.1:5433 :

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

La commande se termine par :

psql: server closed the connection unexpectedly

      This probably means the server terminated abnormally

      before or while processing the request.

Oups ! Vérifions les journaux du proxy :

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

Contrôle d'accès aux instances

L'accès au niveau de l'instance dépend de la source de connexion :

La combinaison de méthodes d'autorisation remplace l'omniprésent pg_hba.conf.

Sauvegarde et restauration

Par défaut, les sauvegardes automatiques sont activées :

Bien que les sauvegardes n'affectent pas les opérations de lecture et d'écriture de la base de données, elles ont un impact sur les performances et par conséquent, il est recommandé de planifier les sauvegardes pendant les périodes de faible activité.

Pour la redondance, les sauvegardes peuvent être stockées dans deux régions (des frais supplémentaires s'appliquent) avec la possibilité de sélectionner des emplacements personnalisés.

Afin d'économiser de l'espace de stockage, utilisez la compression. Les fichiers compressés .gz sont restaurés de manière transparente.

Cloud SQL prend également en charge le clonage d'instance. Pour le plus petit ensemble de données, l'opération a pris environ 3 minutes :

Heure de début du clonage 10:07:10 :

Les journaux PostgreSQL montrent que PostgreSQL est devenu disponible sur l'instance clonée à 10 :10:47 :

C'est toujours un moyen plus simple que la sauvegarde et la restauration, pour créer une copie d'une instance à des fins de test, de développement ou de dépannage.

Bonnes pratiques Google Cloud pour PostgreSQL

  • Configurez une règle d'activation pour les instances qui ne sont pas tenues de s'exécuter 24h/24 et 7j/7.
  • Placez l'instance de base de données dans la même zone ou région que les instances de moteur de calcul et les applications App Engine afin d'éviter la latence du réseau.
  • Créez l'instance de base de données dans la même zone que Compute Engine. Si vous utilisez un autre type de connexion, acceptez la zone par défaut.
  • Les utilisateurs créés à l'aide de Cloud SQL sont par défaut des super-utilisateurs du cloud. Utilisez PostgreSQL ALTER ROLE pour modifier leurs autorisations.
  • Utilisez la dernière version du proxy Cloud SQL.
  • Les noms d'instance doivent inclure un horodatage afin de pouvoir réutiliser le nom lors de la suppression et de la recréation d'instances.
  • pg_dump inclut par défaut les gros objets. Si la base de données contient des BLOB, effectuez le vidage pendant les périodes de faible activité pour éviter que l'instance ne réponde plus.
  • Utilisez gcloud sql connect pour vous connecter rapidement à partir d'un client externe sans avoir à ajouter l'adresse IP du client à la liste blanche.
  • Abonnez-vous au groupe d'annonces afin de recevoir des notifications sur les mises à jour de produits et des alertes telles que des problèmes lors de la création d'instances :
  • Assurez-vous que les applications mettent en œuvre des techniques de gestion des connexions à la base de données
  • Les instances arrêtées pendant plus de 90 jours seront supprimées, sauf si elles ne sont pas dans un état suspendu.
  • Effectuez un basculement manuel afin de tester le comportement de l'application et la durée des temps d'arrêt.
  • Utiliser la version du moteur par défaut.
  • L'espace de stockage pour les instances configurées pour augmenter automatiquement le stockage augmentera par incréments de 25 Go. Comme l'espace de stockage ne peut pas être récupéré, fixez une limite d'augmentation de la taille estimée de la base de données au cours du prochain cycle budgétaire et surveillez les requêtes incontrôlées,
  • Utilisez le calendrier de maintenance "antérieur" pour les instances de test :
  • Les applications doivent utiliser des connexions actives et une interruption exponentielle afin de récupérer rapidement après le redémarrage d'une instance.
  • Les applications reposant sur des instances dupliquées en lecture doivent envisager d'utiliser trois instances dupliquées afin d'éviter les problèmes causés par la défaillance des disques persistants régionaux entraînant l'indisponibilité des deux instances dupliquées.
  • Configurez des instances dupliquées en lecture afin d'améliorer les performances de lecture.
  • Le redémarrage de l'instance est requis lors de la mise à jour de la liste des adresses IP autorisées à accéder à une instance publique afin de déconnecter les connexions existantes.
  • Consultez le groupe dédié StackOverflow Cloud SQL pour plus d'informations.

Lancer la liste de contrôle pour Cloud SQL

La section Liste de contrôle de la documentation fournit un aperçu des activités recommandées lors de la configuration d'une instance Cloud SQL pour PostgreSQL prête pour la production. En particulier, les applications doivent être conçues pour gérer les redémarrages Cloud SQL. De plus, bien qu'il n'y ait pas de limite de requêtes par seconde, il existe des limites de connexion.

Prise en charge des extensions PostgreSQL GCP

Cloud SQL prend en charge la plupart des extensions PostgreSQL. A ce jour, sur 52 extensions communautaires, il y a 22 extensions non prises en charge et 2 extensions PostGIS non prises en charge.

postgis_raster

postgis_sfcgal

Pour les extensions PostgreSQL, nous pouvons soit consulter le référentiel contrib PostgreSQL, soit mieux, différencier la sortie de pg_available_extensions :

En amont :

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

Extensions non compatibles dans 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

Journalisation

Les opérations effectuées dans Cloud SQL sont consignées sous l'onglet "Activité" avec tous les détails. Exemple de création d'une instance, montrant tous les détails de l'instance :

Migration PostgreSQL vers GCP

Afin de fournir la migration des installations PostgreSQL sur site, Google tire parti de pgBouncer.

Notez qu'il n'y a pas d'assistant de console GCP pour les migrations PostgreSQL.

Attention administrateur de bases de données !

Haute disponibilité et réplication

Un nœud maître ne peut pas basculer vers un réplica en lecture. La même section décrit d'autres aspects importants des instances dupliquées en lecture :

  • peut être mis hors ligne à tout moment pour l'application de correctifs
  • ne suivez pas le nœud maître dans une autre zone suite à un basculement :la réplication étant synchrone, cela peut affecter le délai de réplication
  • il n'y a pas d'équilibrage de charge entre les répliques, en d'autres termes, aucune application de point de terminaison unique ne peut être dirigée vers
  • la taille de l'instance dupliquée doit être au moins égale à la taille du nœud maître
  • pas de réplication entre régions
  • les répliques ne peuvent pas être sauvegardées
  • tous les réplicas doivent être supprimés avant qu'une instance maître puisse être restaurée à partir d'une sauvegarde ou supprimée
  • la réplication en cascade n'est pas disponible

Utilisateurs

Par défaut, le "superutilisateur cloud" est postgres qui est membre du rôle cloudsqlsuperuser. À son tour, cloudsqlsuperuser hérite des rôles PostgreSQL par défaut :

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

Notez que les rôles SUPERUSER et REPLICATION ne sont pas disponibles.

Sauvegarde et restauration

Les sauvegardes ne peuvent pas être exportées.

Les sauvegardes ne peuvent pas être utilisées pour mettre à niveau une instance, c'est-à-dire la restaurer dans un autre moteur PostgreSQL.

Les fonctionnalités telles que PITR, la réplication logique et la compilation JIT ne sont pas disponibles. Les demandes de fonctionnalités peuvent être déposées dans l'outil de suivi des problèmes de Google.

Cryptage

Lors de la création de l'instance, SSL/TLS est activé mais pas appliqué :

Dans ce mode, le chiffrement peut être demandé, mais la validation du certificat n'est pas disponible.

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

Tenter de se connecter en utilisant psql à une instance SSL renverra une erreur explicite :

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

psql: FATAL:  connection requires a valid client certificate

Stockage

  • L'espace de stockage peut être augmenté après la création de l'instance, mais jamais diminué. Faites donc attention aux coûts associés à l'augmentation de l'espace de stockage ou configurez la limite d'augmentation.
  • L'espace de stockage est limité à 30 To.

CPU

Les instances peuvent être créées avec moins d'un cœur, cependant, l'option n'est pas disponible dans la console Cloud SQL, car l'instance doit être créée en spécifiant l'un des exemples de types de machines, dans ce cas :niveau :

Exemple de création d'une instance de code partagé à l'aide de gcloud dans Cloud Shell :

Le nombre de CPU est limité à 64, une limite relativement basse pour les gros installations, étant donné qu'à l'époque où la version 9.2 était évaluée, les serveurs haut de gamme commençaient à 32 cœurs.

Emplacements des instances

L'emplacement multirégional n'est disponible que pour les sauvegardes.

Accès via IP publique

Par défaut, l'assistant de console GCP n'autorise que l'accès aux adresses IP publiques, mais l'accès est refusé tant que le réseau du client n'est pas configuré :

Maintenance

Les mises à jour peuvent dépasser la fenêtre de maintenance et les répliques en lecture sont mises à jour à tout moment.

La documentation ne précise pas la durée de la fenêtre de maintenance. Les informations sont fournies lors de la création de l'instance :

Modifications du nombre de CPU, de la taille de la mémoire ou de la zone où se trouve l'instance localisé nécessite que la base de données soit hors ligne pendant plusieurs minutes.

Utilisateurs

Cloud SQL utilise indifféremment les termes "rôle" et "utilisateur".

Haute disponibilité

Le coût d'une configuration hautement disponible est le double de celui d'une instance autonome, et cela inclut le stockage.

Le basculement automatique est lancé environ 60 secondes après l'indisponibilité du nœud principal. Selon le rapport d'Oracle MAA, cela se traduit par une perte de 5 800 $ par minute. Considérant qu'il faut 2 à 3 minutes pour que les applications puissent reconnecter la panne double à triple. De plus, l'intervalle de pulsation de 60 secondes ne semble pas être une option configurable.

Réplication

Les réplicas en lecture ne sont pas accessibles à l'aide d'un seul point de terminaison, chacun recevant une nouvelle adresse IP :

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.

Conclusion

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.