Backups eficientes con zfs + snapshots + compresión automática + rsync incremental

¿ Qué importancia tiene un sistema de backups ? Toda.

No existe sistema infalible, puede fallar el proveedor del datacenter (¿recordáis el incendio de OVH ?), el hardware de tu dedicado, una desastrosa manipulación de datos de un usuario en el backoffice, un procesos de sincronización descontrolado, una actualización de Magento fallida… tantas y tantas posibles causas con un fin desastroso que quien no tenga un sistema de backups eficiente y lo mas cercano al momento actual posible se verá mas pronto que tarde en serios problemas.

Estando de acuerdo todos en este punto os explico mi sistema actual de backups por si a algún otro sysadmin le sirve de utilidad. Hasta descubrir ZFS, solía utilizar herramientas como backuppc, rsync + scripts varios y otras soluciones ingeniosas de diferentes herramientas open source pero todas ellas resultaron muy inferiores a la simpleza y eficacia de zfs + snapshots + live compression + rsync.

Como ejemplo el sistema de backups que he implementado para un proveedor de hospedajes/cloud Magento en Francia que lleva en producción mas de 2 años. Actualmente realiza de forma diaria la copia de seguridad de mas de 250 servidores (entre vps, internos y dedicados de todo el mundo) que se realiza simultáneamente en dos servidores de backups en ubicaciones diferentes (polonia y finlandia). Conteniendo 7 backups «completos» uno por cada día de la semana mas otro en los días 1 y 15 de cada mes que se conservan y van borrando los meses mas antiguos mientras existe espacio en el servidor de backup, el tamaño del pool zfs es de unos 12T (compresión zstd-5) para una copia completa de todos los datos de todos los servidores, a partir de ahí sumar la copia diferencial realizada cada día. El backup se completa diáriamente en menos de 7 horas para todos los servidores con el resultado de una copia «completa» en cada backup realizado.

La base de este sistema de backup son los snapshots de ZFS y la compresión automática en el sistema propio de ficheros (quien no conozca este sistema de ficheros debería de estudiarlo inmediatamente). ZFS no es el mejor sistemas de ficheros para todo uso y no lo defiendo como tal pero para el propósito de un sistema de backups me parece genial.

Es preferible tener un servidor dedicado para las tareas de backups y además con suficiente RAM, ZFS necesita de mucha para trabajar de manera óptima sobre todo con grandes volúmenes de datos. También prefiero que el sistema operativo sea FreeBSD, es el sistema que mejor se integra con ZFS, con Linux además he tenido problemas con la gestión de la memoria, algo que aún no me ha ocurrido con FreeBSD en su integración con ZFS.

Una vez tu sistema FreeBSD instalado y el pool ZFS configurado (existen numerosos parámetros a optimizar) el sistema de backups es bastante sencillo. Básicamente consiste en:

  1. Hacer un snapshot del dataset donde está la copia del servidor a realizar el backup. Utilizando una nomenclatura sencilla para el nombre de los snapshots es fácil conseguir por ejemplo una rotación semanal y tener así una semana completa de snapshots. Cada día (donde X es el día de la semana):
    • zfs destroy vpsdataset@dowX
    • zfs snaphot vpsdataset@dowX
  2. Hacer un rsync (-a –numeric-ids -H –delete) del servidor remoto al vpsdataset.

Y listo. Naturalmente hay mas variables a tener en cuenta como optimizar una lista de «excludes» para el rsync, tener localmente en cada servidor un proceso que te haga una copia de la base de datos en local u optimizar el protocolo de cifrado ssh para rsync. Pero básicamente esta es la idea.

La gran ventaja de los snapshots es que su acceso en caso de necesidad es rapidísimo y disponible de forma instantánea con compresión de facto transparente. Así puedes ir al directorio vpsdataset/.zfs/snapshot/ y ahí tener acceso a todos los snapshots realizados y acceder a cualquier fichero que necesites o hacer un rsync completo hacia el servidor y restaurarlo.

# cd /vpsdataset/.zfs
# ls
snapshot/
# cd snapshot/
# ls -la
total 128
dr-xr-xr-x+ 17 root wheel 17B 20 jun. 02:36 ./
dr-xr-xr-x+ 3 root wheel 3B 28 ene. 2021 ../
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dom0201/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dom0301/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dom0401/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dom0416/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dom0501/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dom0516/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dom0601/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dom0616/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dow1/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dow2/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dow3/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dow4/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dow5/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dow6/
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 dow7/
# ls -la dow1/
total 75
drwxr-xr-x 14 root wheel 22B 22 sept. 2021 ./
dr-xr-xr-x+ 17 root wheel 17B 20 jun. 02:36 ../
-rw-r--r-- 1 root wheel 4,8K 22 jun. 2018 .BUILDINFO
-rw-r--r-- 1 root wheel 406B 25 jun. 2018 .INSTALL
-rw-r--r-- 1 root wheel 460B 22 jun. 2018 .MTREE
-rw-r--r-- 1 root wheel 406B 22 jun. 2018 .PKGINFO
lrwxrwxrwx 1 root wheel 7B 19 ene. 2021 bin@ -> usr/bin
drwxr-xr-x 4 root wheel 8B 13 mar. 2021 boot/
drwxr-xr-x 53 root wheel 148B 6 jun. 11:59 etc/
drwxr-xr-x 3 root wheel 3B 19 abr. 2021 home/
lrwxrwxrwx 1 root wheel 7B 19 ene. 2021 lib@ -> usr/lib
lrwxrwxrwx 1 root wheel 7B 19 ene. 2021 lib64@ -> usr/lib
drwx------ 2 root wheel 2B 28 ene. 2021 lost+found/
drwxr-xr-x 2 root wheel 2B 5 ene. 2018 mnt/
drwxr-xr-x 2 root wheel 2B 5 ene. 2018 opt/
drwxr-xr-x 4 root wheel 4B 28 ene. 2021 ovh/
drwxr-x--- 9 root wheel 25B 11 jun. 10:56 root/
drwxr-xr-x 2 root wheel 2B 29 mar. 2021 run/
lrwxrwxrwx 1 root wheel 7B 19 ene. 2021 sbin@ -> usr/bin
drwxr-xr-x 4 root wheel 4B 5 ene. 2018 srv/
drwxr-xr-x 8 root wheel 10B 6 jun. 11:59 usr/
drwxr-xr-x 13 root wheel 17B 4 jun. 02:44 var/

 

# zfs get all vpsdataset|grep compress
vpsdataset compressratio     3.55x -
vpsdataset compression       zstd-5 inherited from backup
vpsdataset refcompressratio  2.27x -

 

* vpsdataset es utilizado como nombre de ejemplo sin utilidad real

 

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *

Este formulario guarda los datos que indiques de nombre, email y comentario para poder realizar un seguimiento de los comentarios dejados en cada entrada.