ZFS permite implementar una estrategia de backup simple (a nivel sistema de archivos) mediante la creación de snapshots (instantáneas del sistema de archivos empleando la técnica de copy-on-write). Por ejemplo es posible crear un snapshot por día y mantenerlos durante 15 días. Esto evita la necesidad de crear copias comprimidas o utilizar rsync. Sin embargo, mantener snapshots (especialmente cuando se desea mantener un número limitado de ellos) puede ser una tarea tediosa. En un día determinado, y luego de haber creado el snapshot diario, ¿cómo puedo saber cuáles de los snapshots anteriores debo borrar según mi estrategia? Sobre todo teniendo en cuenta que ZFS no almacena la fecha de creación de un snapshot.

Afortunadamente, la herramienta zfSnap permite crear y eliminar fácilmente snapshots (instantáneas) en un sistema de archivos ZFS.



En sistemas de archivos ZFS, típicamente se crean snapshots con el comando zfs snpashot. Esto es tan simple como ejecutar:

# zfs snapshot -r pool/dataset@nombre

Donde "nombre" es un nombre que se le asigna al snapshot. Sin embargo, la herramienta zfSnap está diseñada para la gestión automática de snapshots por fecha. Se trata de un script disponible para los sistemas operativos de la familia Unix, incluyendo a Linux por supuesto:

root@debian:~# apt-cache search zfsnap
zfsnap - Automatic snapshot creation and removal for ZFS

Es posible instalar fácilmente zfSnap en Debian y derivados ejecutando:

# apt-get install zfsnap

Este script está pensado para gestionar snapshots rotativos de forma eficiente, sin necesidad de recurrir a bases de datos ni lenguajes de script "pesados". Para ello, se basa en almacenar la fecha de creación de cada snapshot en el nombre del mismo.

Cuando se crean snapshots con esta herramienta, se debe especificar el tiempo de vida (TTL) en días (d), semanas (w) o incluso horas (h). Por ejemplo, para crear un snapshot que dure 1 semana en el pool/dataset "zpool/zdata" ejecutar:

# zfSnap -v -a 1w -r zpool/zdata

La opción -v es para obtener una salida verbosa, -a 1w indica que se cree un snapshot de una semana de duración, y -r es para que cree un snapshot recursivo si el sistema de archivos lo permite.

Respecto al borrado "automático" de snapshots, es la propia herramienta la que lo implementa. Por ende debe ser ejecutada con regularidad. Por ejemplo, para borrar automáticamente todos los snapshots expirados en el pool/dataset "zpool/zdata" ejecutar:

# zfSnap -v -d zpool/zdata

Tener en cuenta que el significado de estas opciones puede cambiar con versiones más actualizadas de zfSnap. Por ello es conveniente revisar la página de manual o la salida de --help antes de utilizar esta herramienta:

root@debian:~# zfSnap --help
zfSnap v1.11.1 by Aldis Berjoza

Syntax:
zfSnap [ generic options ] [ options ] zpool/filesystem ...

GENERIC OPTIONS:
  -d           = Delete old snapshots
  -e           = Return number of failed actions as exit code.
  -F age       = Force delete all snapshots exceeding age
  -n           = Only show actions that would be performed
  -s           = Don't do anything on pools running resilver
  -S           = Don't do anything on pools running scrub
  -v           = Verbose output
  -z           = Force new snapshots to have 00 seconds!
  -zpool28fix  = Workaround for zpool v28 zfs destroy -r bug

OPTIONS:
  -a ttl       = Set how long snapshot should be kept
  -D pool/fs   = Delete all zfSnap snapshots of specific pool/fs (ignore ttl)
  -p prefix    = Use prefix for snapshots after this switch
  -P           = Don't use prefix for snapshots after this switch
  -r           = Create recursive snapshots for all zfs file systems that
                 fallow this switch
  -R           = Create non-recursive snapshots for all zfs file systems that
                 fallow this switch

LINKS:
  wiki:             https://github.com/graudeejs/zfSnap/wiki
  repository:       https://github.com/graudeejs/zfSnap
  Bug tracking:     https://github.com/graudeejs/zfSnap/issues

La creación y la eliminación automática de snapshots puede ser efectuada en el mismo comando. Esto permite implementar una estrategia de snapshots rotativos semanales en un simple comando. Basta con agregar la siguiente línea en un crontab:

/usr/sbin/zfSnap -v -d -zpool28fix -a 1w -r pool/dataset >> /var/log/zfsnap.log 2>&1

Se crea un nuevo snapshot de una semana de duración y al mismo tiempo se eliminan aquellos que hayan expirado. La opción -zpoo28fix se agrega para evitar un bug al borrar recursivamente en pooles ZFS versión 28.

Luego de una semana corriendo este comando todos los días a las 03:27 HS obtengo los siguientes snapshots:

root@debian:~# zfs list -r -t snapshot zpool/zdata
NAME                                  USED  AVAIL  REFER  MOUNTPOINT
zpool/zdata@2020-05-04_03.27.01--1w  3,46M      -  49,1M  -
zpool/zdata@2020-05-05_03.27.01--1w  2,99M      -  49,6M  -
zpool/zdata@2020-05-06_03.27.01--1w  3,65M      -  55,9M  -
zpool/zdata@2020-05-07_03.27.01--1w  3,80M      -  56,4M  -
zpool/zdata@2020-05-08_03.27.01--1w  4,28M      -  97,6M  -
zpool/zdata@2020-05-09_03.27.01--1w  4,95M      -  98,7M  -
zpool/zdata@2020-05-10_03.27.01--1w  5,17M      -  99,1M  -
zpool/zdata@2020-05-11_03.27.01--1w  2,88M      -  96,9M  -

Al utilizar la fecha de creación del snapshot como nombre, zfSnap es capaz de saber cuales debe borrar sin necesidad de emplear una base de datos o archivo auxiliar.

Referencias


Tal vez pueda interesarte


Compartí este artículo