Backup y Seguridad

Cómo configurar la deduplicación en Bacula Community con Aligned Volumes y ZFS

¿Qué es la deduplicación y por qué debería importarte?

Si gestionas copias de seguridad en entornos empresariales, probablemente te hayas enfrentado al mismo problema que la mayoría de administradores de sistemas: el almacenamiento crece sin control. Cada día se generan nuevos backups y, aunque gran parte de los datos son idénticos a los del día anterior, el sistema los almacena una y otra vez. Aquí es donde entra en juego la deduplicación.

La deduplicación es una técnica que identifica y elimina datos duplicados antes de escribirlos en el medio de almacenamiento. En lugar de guardar diez copias idénticas del mismo archivo —o del mismo bloque de datos—, el sistema almacena una sola copia y crea referencias internas para las restantes. El resultado: un ahorro de espacio que, en escenarios reales, oscila entre el 50% y el 90%.

Deduplicación a nivel de archivo vs. a nivel de bloque

No todas las implementaciones de deduplicación funcionan igual. Es importante entender las dos aproximaciones principales:

  • Deduplicación a nivel de archivo (file-level): compara archivos completos mediante sumas hash. Si dos archivos son idénticos byte a byte, solo se almacena uno. Es sencilla pero limitada: basta con que cambie un solo byte para que el archivo se considere diferente y se almacene íntegramente de nuevo.
  • Deduplicación a nivel de bloque (block-level): divide cada archivo en bloques de tamaño fijo o variable y compara individualmente cada bloque. Esto significa que si modificas un párrafo de un documento de 50 MB, solo se almacenará el bloque afectado, no los 50 MB completos. Es mucho más eficiente y es la aproximación que ofrecen las soluciones profesionales.

En entornos de producción, la deduplicación a nivel de bloque es la que marca realmente la diferencia, sobre todo cuando se combinan backups de múltiples máquinas que comparten sistemas operativos, aplicaciones y librerías comunes.

Deduplicación en Bacula: Enterprise vs. Community

Es importante aclarar desde el principio una distinción fundamental. Bacula ofrece dos ediciones con capacidades de deduplicación muy diferentes:

  • Bacula Enterprise incluye Global Endpoint Deduplication, un motor de deduplicación propio integrado en el Storage Daemon. Funciona con Device Type = Dedup, usa hashing SHA512/256 y puede deduplicar tanto en el lado del cliente como del servidor, reduciendo incluso el tráfico de red. Es una solución completa y autónoma, pero requiere licencia comercial.
  • Bacula Community no incluye un motor de deduplicación propio. Sin embargo, desde la versión 9.0.8, ofrece el plugin Aligned Volumes (bacula-aligned), que permite que un sistema de archivos con capacidad de deduplicación —como ZFS— realice la deduplicación de forma eficiente sobre los volúmenes de Bacula.

En este artículo nos centramos en la solución disponible para Bacula Community: el plugin Aligned Volumes combinado con ZFS.

¿Qué son los Aligned Volumes y por qué son necesarios?

Los volúmenes tradicionales de Bacula escriben los datos de forma secuencial en un único flujo, mezclando metadatos de archivos (nombres, permisos, fechas) con el contenido real de los ficheros. Esto tiene una consecuencia importante: los límites de los archivos no coinciden con los límites de los bloques del sistema de archivos. Incluso si el mismo archivo aparece en dos backups diferentes, ZFS no puede reconocer que los bloques son idénticos porque están desplazados, y la deduplicación resulta ineficaz.

Los Aligned Volumes (volúmenes alineados) resuelven este problema dividiendo cada volumen de Bacula en dos ficheros:

  • Volumen de metadatos (VolumeName): contiene los metadatos de los archivos (nombres, permisos, marcas de tiempo). Estos datos no se deduplicarán bien y se almacenan por separado.
  • Volumen de datos alineados (VolumeName.add): contiene exclusivamente el contenido real de los archivos, escrito de forma que el primer bloque de cada archivo comienza en un límite de bloque del sistema de archivos (por ejemplo, cada 128 KB en ZFS).

