Para almacenamiento masivo —bibliotecas VOD, búferes de catch-up, destinos de copia de seguridad— ZFS RAID-Z2 es el punto óptimo: sobrevive a dos fallos de disco simultáneos, tiene una excelente integridad de datos mediante checksums y escala a petabytes. Esta guía configura un pool RAID-Z2 en Ubuntu para un servidor de almacenamiento.

Requisitos previos

  • Ubuntu 22.04 con acceso root
  • Múltiples unidades idénticas (mínimo 4 para RAID-Z2; 6-12 es lo típico)
  • Al menos 8 GB de RAM (a ZFS le gusta la RAM — 1 GB por TB es una guía aproximada para la deduplicación, mucho menos sin ella)

Paso 1 — Instalar ZFS

apt update
apt install -y zfsutils-linux
modprobe zfs
zfs version

Paso 2 — Identificar sus unidades

Nunca use los nombres `/dev/sdX` para ZFS — pueden cambiar al reiniciar. Use /dev/disk/by-id/ que son estables:

ls -l /dev/disk/by-id/ | grep -v part

Verá entradas como ata-WDC_WD180EDGZ_XXXXXXX o nvme-Samsung_SSD_.... Anote las que corresponden a sus unidades de datos (no la unidad del sistema operativo).

Paso 3 — Crear el pool RAID-Z2

RAID-Z2 utiliza la capacidad equivalente a 2 unidades para paridad, sobreviviendo a cualquier 2 fallos. Con 8 unidades de 18 TB, obtiene ~108 TB utilizables (6 × 18 TB):

zpool create -f -o ashift=12 tank raidz2 \
  /dev/disk/by-id/ata-WDC_WD180EDGZ_DRIVE1 \
  /dev/disk/by-id/ata-WDC_WD180EDGZ_DRIVE2 \
  /dev/disk/by-id/ata-WDC_WD180EDGZ_DRIVE3 \
  /dev/disk/by-id/ata-WDC_WD180EDGZ_DRIVE4 \
  /dev/disk/by-id/ata-WDC_WD180EDGZ_DRIVE5 \
  /dev/disk/by-id/ata-WDC_WD180EDGZ_DRIVE6 \
  /dev/disk/by-id/ata-WDC_WD180EDGZ_DRIVE7 \
  /dev/disk/by-id/ata-WDC_WD180EDGZ_DRIVE8

ashift=12 fuerza la alineación de sectores de 4K — correcto para todas las unidades modernas, y si se hace mal más tarde significa reconstruir el pool. Verifique el pool:

zpool status tank
zpool list

Paso 4 — Ajustar para una carga de trabajo de medios/almacenamiento

Establezca un recordsize mayor para archivos secuenciales grandes (video), habilite la compresión (casi gratuita, ayuda incluso con los metadatos de video) y deshabilite atime (amplificación de escritura inútil):

zfs set recordsize=1M tank
zfs set compression=lz4 tank
zfs set atime=off tank
zfs set xattr=sa tank

recordsize=1M es ideal para transmitir archivos grandes. Si este pool también contendrá una base de datos o muchos archivos pequeños, cree un dataset separado con recordsize=16k para ello.

Paso 5 — Crear datasets

Los datasets son como carpetas con sus propias propiedades. Organice por carga de trabajo:

zfs create tank/vod
zfs create tank/catchup
zfs create tank/backups

# Las copias de seguridad se comprimen mejor con gzip
zfs set compression=gzip-6 tank/backups

Se montan automáticamente en /tank/vod, /tank/catchup, etc.

Paso 6 — Añadir una caché NVMe (L2ARC) para lecturas frecuentes

Si su carga de trabajo tiene contenido frecuente (canales principales en catch-up, VOD popular), una caché de lectura NVMe reduce drásticamente la carga del HDD. Añada un NVMe de repuesto como L2ARC:

zpool add tank cache /dev/disk/by-id/nvme-Samsung_SSD_980_CACHE
zpool status tank

Dimensione L2ARC a ~5-10% del tamaño del pool. Para cargas de trabajo con muchas escrituras, un dispositivo SLOG separado (espejo de dos SSD pequeños y rápidos) ayuda a sincronizar las escrituras, pero el servicio de medios puro rara vez lo necesita.

Paso 7 — Configurar scrubs automáticos

Los scrubs leen cada bloque y verifican los checksums, detectando la corrupción silenciosa antes de que se propague. Programe mensualmente:

# ZFS en Ubuntu incluye un temporizador systemd — actívelo
systemctl enable zfs-scrub-monthly@tank.timer
systemctl start zfs-scrub-monthly@tank.timer

# Ejecute uno ahora para establecer una línea base
zpool scrub tank
zpool status tank   # ver progreso

Paso 8 — Monitorear la salud de las unidades

Configure alertas por correo electrónico para la degradación del pool. Edite /etc/zfs/zed.d/zed.rc:

ZED_EMAIL_ADDR="you@yourdomain.com"
ZED_NOTIFY_INTERVAL_SECS=3600
ZED_NOTIFY_VERBOSE=1
systemctl restart zfs-zed

Ahora, si una unidad falla, ZED le enviará un correo electrónico inmediatamente. Con RAID-Z2 tiene un búfer de 2 fallos, pero querrá reemplazar la primera unidad fallida antes de que muera una segunda.

Paso 9 — Reemplazar una unidad fallida

Cuando una unidad falla, zpool status la muestra como DEGRADED. Reemplácela:

# Desconecte la unidad muerta
zpool offline tank ata-WDC_WD180EDGZ_DEADDRIVE

# Intercambie físicamente el disco, luego reemplácelo en el pool
zpool replace tank ata-WDC_WD180EDGZ_DEADDRIVE /dev/disk/by-id/ata-WDC_WD180EDGZ_NEWDRIVE

# Observe el progreso del resilver
zpool status tank

El resilver en una unidad de 18 TB tarda entre 24 y 48 horas. El pool permanece en línea y legible en todo momento — RAID-Z2 significa que incluso puede perder otra unidad durante el resilver y sobrevivir.

Referencia de planificación de capacidad

ConfiguraciónBrutoUtilizable (RAID-Z2)Sobrevive
6× 18 TB108 TB72 TB2 fallos
8× 18 TB144 TB108 TB2 fallos
12× 18 TB216 TB180 TB2 fallos

Más allá de 12 unidades en un solo vdev, divida en múltiples vdevs o use RAID-Z3 — las ventanas de resilver en vdevs muy amplios se convierten en un riesgo por sí mismas. Consulte nuestra guía completa de dimensionamiento de almacenamiento.

Próximos pasos

Combine esto con un nivel caliente NVMe para datos activos, o dimensione un servidor de almacenamiento dedicado con nosotros. Para las matemáticas completas del almacenamiento — crecimiento de catch-up, presupuestos de lectura, tasas de acierto de caché — lea nuestra publicación sobre dimensionamiento de almacenamiento.