Para armazenamento em massa — bibliotecas VOD, buffers de catch-up, destinos de backup — o ZFS RAID-Z2 é o ideal: ele sobrevive a duas falhas de disco simultâneas, possui excelente integridade de dados via checksums e escala para petabytes. Este guia configura um pool RAID-Z2 no Ubuntu para um servidor de armazenamento.

Pré-requisitos

  • Ubuntu 22.04 com acesso root
  • Múltiplas unidades idênticas (mínimo de 4 para RAID-Z2; 6-12 é o típico)
  • Pelo menos 8 GB de RAM (ZFS gosta de RAM — 1 GB por TB é uma diretriz aproximada para dedup, muito menos sem)

Passo 1 — Instalar ZFS

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

Passo 2 — Identifique suas unidades

Nunca use nomes `/dev/sdX` para ZFS — eles podem mudar ao reiniciar. Use /dev/disk/by-id/ que são estáveis:

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

Você verá entradas como ata-WDC_WD180EDGZ_XXXXXXX ou nvme-Samsung_SSD_.... Anote as que correspondem às suas unidades de dados (não a unidade do sistema operacional).

Passo 3 — Crie o pool RAID-Z2

RAID-Z2 usa o equivalente a 2 unidades de capacidade para paridade, sobrevivendo a 2 falhas. Com 8 unidades de 18 TB, você obtém ~108 TB utilizáveis (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 força o alinhamento de setor de 4K — correto para todas as unidades modernas, e errar isso mais tarde significa reconstruir o pool. Verifique o pool:

zpool status tank
zpool list

Passo 4 — Otimize para uma carga de trabalho de mídia/armazenamento

Defina um recordsize maior para arquivos sequenciais grandes (vídeo), ative a compressão (quase sem custo, ajuda até mesmo nos metadados de vídeo) e desative atime (amplificação de gravação inútil):

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

recordsize=1M é ideal para streaming de arquivos grandes. Se este pool também armazenar um banco de dados ou muitos arquivos pequenos, crie um dataset separado com recordsize=16k para ele.

Passo 5 — Crie datasets

Datasets são como pastas com suas próprias propriedades. Organize por carga de trabalho:

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

# Backups compress better with gzip
zfs set compression=gzip-6 tank/backups

Eles montam automaticamente em /tank/vod, /tank/catchup, etc.

Passo 6 — Adicione um cache NVMe (L2ARC) para leituras frequentes

Se sua carga de trabalho tiver conteúdo frequente (canais principais em catch-up, VOD popular), um cache de leitura NVMe reduz drasticamente a carga do HDD. Adicione um NVMe sobressalente como L2ARC:

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

Dimensione o L2ARC para ~5-10% do tamanho do pool. Para cargas de trabalho com muitas gravações, um dispositivo SLOG separado (espelho de dois SSDs pequenos e rápidos) ajuda a sincronizar as gravações, mas o serviço de mídia puro raramente precisa disso.

Passo 7 — Configure scrubs automáticos

Scrubs leem cada bloco e verificam checksums, detectando corrupção silenciosa antes que ela se espalhe. Agende mensalmente:

# ZFS on Ubuntu ships a systemd timer — enable it
systemctl enable zfs-scrub-monthly@tank.timer
systemctl start zfs-scrub-monthly@tank.timer

# Run one now to establish a baseline
zpool scrub tank
zpool status tank   # watch progress

Passo 8 — Monitore a saúde da unidade

Configure alertas por e-mail para degradação do 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

Agora, se uma unidade falhar, o ZED enviará um e-mail imediatamente. Com RAID-Z2, você tem um buffer de 2 falhas, mas é recomendável substituir a primeira unidade com falha antes que uma segunda morra.

Passo 9 — Substituindo uma unidade com falha

Quando uma unidade falha, zpool status a mostra como DEGRADED. Substitua-a:

# Offline the dead drive
zpool offline tank ata-WDC_WD180EDGZ_DEADDRIVE

# Physically swap the disk, then replace in the pool
zpool replace tank ata-WDC_WD180EDGZ_DEADDRIVE /dev/disk/by-id/ata-WDC_WD180EDGZ_NEWDRIVE

# Watch resilver progress
zpool status tank

Um resilver em uma unidade de 18 TB leva de 24 a 48 horas. O pool permanece online e legível durante todo o processo — RAID-Z2 significa que você pode até perder outra unidade durante o resilver e sobreviver.

Referência de planejamento de capacidade

ConfiguraçãoBrutoUtilizável (RAID-Z2)Sobrevive
6× 18 TB108 TB72 TB2 falhas
8× 18 TB144 TB108 TB2 falhas
12× 18 TB216 TB180 TB2 falhas

Acima de 12 unidades em um único vdev, divida em múltiplos vdevs ou use RAID-Z3 — as janelas de resilver em vdevs muito amplos tornam-se um risco por si só. Veja nosso guia completo de dimensionamento de armazenamento.

Próximos passos

Combine isso com um tier NVMe de alta performance para dados ativos, ou dimensione um servidor de armazenamento dedicado conosco. Para a matemática completa de armazenamento — crescimento de catch-up, orçamentos de leitura, taxas de acerto de cache — leia nossa publicação sobre dimensionamento de armazenamento.