Gracias a este alineamiento, cuando el mismo archivo aparece en múltiples backups, ZFS puede reconocer que los bloques son idénticos y almacenarlos una sola vez. Según la documentación oficial de Bacula, esta técnica permite conseguir ratios de reducción de entre 4:1 y 40:1.

Requisitos previos

Para configurar la deduplicación en Bacula Community necesitarás:

  • Bacula Community 9.0.8 o superior (la versión actual es la 15.0.x)
  • El plugin bacula-aligned, disponible como paquete binario en bacula.org (requiere registro gratuito)
  • ZFS instalado y configurado como sistema de archivos para el almacenamiento de backups
  • RAM suficiente para la tabla de deduplicación de ZFS (aproximadamente 2,5 GB por cada TB de datos únicos con bloques de 128 KB)

Configuración paso a paso

1. Instalar el plugin Aligned Volumes

El plugin bacula-aligned se instala desde los repositorios oficiales de Bacula:

# Debian/Ubuntu
apt-get install bacula-aligned

# CentOS/RHEL
yum install bacula-aligned

El plugin se instala como bacula-sd-aligned-driver-<version>.so en el directorio de plugins del Storage Daemon (habitualmente /opt/bacula/plugins/). Tras la instalación, reinicia el Storage Daemon:

systemctl restart bacula-sd

2. Preparar el sistema de archivos ZFS con deduplicación

# Crear el pool ZFS para backups
zpool create backuppool /dev/sdb

# Crear el dataset para Bacula
zfs create backuppool/bacula-storage

# Activar deduplicación
zfs set dedup=on backuppool/bacula-storage

# Activar compresión nativa de ZFS (compatible con dedup)
zfs set compression=lz4 backuppool/bacula-storage

# Ajustar el tamaño de registro para coincidir con el alineamiento de Bacula
zfs set recordsize=128K backuppool/bacula-storage

# Asignar permisos al usuario bacula
chown bacula:bacula /backuppool/bacula-storage

Nota importante: se activa la compresión LZ4 de ZFS, que ofrece un excelente equilibrio entre ratio de compresión y rendimiento. La compresión de ZFS es compatible con la deduplicación porque opera a nivel de bloque del sistema de archivos, después de que ZFS haya identificado los bloques duplicados.

3. Configurar el Storage Daemon de Bacula

En el archivo bacula-sd.conf, asegúrate de que el directorio de plugins está definido en la sección Storage y configura un dispositivo de tipo Aligned:

Storage {
  Name = my-sd
  Plugin Directory = /opt/bacula/plugins
  # ... resto de configuración
}

Device {
  Name = "ZFS-Aligned-Device"
  Device Type = Aligned
  Media Type = AlignedFile
  Archive Device = /backuppool/bacula-storage
  LabelMedia = yes
  Random Access = yes
  AutomaticMount = yes
  RemovableMedia = no
  AlwaysOpen = no
  Maximum Concurrent Jobs = 1
  Minimum Block Size = 0
  Maximum Block Size = 128K
  File Alignment = 128K
  Padding Size = 512
  Minimum Aligned Size = 4096
}

Explicación de los parámetros clave:

  • Device Type = Aligned: activa el formato de volúmenes alineados. Es el parámetro fundamental que diferencia esta configuración de un dispositivo File estándar.
  • File Alignment = 128K: alinea el primer bloque de cada archivo al límite de 128 KB del sistema de archivos. Debe coincidir con el recordsize de ZFS.
  • Padding Size = 512: rellena con ceros el espacio entre el final de un archivo y el siguiente límite de bloque. Para ZFS, 512 bytes es el tamaño mínimo de bloque.
  • Minimum Aligned Size = 4096: los archivos menores de 4 KB se almacenan en el volumen de metadatos en lugar del volumen alineado, ya que son demasiado pequeños para beneficiarse de la deduplicación.
  • Maximum Concurrent Jobs = 1: obligatorio para dispositivos Aligned. No se puede cambiar.
  • Media Type = AlignedFile: debe ser un tipo diferente al de los dispositivos File no alineados para evitar conflictos.

