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

Inmersión profunda del proveedor de la nube:PostgreSQL en Microsoft Azure

Si ha seguido a Microsoft últimamente, no le sorprenderá que el proveedor de un producto de base de datos de la competencia, a saber, SQL Server, también se subiera al tren de PostgreSQL. Desde la liberación de 60 000 patentes a OIN hasta ser patrocinador Platino en PGCon, Microsoft como una de las organizaciones de respaldo corporativo de PostgreSQL. Aprovechó todas las oportunidades para demostrar que no solo puede ejecutar PostgreSQL en Microsoft, sino que también es cierto lo contrario:Microsoft, a través de su oferta en la nube, puede ejecutar PostgreSQL por usted. La declaración se hizo aún más clara con la adquisición de Citus Data y el lanzamiento de su producto estrella en Azure Cloud bajo el nombre de Hiperescala. Es seguro decir que la adopción de PostgreSQL está creciendo y ahora hay aún más buenas razones para elegirlo.

Mi viaje a través de la nube de Azure comenzó justo en la página de inicio donde me encuentro con los contendientes:servidor único y una versión preliminar (en otras palabras, sin SLA proporcionado) de Hiperescala (Citus). Este blog se centrará en el primero. Durante este viaje, tuve la oportunidad de practicar de qué se trata el código abierto (retribuir a la comunidad), en este caso, proporcionando comentarios a la documentación que, para crédito de Microsoft, hacen que esto sea muy fácil al canalizar los comentarios directamente. en Github:

Compatibilidad de PostgreSQL con Azure

Versionado

Según la documentación del producto, Single Server tiene como objetivo las versiones de PostgreSQL en el rango principal n-2:

Como solución diseñada para el rendimiento, se recomienda un servidor único para conjuntos de datos de 100 GB y más grande Los servidores brindaron un rendimiento predecible:las instancias de la base de datos vienen con una cantidad predefinida de núcleos virtuales e IOPS (según el tamaño del almacenamiento aprovisionado).

Extensiones

Hay una buena cantidad de Extensiones admitidas y algunas de ellas se instalan de fábrica:

[email protected]:5432 postgres> select name, default_version, installed_version from pg_available_extensions where name !~ '^postgis' order by name;

            name             | default_version | installed_version

------------------------------+-----------------+-------------------

address_standardizer         | 2.4.3 |

address_standardizer_data_us | 2.4.3           |

btree_gin                    | 1.2 |

btree_gist                   | 1.5 |

chkpass                      | 1.0 |

citext                       | 1.4 |

cube                         | 1.2 |

dblink                       | 1.2 |

dict_int                     | 1.0 |

earthdistance                | 1.1 |

fuzzystrmatch                | 1.1 |

hstore                       | 1.4 |

hypopg                       | 1.1.1 |

intarray                     | 1.2 |

isn                          | 1.1 |

ltree                        | 1.1 |

orafce                       | 3.7 |

pg_buffercache               | 1.3 | 1.3

pg_partman                   | 2.6.3 |

pg_prewarm                   | 1.1 |

pg_qs                        | 1.1 |

pg_stat_statements           | 1.6 | 1.6

pg_trgm                      | 1.3 |

pg_wait_sampling             | 1.1 |

pgcrypto                     | 1.3 |

pgrouting                    | 2.5.2 |

pgrowlocks                   | 1.2 |

pgstattuple                  | 1.5 |

plpgsql                      | 1.0 | 1.0

plv8                         | 2.1.0 |

postgres_fdw                 | 1.0 |

tablefunc                    | 1.0 |

timescaledb                  | 1.1.1 |

unaccent                     | 1.1 |

uuid-ossp                    | 1.1 |

(35 rows)

Supervisión de PostgreSQL en Azure

La supervisión del servidor se basa en un conjunto de métricas que se pueden agrupar perfectamente para crear un panel personalizado:

Quienes estén familiarizados con Graphviz o Blockdiag probablemente apreciarán la opción de exportar el todo el tablero a un archivo JSON:

Además, las métricas pueden, y deben, vincularse a alertas:

Las estadísticas de consulta se pueden rastrear mediante Query Store y visualizar con Query Performance Percepción. Para ello, será necesario habilitar un par de parámetros específicos de Azure:

[email protected]:5432 postgres> select * from pg_settings where name ~ 'pgms_wait_sampling.query_capture_mode|pg_qs.query_capture_mode';

-[ RECORD 1 ]---+------------------------------------------------------------------------------------------------------------------

name            | pg_qs.query_capture_mode

setting         | top

unit            |

category        | Customized Options

short_desc      | Selects which statements are tracked by pg_qs. Need to reload the config to make change take effect.

