ZFS es un sistema de archivos increíble y resuelve muchas de mis necesidades de almacenamiento de datos locales y compartidos.
Si bien, me gusta la idea de ZFS agrupado siempre que sea posible, a veces no es práctico, o necesito cierta separación geográfica de los nodos de almacenamiento.
Uno de los casos de uso que tengo es para el almacenamiento replicado de alto rendimiento en servidores de aplicaciones Linux. Por ejemplo, apoyo un producto de software heredado que se beneficia de las unidades SSD NVMe de baja latencia para sus datos. La aplicación tiene una opción de duplicación a nivel de aplicación que puede replicarse en un servidor secundario, pero a menudo es inexacta y es un RPO de 10 minutos .
He resuelto este problema teniendo un servidor secundario (que también ejecuta ZFS en hardware similar o diferente) que puede ser local, remoto o ambos. Al combinar las tres utilidades detalladas a continuación, he creado una solución de replicación que me brinda replicación continua, retención profunda de instantáneas y opciones flexibles de conmutación por error.
zfs-auto-snapshot - https://github.com/zfsonlinux/zfs-auto-snapshot
Solo es una herramienta útil para habilitar instantáneas periódicas de nivel de sistema de archivos ZFS. Normalmente ejecuto el siguiente cronograma en volúmenes de producción:
# /etc/cron.d/zfs-auto-snapshot
PATH="/usr/bin:/bin:/usr/sbin:/sbin"
*/5 * * * * root /sbin/zfs-auto-snapshot -q -g --label=frequent --keep=24 //
00 * * * * root /sbin/zfs-auto-snapshot -q -g --label=hourly --keep=24 //
59 23 * * * root /sbin/zfs-auto-snapshot -q -g --label=daily --keep=14 //
59 23 * * 0 root /sbin/zfs-auto-snapshot -q -g --label=weekly --keep=4 //
00 00 1 * * root /sbin/zfs-auto-snapshot -q -g --label=monthly --keep=4 //
Syncoid (Sanoid) - https://github.com/jimsalterjrs/sanoid
Este programa puede ejecutar snap / replicación ad-hoc de un sistema de archivos ZFS a un objetivo secundario. Solo uso la porción sincoide del producto.
Suponiendo que el servidor1 y el servidor2 , el comando simple se ejecuta desde el servidor2 para extraer datos del servidor1 :
#!/bin/bash
/usr/local/bin/syncoid root@server1:vol1/data vol2/data
exit $?
Monit - https://mmonit.com/monit/
Monit es un planificador de trabajos y administrador de ejecución extremadamente flexible. Por defecto, funciona en un intervalo de 30 segundos, pero modifico la configuración para usar un ciclo de tiempo base de 15 segundos.
Una configuración de ejemplo que ejecuta el script de replicación anterior cada 15 segundos (1 ciclo)
check program storagesync with path /usr/local/bin/run_storagesync.sh
every 1 cycles
if status != 0 then alert
Esto es simple de automatizar y agregar mediante la administración de la configuración. Al ajustar la ejecución de la instantánea / replicación en Monit, obtiene un estado centralizado, control de trabajo y alertas (correo electrónico, SNMP, script personalizado).
El resultado es que tengo servidores que tienen varios meses de instantáneas mensuales y muchos puntos de reversión y retención dentro de: https://pastebin.com/zuNzgi0G - Además, una réplica atómica continua de 15 segundos:
# monit status
Program 'storagesync'
status Status ok
monitoring status Monitored
last started Wed, 05 Apr 2017 05:37:59
last exit value 0
data collected Wed, 05 Apr 2017 05:37:59
.
.
.
Program 'storagesync'
status Status ok
monitoring status Monitored
last started Wed, 05 Apr 2017 05:38:59
last exit value 0
data collected Wed, 05 Apr 2017 05:38:59