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