extra_desc      |

context         | superuser

vartype         | enum

source          | configuration file

min_val         |

max_val         |

enumvals        | {none,top,all}

boot_val        | none

reset_val       | top

sourcefile      |

sourceline      |

pending_restart | f

-[ RECORD 2 ]---+------------------------------------------------------------------------------------------------------------------

name            | pgms_wait_sampling.query_capture_mode

setting         | all

unit            |

category        | Customized Options

short_desc      | Selects types of wait events are tracked by this extension. Need to reload the config to make change take effect.

extra_desc      |

context         | superuser

vartype         | enum

source          | configuration file

min_val         |

max_val         |

enumvals        | {none,all}

boot_val        | none

reset_val       | all

sourcefile      |

sourceline      |

pending_restart | f

Para visualizar las consultas y esperas lentas procedemos al widget de Rendimiento de consultas:

Consultas de ejecución prolongada

Estadísticas de espera

Inicio de sesión de PostgreSQL en Azure

Los registros estándar de PostgreSQL se pueden descargar o exportar a Log Analytics para un análisis más avanzado:

Rendimiento y escalado de PostgreSQL con Azure

Si bien la cantidad de núcleos virtuales se puede aumentar o disminuir fácilmente, esta acción desencadenará un reinicio del servidor:

Para lograr un tiempo de inactividad cero, las aplicaciones deben poder manejar correctamente los errores transitorios .

Para consultas de ajuste, Azure proporciona al DBA recomendaciones de rendimiento, además de las extensiones pg_statements y pg_buffercache precargadas:

Alta disponibilidad y replicación en Azure

La alta disponibilidad del servidor de base de datos se logra mediante una replicación de hardware basada en nodos. Esto garantiza que, en caso de falla del hardware, se pueda iniciar un nuevo nodo en decenas de segundos.

Azure proporciona una puerta de enlace redundante como punto final de conexión de red para todos los servidores de bases de datos dentro de una región.

Seguridad PostgreSQL en Azure

Por defecto, las reglas del cortafuegos niegan el acceso a la instancia de PostgreSQL. Dado que un servidor de base de datos de Azure es el equivalente a un clúster de base de datos, las reglas de acceso se aplicarán a todas las bases de datos alojadas en el servidor.

Además de las direcciones IP, las reglas de firewall pueden hacer referencia a la red virtual, una función disponible solo para los niveles de uso general y memoria optimizada.

Una cosa que encontré peculiar en la interfaz web del firewall:no podía navegar fuera de la página mientras se guardaban los cambios:

Los datos en reposo se cifran mediante una clave administrada por el servidor y los usuarios de la nube no pueden deshabilite el cifrado. Los datos en tránsito también están encriptados:el SSL requerido solo se puede cambiar después de crear el servidor de la base de datos. Al igual que los datos en reposo, las copias de seguridad se cifran y el cifrado no se puede desactivar.

Advanced Threat Protection proporciona alertas y recomendaciones sobre una serie de solicitudes de acceso a la base de datos que se consideran un riesgo de seguridad. La función se encuentra actualmente en versión preliminar. Para demostrarlo, simulé un ataque de fuerza bruta de contraseña:

~ $ while : ; do psql -U $(pwgen -s 20 1)@pg10 ; sleep 0.1 ; done

psql: FATAL:  password authentication failed for user "AApT6z4xUzpynJwiNAYf"

psql: FATAL:  password authentication failed for user "gaNeW8VSIflkdnNZSpNV"

psql: FATAL:  password authentication failed for user "SWZnY7wGTxdLTLcbqnUW"

psql: FATAL:  password authentication failed for user "BVH2SC12m9js9vZHcuBd"

psql: FATAL:  password authentication failed for user "um9kqUxPIxeQrzWQXr2v"

psql: FATAL:  password authentication failed for user "8BGXyg3KHF3Eq3yHpik1"

psql: FATAL:  password authentication failed for user "5LsVrtBjcewd77Q4kaj1"

....

Verifique los registros de PostgreSQL:

2019-08-19 07:13:50 UTC-5d5a4c2e.138-FATAL:  password authentication failed

for user "AApT6z4xUzpynJwiNAYf"

2019-08-19 07:13:50 UTC-5d5a4c2e.138-DETAIL:  Role "AApT6z4xUzpynJwiNAYf" does not exist.

   Connection matched pg_hba.conf line 3: "host all all 173.180.222.170/32 password"

2019-08-19 07:13:51 UTC-5d5a4c2f.13c-LOG:  connection received: host=173.180.222.170 port=27248 pid=316

