sql >> Base de Datos >  >> RDS >> PostgreSQL

Análisis detallado de proveedores de la nube:PostgreSQL en Google Cloud Platform (GCP)

¿Por dónde empezar?

El mejor lugar que pude encontrar para comenzar no fue otro que la documentación oficial. También hay un canal de Youtube de GCP para aquellos que prefieren multimedia. Una vez que me encontré en el terreno de la documentación de Cloud SQL, recurrí a Conceptos, donde se nos promete "desarrollar una comprensión profunda" del producto.

¡Comencemos!

Características de PostgreSQL en la nube de Google

Google Cloud SQL para PostgreSQL ofrece todas las funciones estándar que esperaríamos de una solución administrada:alta disponibilidad con conmutación por error automática, copias de seguridad automáticas, encriptación en reposo y en tránsito, registro y supervisión avanzados, y de Por supuesto, una rica API para interactuar con todos los servicios.

Y para un poco de historia, el soporte de PostgreSQL comenzó en marzo de 2017, hasta ese momento el único motor de base de datos compatible era MySQL.

Cloud SQL ejecuta PostgreSQL en la plataforma informática de segunda generación de Google. La lista completa de características está disponible aquí y también aquí. Al revisar lo anterior, es evidente que nunca hubo una plataforma de primera generación para PostgreSQL.

Se espera que las bases de datos que se ejecutan en la plataforma de segunda generación funcionen a velocidades 7 veces más rápidas y se beneficien de una capacidad de almacenamiento 20 veces mayor. El blog que anuncia la plataforma de segunda generación entra en los detalles de la ejecución de la prueba sysbench para comparar Google Cloud SQL con el entonces principal competidor AWS en ambas encarnaciones RDS y Aurora. Los resultados me sorprendieron, ya que muestran que Cloud SQL funciona mejor, mientras que las pruebas recientes realizadas con AWS Benchmark publicadas aproximadamente un año después concluyeron lo contrario. Eso es casi al mismo tiempo que estaba disponible el soporte de PostgreSQL. Si bien me pica la idea de ejecutar el punto de referencia yo mismo, supongo que hay dos factores potenciales que podrían haber influido en los resultados:el punto de referencia sysbench de Google usó diferentes parámetros y es posible que AWS haya mejorado sus productos durante ese tiempo.

Compatibilidad con GCP PostgreSQL

Como era de esperar, Google Cloud SQL para PostgreSQL es casi un reemplazo directo de la versión comunitaria y es compatible con todos los lenguajes de procedimiento SQL PL/pgSQL.

Algunas funciones no están disponibles por razones de seguridad, por ejemplo, el acceso SUPERUSUARIO. Se eliminaron otras características debido a los riesgos potenciales que plantean para la estabilidad y el rendimiento del producto. Por último, algunas opciones y parámetros no se pueden cambiar, aunque las solicitudes para cambiar ese comportamiento se pueden realizar a través del grupo de discusión de Cloud SQL.

Cloud SQL también es compatible por cable con el protocolo PostgreSQL.

Cuando se trata del aislamiento de transacciones, Cloud SQL sigue el comportamiento predeterminado de PostgreSQL, con el nivel de aislamiento predeterminado de lectura confirmada.

Para algunos de los parámetros de configuración del servidor, Cloud SQL implementa diferentes rangos por motivos que no se explican en la documentación, lo que sigue siendo importante recordar.

Redes

Hay varias formas de conectarse a la base de datos, dependiendo de si la instancia se encuentra en una red privada o en una red pública (aplicaciones que se conectan desde fuera de GCP). Común a ambos casos es la VPC predefinida administrada por Google donde residen todas las instancias de la base de datos de Cloud SQL.

IP privada

Los clientes que se conectan a una dirección IP privada se enrutan a través de una conexión entre pares entre las VPC que alojan al cliente y, respectivamente, la instancia de la base de datos. Aunque no es específico de PostgreSQL, es importante revisar los requisitos de la red para evitar problemas de conexión. Un error:una vez habilitada, la capacidad de IP privada no se puede eliminar.

Conexión desde aplicaciones externas

Las conexiones de aplicaciones alojadas fuera de GCP pueden y deben cifrarse. Además, para evitar los diversos ataques, las conexiones de cliente y la aplicación deben instalar el certificado de cliente proporcionado. El procedimiento para generar y configurar los certificados es algo complicado, requiriendo herramientas personalizadas para asegurar que los certificados se renueven periódicamente. Esa puede ser una de las razones por las que Google ofrece la opción de usar el proxy de Cloud SQL.