4. Configurar el Director

En el archivo bacula-dir.conf, define el recurso Storage apuntando al nuevo dispositivo:

Storage {
  Name = AlignedStorage
  Address = storage-host
  SDPort = 9103
  Password = "tu-password-aqui"
  Device = ZFS-Aligned-Device
  Media Type = AlignedFile
}

Define también un Pool con políticas de retención adecuadas:

Pool {
  Name = Pool-Dedup
  Pool Type = Backup
  Recycle = yes
  AutoPrune = yes
  Volume Retention = 90 days
  Maximum Volume Bytes = 50G
  Maximum Volumes = 100
  Label Format = "Dedup-Vol-"
}

5. Configurar los Jobs de backup

Job {
  Name = "Backup-Servidor-Principal"
  Type = Backup
  Level = Incremental
  Client = servidor-principal-fd
  FileSet = "Full-Set"
  Schedule = "CicloSemanal"
  Storage = AlignedStorage
  Pool = Pool-Dedup
  Accurate = yes
  Messages = Standard
}

El parámetro Accurate = yes es recomendable: garantiza que los backups incrementales comparen checksums reales en lugar de basarse únicamente en las marcas de tiempo de los archivos, evitando copias innecesarias.

6. Desactivar la compresión de Bacula en los FileSets

Este punto es crítico. Cuando se utilizan Aligned Volumes, la compresión de software de Bacula debe estar desactivada en los FileSets:

FileSet {
  Name = "Full-Set"
  Include {
    Options {
      Signature = MD5
      # NO incluir Compression - destruye la deduplicación
    }
    File = /
  }
}

¿Por qué? Porque la compresión de Bacula se aplica antes de escribir los datos en el volumen. Dos archivos idénticos, al comprimirse en contextos diferentes (distintos jobs, distintos momentos), producen secuencias de bytes ligeramente diferentes. ZFS ve bloques distintos donde en realidad hay datos idénticos, y la deduplicación deja de funcionar. En cambio, la compresión LZ4 de ZFS se aplica después de la deduplicación y no interfiere con ella.

Complemento: Base Jobs para deduplicación a nivel de archivo

Además de los Aligned Volumes, Bacula Community ofrece una funcionalidad nativa llamada Base Jobs que proporciona deduplicación a nivel de archivo. Un Base Job respalda un conjunto de archivos de referencia (por ejemplo, el sistema operativo de una máquina plantilla), y los Jobs Full posteriores excluyen los archivos que no han cambiado respecto a la base.

# Definir el Job Base
Job {
  Name = "BaseJob-CentOS"
  Type = Backup
  Level = Base
  Client = plantilla-fd
  FileSet = "OS-FileSet"
  Storage = AlignedStorage
  Pool = BasePool
  Accurate = yes
}

# El Job normal referencia la base
Job {
  Name = "Backup-Servidor-01"
  Type = Backup
  Level = Full
  Client = servidor-01-fd
  FileSet = "Full-Set"
  Storage = AlignedStorage
  Pool = Pool-Dedup
  Base = BaseJob-CentOS
  Accurate = yes
}

Los Base Jobs son especialmente útiles en entornos con decenas de máquinas idénticas (mismo SO, mismas aplicaciones). Sin embargo, tienen limitaciones importantes: son incompatibles con Jobs de tipo Copy/Migration, no permiten podar registros de archivo, y cualquier cambio en los metadatos de un fichero (permisos, propietario) provoca que se respalde de nuevo.