2019-08-19 07:13:51 UTC-5d5a4c2f.13c-FATAL:  password authentication failed for user "gaNeW8VSIflkdnNZSpNV"

2019-08-19 07:13:51 UTC-5d5a4c2f.13c-DETAIL:  Role "gaNeW8VSIflkdnNZSpNV" does not exist.

   Connection matched pg_hba.conf line 3: "host all all 173.180.222.170/32 password"

2019-08-19 07:13:52 UTC-5d5a4c30.140-LOG:  connection received: host=173.180.222.170 port=58256 pid=320

2019-08-19 07:13:52 UTC-5d5a4c30.140-FATAL:  password authentication failed for user "SWZnY7wGTxdLTLcbqnUW"

2019-08-19 07:13:52 UTC-5d5a4c30.140-DETAIL:  Role "SWZnY7wGTxdLTLcbqnUW" does not exist.

   Connection matched pg_hba.conf line 3: "host all all 173.180.222.170/32 password"

2019-08-19 07:13:53 UTC-5d5a4c31.148-LOG:  connection received: host=173.180.222.170 port=32984 pid=328

2019-08-19 07:13:53 UTC-5d5a4c31.148-FATAL:  password authentication failed for user "BVH2SC12m9js9vZHcuBd"

2019-08-19 07:13:53 UTC-5d5a4c31.148-DETAIL:  Role "BVH2SC12m9js9vZHcuBd" does not exist.

   Connection matched pg_hba.conf line 3: "host all all 173.180.222.170/32 password"

2019-08-19 07:13:53 UTC-5d5a4c31.14c-LOG:  connection received: host=173.180.222.170 port=43384 pid=332

2019-08-19 07:13:54 UTC-5d5a4c31.14c-FATAL:  password authentication failed for user "um9kqUxPIxeQrzWQXr2v"

2019-08-19 07:13:54 UTC-5d5a4c31.14c-DETAIL:  Role "um9kqUxPIxeQrzWQXr2v" does not exist.

   Connection matched pg_hba.conf line 3: "host all all 173.180.222.170/32 password"

2019-08-19 07:13:54 UTC-5d5a4c32.150-LOG:  connection received: host=173.180.222.170 port=27672 pid=336

2019-08-19 07:13:54 UTC-5d5a4c32.150-FATAL:  password authentication failed for user "8BGXyg3KHF3Eq3yHpik1"

2019-08-19 07:13:54 UTC-5d5a4c32.150-DETAIL:  Role "8BGXyg3KHF3Eq3yHpik1" does not exist.

   Connection matched pg_hba.conf line 3: "host all all 173.180.222.170/32 password"

2019-08-19 07:13:55 UTC-5d5a4c33.154-LOG:  connection received: host=173.180.222.170 port=12712 pid=340

2019-08-19 07:13:55 UTC-5d5a4c33.154-FATAL:  password authentication failed for user "5LsVrtBjcewd77Q4kaj1"

2019-08-19 07:13:55 UTC-5d5a4c33.154-DETAIL:  Role "5LsVrtBjcewd77Q4kaj1" does not exist.

La alerta por correo electrónico llegó unos 30 minutos después:

Para permitir un acceso detallado al servidor de la base de datos, Azure proporciona RBAC, que es una característica de control de acceso nativo de la nube, solo una herramienta más en el arsenal del DBA de PostgreSQL Cloud. Esto es lo más cerca que podemos llegar a las omnipresentes reglas de acceso pg_hba.

Copia de seguridad y recuperación de PostgreSQL en Azure

Independientemente de los niveles de precios, las copias de seguridad se conservan entre 7 y 35 días. El nivel de precios también influye en la capacidad de restaurar datos.

La recuperación en un momento dado está disponible a través de Azure Portal o la CLI y, de acuerdo con la documentación, es tan granular como hasta cinco minutos. La funcionalidad del portal es bastante limitada:el widget del selector de fechas muestra ciegamente los últimos 7 días como fechas posibles para seleccionar, aunque creé el servidor hoy. Además, no se realiza ninguna verificación en el tiempo objetivo de recuperación. Esperaba que ingresar un valor fuera del intervalo de recuperación generara un error que impidiera que el asistente continuara:

Una vez que se inicia el proceso de restauración, aparece un error, supuestamente causado por la salida del valor del rango, aparecerá aproximadamente un minuto después:

…pero, desafortunadamente, el mensaje de error no fue muy útil:

Por último, el almacenamiento de respaldo es gratuito para períodos de retención de hasta 7 días. Eso podría resultar extremadamente útil para los entornos de desarrollo.

Consejos y sugerencias

Límites