Conexión mediante el proxy de Cloud SQL

La configuración es bastante sencilla y, de hecho, descubrí que es el caso de todas las instrucciones en la documentación de Google Cloud SQL. En una nota relacionada, enviar comentarios sobre la documentación es muy simple, y la función de captura de pantalla fue la primera para mí.

Hay varias formas de autorizar conexiones de proxy y elegí configurar una cuenta de servicio, tal como se describe en la documentación de Cloud SQL Proxy.

Una vez que todo esté en su lugar, es hora de iniciar el 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

Para conectarnos a la instancia remota, ahora estamos usando el proxy especificando localhost en lugar de la dirección IP pública de la instancia:

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

Tenga en cuenta que no hay encriptación ya que nos estamos conectando localmente y el proxy se encarga de encriptar el tráfico que fluye hacia la nube.

Una tarea común de DBA es ver las conexiones a la base de datos consultando pg_stat_activity. La documentación establece que las conexiones de proxy se mostrarán como cloudsqlproxy~1.2.3.4, por lo que quería verificar esa afirmación. He abierto dos sesiones como postgres, una a través de proxy y la otra desde mi domicilio, por lo que la siguiente consulta servirá:

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

Parece que las conexiones proxy se identifican como puerto_cliente ==-1 y una dirección_cliente vacía. Esto se puede confirmar adicionalmente comparando las marcas de tiempo para backend_start y el registro de proxy a continuación:

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

Alta disponibilidad de PostgreSQL en Google Cloud

Google Cloud SQL para PostgreSQL garantiza una alta disponibilidad mediante la sincronización de datos de almacenamiento de bajo nivel mediante discos persistentes regionales. La conmutación por error es automática, con un intervalo de verificación de latidos de un segundo y una conmutación por error activada después de unos 60 segundos.

Rendimiento y Monitoreo

La sección Rendimiento de la documentación señala las reglas generales de la nube:mantenga la base de datos (tanto las réplicas de escritura como las de lectura) cerca de la aplicación y escale verticalmente la instancia. Lo que destaca es la recomendación de aprovisionar una instancia con al menos 60 GB de RAM cuando el rendimiento es importante.

Stackdriver proporciona monitoreo y registro, así como acceso a los registros de PostgreSQL:

Control de acceso

Esto se implementa a nivel de proyecto, instancia y base de datos.

Control de acceso a proyectos

El control de acceso del proyecto es el control de acceso específico de la nube:utiliza el concepto de roles de IAM para permitir que los miembros del proyecto (usuarios, grupos o cuentas de servicio) accedan a varios recursos de Cloud SQL. La lista de funciones se explica por sí misma; para obtener una descripción detallada de cada función y los permisos asociados, consulte el Explorador de API o la API de administración de Cloud SQL para uno de los lenguajes de programación admitidos.

Para demostrar cómo funcionan los roles de IAM, creemos una cuenta de servicio de solo lectura (espectador):

Inicie una nueva instancia de proxy en el puerto 5433 utilizando la cuenta de servicio asociada con el rol de espectador:

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

Abrir una conexión psql a 127.0.0.1:5433:

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

El comando sale con:

psql: server closed the connection unexpectedly

      This probably means the server terminated abnormally

      before or while processing the request.

¡Ups! Revisemos los registros del 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

Control de acceso a instancias

El acceso a nivel de instancia depende de la fuente de conexión:

La combinación de métodos de autorización reemplaza al omnipresente pg_hba.conf.

Copia de seguridad y recuperación

Por defecto, las copias de seguridad automáticas están habilitadas:

Si bien las copias de seguridad no afectan las operaciones de lectura y escritura de la base de datos, sí afectan el rendimiento y, por lo tanto, se recomienda que las copias de seguridad se programen durante los períodos de menor actividad.

Para redundancia, las copias de seguridad se pueden almacenar en dos regiones (se aplican cargos adicionales) con la opción de seleccionar ubicaciones personalizadas.

Para ahorrar espacio de almacenamiento, utilice la compresión. Los archivos comprimidos .gz se restauran de forma transparente.

Cloud SQL también admite la clonación de instancias. Para el conjunto de datos más pequeño, la operación tomó alrededor de 3 minutos:

Hora de inicio de la clonación 10:07:10:

Los registros de PostgreSQL muestran que PostgreSQL estuvo disponible en la instancia clonada a las 10:10:47:

