Instantánea ZFS para archivar como copia de seguridad con rotación

14

Tengo un sistema local FreeNAS y quiero usar instantáneas ZFS para las copias de seguridad.
FreeNAS tiene las tareas de replicación integradas que utilizan

zfs send snapshot_name

para enviar una instantánea a un sistema remoto. Pero esto necesita un sistema con ZFS en el otro extremo.

Quiero enviar la instantánea a un archivo y enviar este archivo comprimido y cifrado a la máquina remota.

Esto es posible con

zfs send snapshot_name | gzip | openssl enc -aes-256-cbc -a -salt > file.gz.ssl

Todos los días hago una instantánea del grupo de almacenamiento y guardo cada instantánea durante 30 días.
Con cada instantánea tomada, canalizaré esta instantánea a un archivo.
- snapshot_file 1 tiene todos los archivos (digamos 2GB)
- snapshot_file 2 solo tiene los cambios en snapshot_file 1 (digamos 5MB)
- snapshot_file 3 contiene los cambios en snapshot_file 2; y así.

El día 31, el archivo snapshot_file 1 se elimina (porque solo quiero los cambios de los últimos 30 días)

Por lo tanto, snapshot_file 2 debe contener todos los archivos (2GB de snapshot_file 1 + 5MB cambios)

Pero con este enfoque todos los días (desde el día 31 en adelante) se debe crear un nuevo archivo de 2GB y enviarlo a un sistema remoto. Esto es demasiado sobrecarga.

¿Cuál sería el mejor enfoque para usar instantáneas canalizadas a un archivo como estrategia de respaldo con un historial de X días?

PD: Sé que hay una gran cantidad de software de respaldo (rdiff-backup por ejemplo), que podría usar. Pero tengo curiosidad de cómo se podría hacer esto.

Martin Grohmann
fuente
¿Por qué no lo usas zfs recven el otro extremo (en un grupo con, zfs set compression=gzip-9por ejemplo)? Almacenar archivos de instantáneas me parece muy ineficiente.
Stéphane Chazelas
1
@StephaneChazelas porque no tengo un sistema de archivos ZFS en el otro extremo. Mi sistema remoto es una caja gentoo con ext4 (sé que podría instalar zfsonlinux, pero prefiero no hacerlo)
Martin Grohmann

Respuestas:

12

Si almacena las instantáneas en archivos, a diferencia del sistema de archivos (por ejemplo, con zfs receive), me temo que esto no es posible.

ZFS en el lado receptor

Si usa ZFS en el lado de envío y de recepción, puede evitar tener que transferir toda la instantánea y solo transferir las diferencias de la instantánea en comparación con la anterior:

ssh myserver 'zfs send -i pool/dataset@2014-02-04 pool/dataset@2014-02-05' | \
  zfs receive

ZFS conoce las instantáneas y almacena bloques mutuos solo una vez. Hacer que el sistema de archivos comprenda las instantáneas le permite eliminar las antiguas sin problemas.

Otro sistema de archivos en el lado receptor

En su caso, usted almacena las instantáneas en archivos individuales, y su sistema de archivos desconoce las instantáneas. Como ya notó, esto rompe la rotación. Debe transmitir instantáneas completas, lo que desperdiciará ancho de banda y espacio de almacenamiento, pero le permitirá eliminar instantáneas individuales. No dependen el uno del otro. Puede hacer instantáneas incrementales como esta:

ssh myserver 'zfs send -i pool/dataset@2014-02-04 pool/dataset@2014-02-05' \
  > incremental-2014-02-04:05

Para restaurar una instantánea incremental, también necesita las instantáneas anteriores. Esto significa que no puede eliminar los antiguos incrementales.

Soluciones posibles

Puede hacer incrementales como se muestra en mi último ejemplo y hacer una nueva no incremental cada mes. Los nuevos incrementales dependen de este no incremental y puede eliminar las instantáneas antiguas.

O podría buscar otras soluciones de respaldo. Hay rsnapshot , que utiliza rsyncy enlaces duros. Hace un muy buen trabajo en la rotación y es muy eficiente en ancho de banda, ya que requiere una copia de seguridad completa solo una vez.

Luego hay bareos . Hace incrementales, que ahorran ancho de banda y espacio. Tiene una característica muy bonita; Puede calcular una copia de seguridad completa de un conjunto de incrementales. Esto le permite eliminar los incrementales antiguos. Pero es un sistema bastante complejo y destinado a configuraciones más grandes.

La mejor solución, sin embargo, es usar ZFS en el lado receptor. Será eficiente en ancho de banda, almacenamiento eficiente y mucho más rápido que las otras soluciones. El único inconveniente que se me ocurre es que debe tener un mínimo de 8 ECG de memoria de GiB en ese cuadro (puede estar bien con 4 GiB si no ejecuta ningún servicio y solo lo usa zfs receive).

Marco
fuente
Si esto lo sé. Pero, ¿qué sucede si elimino (porque solo quiero tener un historial de 30 días) el conjunto de datos del archivo @ 2014-02-04? Entonces solo tengo los cambios realizados después del 4 de febrero, pero no todos los archivos.
Martin Grohmann
2
@ MartinGrohmann Entiendo a qué te refieres ahora. Bueno, esa es la belleza de ZFS, puede eliminar las instantáneas antiguas en ZFS sin problemas. En otros sistemas de archivos, debe conservar los antiguos. Quizás estés mejor con algo como rsnapshotentonces. O podría comenzar un nuevo no incremental después de un mes y luego eliminar los incrementales anteriores.
Marco
Gracias por tu ayuda; Acabo de encontrar duplicidad Esa es probablemente la forma de ir con la capacidad de cifrado.
Martin Grohmann
2
@MartinGrohmann Duplicity es un buen programa, pero tiene el mismo problema . Si solo haces incrementales, tu espacio sigue creciendo. No puede reclamar espacio sin perder ancho de banda y hacer una nueva copia de seguridad completa. Ya sea que vaya a ZFS en ambos lados o eche un vistazo a bareos , puede calcular una nueva copia de seguridad completa a partir de incrementales. Eso le permite eliminar los incrementales antiguos sin volver a transferir todo.
Marco
Si el problema es el ancho de banda de su fuente, una solución potencial (que estoy implementando para el NAS ZFS de mi hogar ahora) es enviar siempre incrementales a su almacenamiento remoto, pero una vez al mes active un VPS freeBSD remoto (por ejemplo, en océano digital) que luego puede abrir la última instantánea completa, zfs recibe algunos # incrementales en ella y luego almacena el resultado como una nueva instantánea. El VPS solo necesita estar disponible el tiempo suficiente para crear la nueva copia de seguridad base. El océano digital tiene una API que permite la fácil creación / destrucción de sus VPS. Y su sistema local solo necesita enviar copias de seguridad incrementales.
stuckj