Acostúmbrese a los límites de servidor único.

Conectividad

Use siempre la cadena de conexión para que la conexión se enrute al servidor de base de datos correcto.

Replicación

Para escenarios de recuperación ante desastres, ubique réplicas de lectura en una de las regiones emparejadas.

Funciones

Al igual que en el caso de AWS y GCloud, no hay acceso de superusuario.

GUC

Los parámetros que requieren un reinicio del servidor o acceso de superusuario no se pueden configurar.

Escalado

Durante el escalado automático, las aplicaciones deben volver a intentarlo hasta que aparezca el nuevo nodo.

No se puede especificar la cantidad de memoria ni las IOPS:la memoria se asigna en unidades de GB por núcleo virtual, hasta un máximo de 320 GB (32 núcleos virtuales x 10 GB), y las IOPS dependen del tamaño del almacenamiento aprovisionado para un máximo de 6000 IOPS. En este momento, Azure ofrece una gran opción de vista previa de almacenamiento con un máximo de 20 000 IOPS.

Los servidores creados en el nivel Básico no se pueden actualizar a Uso general ni Optimizado para memoria.

Almacenamiento

Asegúrese de que la función de crecimiento automático esté habilitada:si la cantidad de datos supera el espacio de almacenamiento aprovisionado, la base de datos entrará en modo de solo lectura.

El almacenamiento solo se puede ampliar. Al igual que con todos los demás proveedores de la nube, la asignación de almacenamiento no se puede reducir y no pude encontrar ninguna explicación. Dado el equipo de última generación que los grandes jugadores de la nube pueden permitirse, no debería haber ninguna razón para no proporcionar funciones similares a la reubicación de datos en línea de LVM. El almacenamiento es realmente barato hoy en día, realmente no hay razón para pensar en reducir la escala hasta la próxima actualización de la versión principal.

Cortafuegos

En algunos casos, las actualizaciones de las reglas del cortafuegos pueden tardar hasta cinco minutos en propagarse.

Un servidor está ubicado en la misma subred que los servidores de aplicaciones no estarán accesibles hasta que se implementen las reglas de firewall apropiadas.

Las reglas de red virtual no permiten el acceso entre regiones y, como resultado, dblink y postgres_fdw no se pueden usar para conectarse a bases de datos fuera de la nube de Azure.

El enfoque de red virtual/subred no se puede aplicar a aplicaciones web ya que sus conexiones se originan en direcciones IP públicas.

Las redes virtuales grandes no estarán disponibles mientras los extremos del servicio estén habilitados.

Cifrado

Para aplicaciones que requieren validación de certificado de servidor, el archivo está disponible para descargar desde Digicert. Microsoft lo hizo fácil y no debería tener que preocuparse por la renovación hasta 2025:

~ $ openssl x509 -in BaltimoreCyberTrustRoot.crt.pem -noout -dates

notBefore=May 12 18:46:00 2000 GMT

notAfter=May 12 23:59:00 2025 GMT

Sistema de detección de intrusos

La versión preliminar de Advanced Threat Protection no está disponible para las instancias de nivel básico.

Copia de seguridad y restauración

Para las aplicaciones que no pueden permitirse el tiempo de inactividad de una región, considere configurar el servidor con almacenamiento de respaldo con redundancia geográfica. Esta opción solo se puede habilitar en el momento de crear el servidor de base de datos.

El requisito de reconfigurar las reglas del cortafuegos en la nube después de una operación PITR es particularmente importante.

Al eliminar un servidor de base de datos, se eliminan todas las copias de seguridad.

Después de la restauración, hay ciertas tareas posteriores a la restauración que deberán realizarse.

Las tablas no registradas se recomiendan para inserciones masivas con el fin de aumentar el rendimiento; sin embargo, no se replican.

Monitoreo

Las métricas se registran cada minuto y se almacenan durante 30 días.

Registro

Query Store es una opción global, lo que significa que se aplica a todas las bases de datos. Las transacciones de solo lectura y las consultas de más de 6000 bytes son problemáticas. De forma predeterminada, las consultas capturadas se conservan durante 7 días.

Rendimiento

Las recomendaciones de Query Performance Insight actualmente se limitan a crear y eliminar índices.

Deshabilitar pg_stat_staements cuando no sea necesario.

Reemplace uuid_generate_v4 con gen_random_uuid(). Esto está en línea con la recomendación en la documentación oficial de PostgreSQL, consulte Creación de uuid-ossp.

Alta disponibilidad y replicación