Esa sigue siendo una forma más fácil que la copia de seguridad y restauración, para crear una copia de una instancia con fines de prueba, desarrollo o resolución de problemas.

Prácticas recomendadas de Google Cloud para PostgreSQL

  • Configure una política de activación para las instancias que no se requieren para ejecutarse las 24 horas del día, los 7 días de la semana.
  • Coloca la instancia de la base de datos en la misma zona o región con las instancias del motor de cómputo y las aplicaciones de App Engine para evitar la latencia de la red.
  • Cree la instancia de la base de datos en la misma zona que Compute Engine. Si utiliza cualquier otro tipo de conexión, acepte la zona predeterminada.
  • Los usuarios creados con Cloud SQL son, de forma predeterminada, superusuarios de la nube. Use PostgreSQL ALTER ROLE para modificar sus permisos.
  • Use la última versión del proxy de Cloud SQL.
  • Los nombres de las instancias deben incluir una marca de tiempo para poder reutilizar el nombre al eliminar y volver a crear instancias.
  • pg_dump por defecto incluye objetos grandes. Si la base de datos contiene BLOB-s, realice el volcado durante los períodos de baja actividad para evitar que la instancia deje de responder.
  • Use gcloud sql connect para conectarse rápidamente desde un cliente externo sin necesidad de incluir en la lista blanca la dirección IP del cliente.
  • Suscríbase al grupo de anuncios para recibir notificaciones sobre actualizaciones de productos y alertas, como problemas al crear instancias:
  • Asegúrese de que las aplicaciones implementen técnicas de administración de conexiones de bases de datos.
  • Las instancias detenidas durante más de 90 días se eliminarán a menos que no estén en estado de suspensión.
  • Realice una conmutación por error manual para probar el comportamiento de la aplicación y la duración del tiempo de inactividad.
  • Utilice la versión de motor predeterminada.
  • El espacio de almacenamiento para instancias configuradas para aumentar automáticamente el almacenamiento crecerá en incrementos de 25 GB. Como el espacio de almacenamiento no se puede recuperar, establezca un límite de aumento del tamaño estimado de la base de datos durante el próximo ciclo presupuestario y controle las consultas fuera de control,
  • Utilice el tiempo de mantenimiento "anterior" para las instancias de prueba:
  • Las aplicaciones deben usar conexiones vivas y retroceso exponencial para recuperarse rápidamente después de reiniciar una instancia.
  • La aplicación que depende de réplicas de lectura debe considerar el uso de 3 réplicas para evitar problemas causados ​​por fallas en los discos persistentes regionales que hacen que ambas réplicas dejen de estar disponibles.
  • Configure réplicas de lectura para mejorar el rendimiento de lectura.
  • Se requiere reiniciar la instancia al actualizar la lista de direcciones IP autorizadas para acceder a una instancia pública para desconectar las conexiones existentes.
  • Revise el grupo dedicado StackOverflow Cloud SQL para obtener información adicional.

Lista de verificación de lanzamiento para Cloud SQL

La sección de la lista de verificación en la documentación proporciona una descripción general de las actividades recomendadas al configurar una instancia de Cloud SQL para PostgreSQL lista para producción. En particular, las aplicaciones deben estar diseñadas para manejar los reinicios de Cloud SQL. Además, aunque no hay límites de consultas por segundo, hay límites de conexión.

Compatibilidad con extensiones GCP de PostgreSQL

Cloud SQL es compatible con la mayoría de las extensiones de PostgreSQL. A partir de este escrito, de 52 extensiones comunitarias, hay 22 extensiones no admitidas y 2 extensiones PostGIS no admitidas.

postgis_raster

postgis_sfcgal

Para las extensiones de PostgreSQL, podemos revisar el repositorio de contribuciones de PostgreSQL, o mejor, comparar la salida de pg_available_extensions:

Arriba:

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

Extensiones no admitidas en 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

Registro

Las operaciones realizadas dentro de Cloud SQL se registran en la pestaña Actividad junto con todos los detalles. Ejemplo de la creación de una instancia, que muestra todos los detalles de la instancia:

Migración de PostgreSQL a GCP

Para proporcionar la migración de las instalaciones locales de PostgreSQL, Google aprovecha pgBouncer.

Tenga en cuenta que no hay un asistente de GCP Console para las migraciones de PostgreSQL.

DBA ¡Cuidado!

Alta disponibilidad y replicación

