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

Características del método de copia de seguridad de PostgreSQL en AWS S3

Amazon lanzó S3 a principios de 2006 y la primera herramienta que permite que los scripts de copia de seguridad de PostgreSQL carguen datos en la nube, s3cmd, nació apenas un año después. Para 2010 (según mis habilidades de búsqueda en Google) Open BI blogs al respecto. Entonces es seguro decir que algunos de los administradores de bases de datos de PostgreSQL han estado realizando copias de seguridad de datos en AWS S3 durante 9 años. ¿Pero cómo? ¿Y qué ha cambiado en ese tiempo? Si bien algunos todavía hacen referencia a s3cmd en el contexto de las herramientas de copia de seguridad de PostgreSQL conocidas, los métodos han visto cambios que permiten una mejor integración con el sistema de archivos o las opciones de copia de seguridad nativas de PostgreSQL para lograr los objetivos de recuperación RTO y RPO deseados.

Por qué Amazon S3

Como se indica en la documentación de Amazon S3 (las preguntas frecuentes de S3 son un muy buen punto de partida), las ventajas de usar el servicio S3 son:

  • 99.999999999 (once nueves) durabilidad
  • almacenamiento de datos ilimitado
  • costos bajos (incluso más bajos cuando se combina con BitTorrent)
  • tráfico de red entrante sin cargo
  • solo se factura el tráfico de red saliente

AWS S3 CLI Problemas

El kit de herramientas de la CLI de AWS S3 proporciona todas las herramientas necesarias para transferir datos dentro y fuera del almacenamiento de S3, entonces, ¿por qué no usar esas herramientas? La respuesta se encuentra en los detalles de implementación de Amazon S3, que incluyen medidas para manejar las limitaciones y restricciones relacionadas con el almacenamiento de objetos:

  • Tamaño máximo de 5 TB por objeto almacenado
  • Tamaño máximo de 5 GB de un objeto PUT
  • se recomienda carga de varias partes para objetos de más de 100 MB
  • elegir una clase de almacenamiento adecuada de acuerdo con el gráfico de rendimiento de S3
  • aproveche el ciclo de vida de S3
  • Modelo de coherencia de datos de S3

Como ejemplo, consulte la página de ayuda de aws s3 cp:

--expected-size (cadena) Este argumento especifica el tamaño esperado de un flujo en términos de bytes. Tenga en cuenta que este argumento solo es necesario cuando se carga una secuencia en s3 y el tamaño es superior a 5 GB. Si no se incluye este argumento en estas condiciones, es posible que la carga falle debido a que hay demasiadas partes en la carga.

Evitar esas trampas requiere un conocimiento profundo del ecosistema S3, que es lo que las herramientas de copia de seguridad de S3 y PostgreSQL especialmente diseñadas están tratando de lograr.

Herramientas de copia de seguridad nativas de PostgreSQL compatibles con Amazon S3

La integración de S3 es proporcionada por algunas de las herramientas de copia de seguridad más conocidas, que implementan las funciones de copia de seguridad nativas de PostgreSQL.

BarmanS3

BarmanS3 se implementa como secuencias de comandos Barman Hook. Se basa en AWS CLI, sin abordar las recomendaciones y limitaciones enumeradas anteriormente. La configuración simple lo convierte en un buen candidato para instalaciones pequeñas. El desarrollo está algo estancado, última actualización hace aproximadamente un año, lo que convierte a este producto en una opción para aquellos que ya utilizan Barman en sus entornos.

Volcados S3

S3dumps es un proyecto activo, implementado utilizando la biblioteca Python Boto3 de Amazon. La instalación se realiza fácilmente a través de pip. Aunque se basa en el SDK de Python de Amazon S3, una búsqueda en el código fuente de palabras clave de expresiones regulares como multi.*part o storage.*class no revela ninguna de las características avanzadas de S3, como las transferencias de varias partes.

pgBackRest

