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 versionPaso 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 partVerá 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_DRIVE8ashift=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 listPaso 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 tankrecordsize=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/backupsSe 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 tankDimensione 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 progresoPaso 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-zedAhora, 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 tankEl 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ón | Bruto | Utilizable (RAID-Z2) | Sobrevive |
|---|---|---|---|
| 6× 18 TB | 108 TB | 72 TB | 2 fallos |
| 8× 18 TB | 144 TB | 108 TB | 2 fallos |
| 12× 18 TB | 216 TB | 180 TB | 2 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.