Un nodo maestro no puede conmutar por error a una réplica de lectura. La misma sección describe otros aspectos importantes de las réplicas de lectura:

  • se puede desconectar en cualquier momento para aplicar parches
  • no siga el nodo maestro en otra zona después de una conmutación por error; dado que la replicación es síncrona, esto puede afectar el retraso de la replicación
  • no hay equilibrio de carga entre las réplicas, en otras palabras, no se puede apuntar a ninguna aplicación de punto final único
  • el tamaño de la instancia de réplica debe ser al menos el tamaño del nodo maestro
  • sin replicación entre regiones
  • no se pueden hacer copias de seguridad de las réplicas
  • todas las réplicas deben eliminarse antes de que una instancia maestra pueda restaurarse a partir de una copia de seguridad o eliminarse
  • la replicación en cascada no está disponible

Usuarios

De forma predeterminada, el "superusuario de la nube" es postgres, que es miembro del rol de superusuario de cloudsql. A su vez, cloudsqlsuperuser hereda las funciones predeterminadas de PostgreSQL:

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

Tenga en cuenta que los roles SUPERUSUARIO y REPLICACIÓN no están disponibles.

Copia de seguridad y recuperación

Las copias de seguridad no se pueden exportar.

Las copias de seguridad no se pueden usar para actualizar una instancia, es decir, restaurar en un motor PostgreSQL diferente.

Características como PITR, replicación lógica y compilación JIT no están disponibles. Las solicitudes de funciones se pueden archivar en el Rastreador de problemas de Google.

Cifrado

En la creación de la instancia, SSL/TLS está habilitado pero no se aplica:

En este modo se puede solicitar el cifrado, sin embargo, la validación del certificado no está 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.

Intentar conectarse usando psql a una instancia forzada de SSL devolverá un error que se explica por sí mismo:

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

psql: FATAL:  connection requires a valid client certificate

Almacenamiento

  • El almacenamiento se puede aumentar después de la creación de la instancia, pero nunca disminuir, así que tenga cuidado con los costos asociados con el aumento del espacio de almacenamiento o configure el límite de aumento.
  • El almacenamiento está limitado a 30 TB.

CPU

Las instancias se pueden crear con menos de un núcleo; sin embargo, la opción no está disponible en Cloud SQL Console, ya que la instancia debe crearse especificando uno de los tipos de máquinas de muestra, en este caso:nivel:

Ejemplo de creación de una instancia de código compartido con gcloud dentro de Cloud Shell:

La cantidad de CPU está limitada a 64, un límite relativamente bajo para grandes instalaciones, teniendo en cuenta que cuando se comparó la versión 9.2, los servidores de gama alta comenzaron con 32 núcleos.

Ubicaciones de instancias

La ubicación multirregional solo está disponible para copias de seguridad.

Acceso a través de IP Pública

De forma predeterminada, el asistente de GCP Console solo permite el acceso a la dirección IP pública; sin embargo, se deniega el acceso hasta que se configure la red del cliente:

Mantenimiento

Las actualizaciones pueden exceder la ventana de mantenimiento y las réplicas de lectura se actualizan en cualquier momento.

La documentación no especifica cuánto dura la ventana de mantenimiento. La información se proporciona al crear la instancia:

Cambios en el recuento de CPU, el tamaño de la memoria o la zona donde se encuentra la instancia localizado requiere que la base de datos esté fuera de línea durante varios minutos.

Usuarios

Cloud SQL usa los términos "función" y "usuario" indistintamente.

Alta disponibilidad

El costo en una configuración de alta disponibilidad es el doble de la instancia independiente y eso incluye el almacenamiento.

La conmutación por error automática se inicia después de unos 60 segundos después de que el nodo principal deja de estar disponible. Según el informe Oracle MAA, esto se traduce en una pérdida de $5800 por minuto. Teniendo en cuenta que toma de 2 a 3 minutos hasta que las aplicaciones puedan volver a conectar el corte se duplica a triple. Además, el intervalo de latidos de 60 segundos no parece ser una opción configurable.

Replicación

No se puede acceder a las réplicas de lectura utilizando un solo punto final, cada una de las cuales recibe una nueva dirección IP:

Los discos persistentes regionales brindan redundancia de datos a costa del rendimiento de escritura.

Cloud SQL no conmutará por error para leer réplicas, por lo tanto, los lectores no pueden considerarse una solución de alta disponibilidad

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.

Conclusión

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.