pgBackRest implementa S3 como una opción de repositorio. Esta es una de las conocidas herramientas de copia de seguridad de PostgreSQL, que proporciona un conjunto rico en funciones de opciones de copia de seguridad, como copia de seguridad y restauración en paralelo, cifrado y compatibilidad con espacios de tablas. Es principalmente código C, que proporciona la velocidad y el rendimiento que buscamos; sin embargo, cuando se trata de interactuar con la API de AWS S3, esto tiene el precio del trabajo adicional requerido para implementar las funciones de almacenamiento de S3. La versión reciente implementa la carga de varias partes de S3.

WAL-G

WAL-G anunciado hace 2 años se mantiene activamente. Esta sólida herramienta de copia de seguridad de PostgreSQL implementa clases de almacenamiento, pero no carga de varias partes (la búsqueda del código para CreateMultipartUpload no encontró ninguna aparición).

PGHoard

pghoard se lanzó hace unos 3 años. Es una herramienta de copia de seguridad de PostgreSQL rica en funciones y con gran rendimiento que admite transferencias de varias partes de S3. No ofrece ninguna de las otras funciones de S3, como la clase de almacenamiento y la gestión del ciclo de vida de los objetos.

S3 como sistema de archivos local

Poder acceder al almacenamiento S3 como un sistema de archivos local es una función muy deseada, ya que abre la posibilidad de utilizar las herramientas de copia de seguridad nativas de PostgreSQL.

Para entornos Linux, Amazon ofrece dos opciones:NFS e iSCSI. Aprovechan AWS Storage Gateway.

NFS

El servicio de archivos de AWS Storage Gateway proporciona un recurso compartido NFS montado localmente. De acuerdo con el enlace, necesitamos crear un File Gateway.

En la pantalla Seleccionar plataforma de host, seleccione Amazon EC2 y haga clic en el botón Iniciar instancia para iniciar el asistente de EC2 para crear la instancia.

Ahora, solo por curiosidad de este administrador de sistemas, inspeccionemos la AMI utilizada por el asistente, ya que nos brinda una perspectiva interesante sobre algunas de las piezas internas de AWS. Con el identificador de imagen conocido como ami-0bab9d6dffb52fef5, veamos los detalles:

Como se muestra arriba, el nombre de la AMI es aws-thinstaller; entonces, ¿qué es un "thinstaller"? Las búsquedas en Internet revelan que Thinstaller es una herramienta de administración de configuración de software de IBM Lenovo para productos de Microsoft y se menciona primero en este blog de 2008, y luego en esta publicación del foro de Lenovo y esta solicitud de servicio del distrito escolar. No tenía forma de saberlo, ya que mi trabajo de administrador de sistemas de Windows terminó 3 años antes. Esta AMI también se creó con el producto Thinstaller. Para complicar aún más las cosas, el sistema operativo de la AMI aparece como "Otro Linux", lo que se puede confirmar ingresando al sistema mediante SSH como administrador.

Un asistente lo consiguió:a pesar de las instrucciones de configuración del cortafuegos de EC2, mi navegador estaba agotando el tiempo de espera cuando se conectaba a la puerta de enlace de almacenamiento. Permitir el puerto 80 está documentado en Requisitos de puerto. Podríamos argumentar que el asistente debería enumerar todos los puertos necesarios o vincular a la documentación; sin embargo, en el espíritu de la nube, la respuesta es "automatizar" con herramientas como CloudFormation.

El asistente también sugiere comenzar con una instancia de tamaño extra grande.

Una vez que la puerta de enlace de almacenamiento esté lista, configure el recurso compartido NFS haciendo clic en Crear Botón para compartir archivos en el menú de la puerta de enlace:

Una vez que el recurso compartido NFS esté listo, siga las instrucciones para montar el sistema de archivos:

En la captura de pantalla anterior, tenga en cuenta que el comando de montaje hace referencia a la IP privada de la instancia dirección. Para montar desde un host público, simplemente use la dirección pública de la instancia como se muestra en los detalles de la instancia EC2 anteriores.

El asistente no se bloqueará si el depósito S3 no existe en el momento de crear el recurso compartido de archivos; sin embargo, una vez que se crea el depósito S3, debemos reiniciar la instancia, de lo contrario, el comando de montaje falla con:

[[email protected] ~]# mount -t nfs -o nolock,hard 34.207.216.29:/s9s-postgresql-backup /mnt

mount.nfs: mounting 34.207.216.29:/s9s-postgresql-backup failed, reason given by server: No such file or directory

Verifique que el recurso compartido esté disponible:

[[email protected] ~]# df -h /mnt

Filesystem                            Size Used Avail Use% Mounted on

34.207.216.29:/s9s-postgresql-backup  8.0E 0 8.0E 0% /mnt

Ahora hagamos una prueba rápida:

[email protected][local]:54311 postgres# \l+ test

                                                List of databases

Name |  Owner | Encoding |   Collate | Ctype | Access privileges |  Size | Tablespace | Description

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

test | postgres | UTF8     | en_US.UTF-8 | en_US.UTF-8 |                   | 2763 MB | pg_default |

(1 row)

[[email protected] ~]# date ; time pg_dump -d test | gzip -c >/mnt/test.pg_dump.gz ; date

Sun 27 Oct 2019 06:06:24 PM PDT



real    0m29.807s

user    0m15.909s

sys     0m2.040s

Sun 27 Oct 2019 06:06:54 PM PDT

Tenga en cuenta que la marca de tiempo Última modificación en el depósito S3 es aproximadamente un minuto más tarde, lo que, como se mencionó anteriormente, tiene que ver con el modelo de consistencia de datos de Amazon S3.

Aquí hay una prueba más exhaustiva:

~ $ for q in {0..20} ; do touch /mnt/touched-at-$(date +%Y%m%d%H%M%S) ;

sleep 1 ; done



~ $ aws s3 ls s3://s9s-postgresql-backup | nl

    1      2019-10-27 19:50:40          0 touched-at-20191027194957

    2      2019-10-27 19:50:40          0 touched-at-20191027194958

    3      2019-10-27 19:50:40          0 touched-at-20191027195000

    4      2019-10-27 19:50:40          0 touched-at-20191027195001

    5      2019-10-27 19:50:40          0 touched-at-20191027195002

    6      2019-10-27 19:50:40          0 touched-at-20191027195004

    7      2019-10-27 19:50:40          0 touched-at-20191027195005

    8      2019-10-27 19:50:40          0 touched-at-20191027195007

    9      2019-10-27 19:50:40          0 touched-at-20191027195008

   10      2019-10-27 19:51:10          0 touched-at-20191027195009

   11      2019-10-27 19:51:10          0 touched-at-20191027195011

   12      2019-10-27 19:51:10          0 touched-at-20191027195012

   13      2019-10-27 19:51:10          0 touched-at-20191027195013

   14      2019-10-27 19:51:10          0 touched-at-20191027195014

   15      2019-10-27 19:51:10          0 touched-at-20191027195016

   16      2019-10-27 19:51:10          0 touched-at-20191027195017

   17      2019-10-27 19:51:10          0 touched-at-20191027195018

   18      2019-10-27 19:51:10          0 touched-at-20191027195020

   19      2019-10-27 19:51:10          0 touched-at-20191027195021

   20      2019-10-27 19:51:10          0 touched-at-20191027195022

   21      2019-10-27 19:51:10          0 touched-at-20191027195024

Otro problema que vale la pena mencionar:después de jugar con varias configuraciones, crear y destruir puertas de enlace y recursos compartidos, en algún momento al intentar activar una puerta de enlace de archivos, recibí un error interno:

La línea de comando brinda más detalles, aunque no apunta a ningún problema:

~$ curl -sv "http://107.22.30.30/?gatewayType=FILE_S3&activationRegion=us-east-1"

*   Trying 107.22.30.30:80...

* TCP_NODELAY set