Hay un límite de cinco réplicas de lectura. Las aplicaciones de escritura intensiva deben evitar el uso de réplicas de lectura, ya que el mecanismo de replicación es asíncrono, lo que introduce algunos retrasos que las aplicaciones deben poder tolerar. Las réplicas de lectura se pueden ubicar en una región diferente.

La compatibilidad con REPLICA solo se puede habilitar después de crear el servidor. La característica requiere un reinicio del servidor:

Las réplicas de lectura no heredan las reglas de firewall del nodo maestro:

La conmutación por error para leer la réplica no es automática. El mecanismo de conmutación por error se basa en nodos.

Hay una larga lista de consideraciones que deben revisarse antes de configurar réplicas de lectura.

La creación de réplicas lleva mucho tiempo, incluso cuando probé con un conjunto de datos relativamente pequeño:

 Vacío

Vacío

Revise los parámetros clave, ya que Azure Database for PostgreSQL se envía con valores predeterminados de vacío ascendentes:

[email protected]:5432 postgres> select name,setting from pg_settings where name ~ '^autovacuum.*';

               name                 | setting

-------------------------------------+-----------

autovacuum                          | on

autovacuum_analyze_scale_factor     | 0.05

autovacuum_analyze_threshold        | 50

autovacuum_freeze_max_age           | 200000000

autovacuum_max_workers              | 3

autovacuum_multixact_freeze_max_age | 400000000

autovacuum_naptime                  | 15

autovacuum_vacuum_cost_delay        | 20

autovacuum_vacuum_cost_limit        | -1

autovacuum_vacuum_scale_factor      | 0.05

autovacuum_vacuum_threshold         | 50

autovacuum_work_mem                 | -1

(12 rows)

Actualizaciones

No se admiten actualizaciones principales automáticas. Como se mencionó anteriormente, esta es una oportunidad de ahorro de costos al reducir el almacenamiento de crecimiento automático.

Mejoras de PostgreSQL Azure

Series temporales

TimescaleDB está disponible como una extensión (no forma parte de los módulos de PostgreSQL); sin embargo, está a solo unos clics de distancia. El único inconveniente es la versión anterior 1.1.1, mientras que la versión anterior se encuentra actualmente en 1.4.1 (2019-08-01).

[email protected]:5432 postgres> CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

WARNING:

WELCOME TO

_____ _                               _ ____________

|_   _(_)                             | | | _ \ ___ \

| |  _ _ __ ___   ___ ___ ___ __ _| | ___| | | | |_/ /

| | | |  _ ` _ \ / _ \/ __|/ __/ _` | |/ _ \ | | | ___ \

| | | | | | | | |  __/\__ \ (_| (_| | |  __/ |/ /| |_/ /

|_| |_|_| |_| |_|\___||___/\___\__,_|_|\___|___/ \____/

               Running version 1.1.1

For more information on TimescaleDB, please visit the following links:



1. Getting started: https://docs.timescale.com/getting-started

2. API reference documentation: https://docs.timescale.com/api

3. How TimescaleDB is designed: https://docs.timescale.com/introduction/architecture




CREATE EXTENSION



[email protected]:5432 postgres> \dx timescaledb

                                    List of installed extensions

   Name     | Version | Schema |                            Description

-------------+---------+--------+-------------------------------------------------------------------

timescaledb | 1.1.1   | public | Enables scalable inserts and complex queries for time-series data

(1 row)

Registro

Además de las opciones de registro de PostgreSQL, Azure Database for PostgreSQL se puede configurar para registrar eventos de diagnóstico adicionales.

Cortafuegos

Azure Portal incluye una característica útil para permitir conexiones desde las direcciones IP registradas en el portal:

Tomé nota de la función, ya que facilita a los desarrolladores y administradores de sistemas se permiten entrar y se destaca como una característica que no ofrecen ni AWS ni GCloud.

Conclusión

Azure Database for PostgreSQL Single Server ofrece servicios de nivel empresarial, sin embargo, muchos de estos servicios todavía están en modo de vista previa:Query Store, Performance Insight, Performance Recommendation, Advanced Threat Protection, Large Storage, Cross-region Leer réplicas.

Si bien ya no se requiere conocimiento del sistema operativo para administrar PostgreSQL en la nube de Azure, se espera que el DBA adquiera habilidades que no se limitan a la base de datos en sí:redes de Azure (VNet), seguridad de conexión (firewall ), visor de registros y análisis junto con KQL, CLI de Azure para secuencias de comandos útiles, y la lista continúa.

Por último, para aquellos que planean migrar sus cargas de trabajo de PostgreSQL a Azure, hay una serie de recursos disponibles junto con una lista selecta de socios de Azure, incluido Credativ, uno de los principales patrocinadores y contribuyentes de PostgreSQL.