La combinación óptima es utilizar Aligned Volumes + ZFS para deduplicación a nivel de bloque y, opcionalmente, Base Jobs para deduplicación adicional a nivel de archivo.

Caso práctico: ahorro real en números

Imaginemos una empresa con 20 servidores, cada uno con 200 GB de datos. Sin deduplicación, un backup completo semanal con incrementales diarios durante 90 días de retención podría requerir fácilmente entre 15 y 20 TB de almacenamiento.

Con Aligned Volumes, deduplicación ZFS y compresión LZ4 activadas:

  • Ratio de deduplicación típico: 5:1 (los 20 servidores comparten SO, aplicaciones y muchos documentos comunes).
  • Ratio de compresión adicional: 1.5:1 con LZ4.
  • Almacenamiento resultante: entre 2 y 4 TB, lo que supone un ahorro del 75-85%.

En términos económicos, esto puede significar la diferencia entre necesitar un NAS de 20 TB (con discos enterprise, unos 3.000-5.000 EUR) o uno de 4 TB (en torno a 800-1.200 EUR). A lo largo de varios años, con las renovaciones de discos incluidas, el ahorro acumulado es muy significativo.

Consideraciones de rendimiento y RAM

La deduplicación con ZFS no es gratuita en términos de recursos. Es fundamental dimensionar correctamente el hardware:

  • Memoria RAM: ZFS con deduplicación mantiene una tabla de hashes en memoria (DDT, Dedup Table). Cada entrada ocupa aproximadamente 320 bytes de RAM. Con bloques de 128 KB, esto supone unos 2,5 GB de RAM por cada TB de datos únicos almacenados. Si la DDT no cabe en RAM, el rendimiento se degrada severamente.
  • CPU: el cálculo de hashes consume ciclos de procesador, aunque en hardware moderno el impacto suele ser asumible.
  • SSD para caché: se recomienda encarecidamente utilizar un SSD como dispositivo de caché L2ARC en ZFS para mantener la tabla de deduplicación accesible cuando no cabe completamente en RAM.
  • Monitorización: es fundamental vigilar el ratio de deduplicación real para confirmar que el ahorro justifica el consumo de recursos.
# Comprobar el ratio de deduplicación actual
zpool list
zpool get dedupratio backuppool

# Verificar el consumo de memoria de la tabla de dedup
zdb -S backuppool

Importante: utiliza siempre zpool list para ver el espacio real utilizado, no df -h, ya que este último no refleja correctamente los ahorros de la deduplicación.

Resumen: qué necesitas para cada método

MétodoNivel de dedupPlugin necesarioSistema de archivosRatio típico
Aligned Volumes + ZFSBloque (128 KB)bacula-alignedZFS con dedup=on4:1 a 40:1
Base JobsArchivoNinguno (nativo)Cualquiera1:1 a 3:1
Global Endpoint DedupBloqueEnterprise (licencia)Cualquiera5:1 a 50:1

Conclusión

La deduplicación en Bacula Community es perfectamente viable gracias al plugin Aligned Volumes y a un sistema de archivos como ZFS. Aunque requiere instalar el plugin bacula-aligned y configurar correctamente tanto Bacula como ZFS, el resultado es una reducción de almacenamiento que puede alcanzar el 90%, con el consiguiente ahorro en costes de infraestructura.

Los puntos clave a recordar son: instalar el plugin Aligned, usar Device Type = Aligned en el Storage Daemon, desactivar la compresión de Bacula (usar la de ZFS en su lugar), y asegurarse de tener suficiente RAM para la tabla de deduplicación de ZFS.

En AZ Sistemes Informàtics implementamos soluciones de backup basadas en Bacula con deduplicación para nuestros clientes en Valencia y alrededores. Si necesitas optimizar tu estrategia de copias de seguridad o quieres saber cuánto podrías ahorrar en almacenamiento, contacta con nosotros y analizaremos tu caso sin compromiso.