* Connected to 107.22.30.30 (107.22.30.30) port 80 (#0)

> GET /?gatewayType=FILE_S3&activationRegion=us-east-1 HTTP/1.1

> Host: 107.22.30.30

> User-Agent: curl/7.65.3

> Accept: */*

>

* Mark bundle as not supporting multiuse

< HTTP/1.1 500 Internal Server Error

< Date: Mon, 28 Oct 2019 06:33:30 GMT

< Content-type: text/html

< Content-length: 14

<

* Connection #0 to host 107.22.30.30 left intact

Internal Error~ $

Esta publicación del foro señaló que mi problema puede tener algo que ver con el punto final de la VPC que había creado. Mi solución fue eliminar el punto de enlace de la VPC que había configurado durante varias ejecuciones de prueba y error de iSCSI.

Mientras que S3 cifra los datos en reposo, el tráfico por cable de NFS es texto sin formato. A saber, aquí hay un volcado de paquetes tcpdump:

23:47:12.225273 IP 192.168.0.11.936 > 107.22.30.30.2049: Flags [P.], seq 2665:3377, ack 2929, win 501, options [nop,nop,TS val 1899459538 ecr 38013066], length 712: NFS request xid 3511704119 708 getattr fh 0,2/53

[email protected]@.......k.......        ...c..............

q7s..D.......PZ7...........................4........omiday.can.local...................................................5.......]...........!....................C...

..............&...........]....................# inittab is no longer used.

#

# ADDING CONFIGURATION HERE WILL HAVE NO EFFECT ON YOUR SYSTEM.

#

# Ctrl-Alt-Delete is handled by /usr/lib/systemd/system/ctrl-alt-del.target

#

# systemd uses 'targets' instead of runlevels. By default, there are two main targets:

#

# multi-user.target: analogous to runlevel 3

# graphical.target: analogous to runlevel 5

#

# To view current default target, run:

# systemctl get-default

#

# To set a default target, run:

# systemctl set-default TARGET.target

.....   .........0..

23:47:12.331592 IP 107.22.30.30.2049 > 192.168.0.11.936: Flags [P.], seq 2929:3109, ack 3377, win 514, options [nop,nop,TS val 38013174 ecr 1899459538], length 180: NFS reply xid 3511704119 reply ok 176 getattr NON 4 ids 0/33554432 sz -2138196387

Hasta que se apruebe este borrador de IEE, la única opción segura para conectarse desde fuera de AWS es mediante un túnel VPN. Esto complica la configuración, lo que hace que la opción NFS en las instalaciones sea menos atractiva que las herramientas basadas en FUSE de las que hablaré un poco más adelante.

iSCSI

Esta opción la proporciona el servicio de volumen de AWS Storage Gateway. Una vez que el servicio esté configurado, diríjase a la sección de configuración del cliente Linux iSCSI.

La ventaja de usar iSCSI sobre NFS consiste en la capacidad de aprovechar los servicios nativos de copias de seguridad, clonación e instantáneas en la nube de Amazon. Para obtener detalles e instrucciones paso a paso, siga los enlaces a AWS Backup, Volume Cloning y EBS Snapshots

Aunque hay muchas ventajas, hay una restricción importante que probablemente desconcierte a muchos usuarios:no es posible acceder a la puerta de enlace a través de su dirección IP pública. Entonces, al igual que la opción NFS, este requisito agrega complejidad a la configuración.

A pesar de la clara limitación y convencido de que no podré completar esta configuración, todavía quería tener una idea de cómo se hace. El asistente redirige a una pantalla de configuración de AWS Marketplace.

Tenga en cuenta que el asistente de Marketplace crea un disco secundario, aunque no lo suficientemente grande en tamaño y, por lo tanto, todavía tenemos que agregar los dos volúmenes requeridos como se indica en las instrucciones de configuración del host. Si no se cumplen los requisitos de almacenamiento, el asistente se bloqueará en la pantalla de configuración de discos locales:

Aquí hay un vistazo de la pantalla de configuración de Amazon Marketplace:

Hay una interfaz de texto accesible a través de SSH (iniciar sesión como usuario sguser) que proporciona herramientas básicas de solución de problemas de red y otras opciones de configuración que no se pueden realizar a través de la GUI web:

~ $ ssh [email protected]

Warning: Permanently added 'ec2-3-231-96-109.compute-1.amazonaws.com,3.231.96.109' (ECDSA) to the list of known hosts.

'screen.xterm-256color': unknown terminal type.




      AWS Storage Gateway Configuration



      #######################################################################

      ##  Currently connected network adapters:

      ##

      ##  eth0: 172.31.1.185

      #######################################################################



      1: SOCKS Proxy Configuration

      2: Test Network Connectivity

      3: Gateway Console

      4: View System Resource Check (0 Errors)



      0: Stop AWS Storage Gateway



      Press "x" to exit session



      Enter command:

Y un par de puntos importantes más:

  • Al contrario de la configuración de NFS, no hay acceso directo al almacenamiento S3 como se indica en la sección de preguntas frecuentes de Volume Gateway.
  • La documentación de AWS insiste en personalizar la configuración de iSCSI para mejorar el rendimiento y la seguridad de la conexión.

FUSIBLE

En esta categoría, he enumerado las herramientas basadas en FUSE que brindan una compatibilidad S3 más completa en comparación con las herramientas de respaldo de PostgreSQL y, en contraste con Amazon Storage Gateway, permiten transferencias de datos desde un host local. a Amazon S3 sin configuración adicional. Tal configuración podría proporcionar almacenamiento S3 como un sistema de archivos local que las herramientas de copia de seguridad de PostgreSQL pueden usar para aprovechar funciones como pg_dump paralelo.

s3fs-fusible

s3fs-fuse está escrito en C++, un lenguaje compatible con el kit de herramientas del SDK de Amazon S3 y, como tal, es ideal para implementar características avanzadas de S3, como cargas de varias partes, almacenamiento en caché, clase de almacenamiento S3, servidor- cifrado lateral y selección de región. También es altamente compatible con POSIX.

La aplicación se incluye con mi Fedora 30, lo que facilita la instalación.

Para probar:

~/mnt/s9s $ time pg_dump -d test | gzip -c >test.pg_dump-$(date +%Y%m%d-%H%M%S).gz

real    0m35.761s

user    0m16.122s

sys     0m2.228s

~/mnt/s9s $ aws s3 ls s3://s9s-postgresql-backup

2019-10-28 03:16:03   79110010 test.pg_dump-20191028-031535.gz

Tenga en cuenta que la velocidad es un poco más lenta que usar Amazon Storage Gateway con la opción NFS. Compensa el bajo rendimiento al proporcionar un sistema de archivos altamente compatible con POSIX.

S3QL

S3QL proporciona características de S3, como clase de almacenamiento y cifrado del lado del servidor. Las muchas funciones se describen en la documentación exhaustiva de S3QL; sin embargo, si está buscando una carga de varias partes, no se menciona en ninguna parte. Esto se debe a que S3QL implementa su propio algoritmo de división de archivos para proporcionar la función de eliminación de duplicados. Todos los archivos se dividen en bloques de 10 MB.

La instalación en un sistema basado en Red Hat es sencilla:instale las dependencias RPM requeridas a través de yum:

sqlite-devel-3.7.17-8.14.amzn1.x86_64

fuse-devel-2.9.4-1.18.amzn1.x86_64

fuse-2.9.4-1.18.amzn1.x86_64

system-rpm-config-9.0.3-42.28.amzn1.noarch

python36-devel-3.6.8-1.14.amzn1.x86_64

kernel-headers-4.14.146-93.123.amzn1.x86_64

glibc-headers-2.17-260.175.amzn1.x86_64

glibc-devel-2.17-260.175.amzn1.x86_64

gcc-4.8.5-1.22.amzn1.noarch

gcc48-4.8.5-28.142.amzn1.x86_64

mpfr-3.1.1-4.14.amzn1.x86_64

libmpc-1.0.1-3.3.amzn1.x86_64

libgomp-6.4.1-1.45.amzn1.x86_64

libgcc48-4.8.5-28.142.amzn1.x86_64

cpp48-4.8.5-28.142.amzn1.x86_64

python36-pip-9.0.3-1.26.amzn1.noarch

python36-libs-3.6.8-1.14.amzn1.x86_64

python36-3.6.8-1.14.amzn1.x86_64

python36-setuptools-36.2.7-1.33.amzn1.noarch

Luego instala las dependencias de Python usando pip3:

pip-3.6 install setuptools cryptography defusedxml apsw dugong pytest requests llfuse==1.3.6

Una característica notable de esta herramienta es el sistema de archivos S3QL creado sobre el depósito S3.

Goofys

goofys es una opción cuando el rendimiento supera el cumplimiento de POSIX. Sus objetivos son lo opuesto a s3fs-fuse. El enfoque en la velocidad también se refleja en el modelo de distribución. Para Linux hay binarios prediseñados. Una vez descargado, ejecute:

~/temp/goofys $ ./goofys s9s-postgresql-backup ~/mnt/s9s/

Y copia de seguridad:

~/mnt/s9s $ time pg_dump -d test | gzip -c >test.pg_dump-$(date +%Y%m%d-%H%M%S).gz



real    0m27.427s

user    0m15.962s

sys     0m2.169s



~/mnt/s9s $ aws s3 ls s3://s9s-postgresql-backup

2019-10-28 04:29:05   79110010 test.pg_dump-20191028-042902.gz

Tenga en cuenta que la hora de creación del objeto en S3 está a solo 3 segundos de la marca de tiempo del archivo.

ObjetoFS

ObjectFS parece haberse mantenido hasta hace unos 6 meses. Una verificación de la carga de varias partes revela que no está implementada. Del artículo de investigación del autor, sabemos que el sistema aún está en desarrollo y, dado que el artículo se publicó en 2019, pensé que valdría la pena mencionarlo.

Clientes S3

Como se mencionó anteriormente, para utilizar la CLI de AWS S3, debemos tener en cuenta varios aspectos específicos del almacenamiento de objetos en general y de Amazon S3 en particular. Si el único requisito es la capacidad de transferir datos dentro y fuera del almacenamiento S3, una herramienta que siga de cerca las recomendaciones de Amazon S3 puede hacer el trabajo.

s3cmd es una de las herramientas que superó la prueba del tiempo. Este blog de Open BI de 2010 habla de ello, en un momento en que S3 era el chico nuevo del barrio.

Características notables:

  • cifrado del lado del servidor
  • cargas automáticas de varias partes
  • limitación del ancho de banda

Diríjase a S3cmd:preguntas frecuentes y base de conocimientos para obtener más información.

Conclusión

Las opciones disponibles para realizar copias de seguridad de un clúster de PostgreSQL en Amazon S3 difieren en los métodos de transferencia de datos y en cómo se alinean con las estrategias de Amazon S3.

AWS Storage Gateway complementa el almacenamiento de objetos S3 de Amazon, a costa de una mayor complejidad junto con el conocimiento adicional necesario para aprovechar al máximo este servicio. Por ejemplo, seleccionar la cantidad correcta de discos requiere una planificación cuidadosa, y una buena comprensión de los costos relacionados con S3 de Amazon es imprescindible para minimizar los costos operativos.

Si bien se aplica a cualquier almacenamiento en la nube, no solo a Amazon S3, la decisión de almacenar los datos en una nube pública tiene implicaciones de seguridad. Amazon S3 proporciona cifrado para datos en reposo y datos en tránsito, sin garantía de conocimiento cero o sin pruebas de conocimiento. Las organizaciones que deseen tener control total sobre sus datos deben implementar el cifrado del lado del cliente y almacenar las claves de cifrado fuera de su infraestructura de AWS.

Para alternativas comerciales a la asignación de S3 a un sistema de archivos local, vale la pena consultar los productos de ObjectiveFS o NetApp.

Por último, las organizaciones que buscan desarrollar sus propias herramientas de copia de seguridad, ya sea sobre la base proporcionada por muchas aplicaciones de código abierto o comenzando desde cero, deberían considerar usar la prueba de compatibilidad S3, disponible a través del proyecto Ceph.