Dla masowej pamięci masowej — biblioteki VOD, bufory catch-up, cele kopii zapasowych — ZFS RAID-Z2 to optymalne rozwiązanie: przetrwa dwie jednoczesne awarie dysków, ma doskonałą integralność danych dzięki sumom kontrolnym i skaluje się do petabajtów. Ten przewodnik konfiguruje pulę RAID-Z2 na Ubuntu dla serwera pamięci masowej.

Wymagania wstępne

  • Ubuntu 22.04 z dostępem root
  • Wiele identycznych dysków (minimum 4 dla RAID-Z2; 6-12 to typowa liczba)
  • Co najmniej 8 GB RAM (ZFS lubi RAM — 1 GB na TB to ogólna wytyczna dla dedup, znacznie mniej bez niego)

Krok 1 — Instalacja ZFS

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

Krok 2 — Identyfikacja dysków

Nigdy nie używaj nazw `/dev/sdX` dla ZFS — mogą się one zmienić po ponownym uruchomieniu. Użyj /dev/disk/by-id/, które są stabilne:

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

Zobaczysz wpisy takie jak ata-WDC_WD180EDGZ_XXXXXXX lub nvme-Samsung_SSD_.... Zwróć uwagę na te przeznaczone dla dysków danych (nie dysku systemowego).

Krok 3 — Tworzenie puli RAID-Z2

RAID-Z2 wykorzystuje pojemność odpowiadającą 2 dyskom na parzystość, przetrzymując dowolne 2 awarie. Z 8 dyskami 18 TB uzyskujesz ~108 TB użytecznej przestrzeni (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 wymusza wyrównanie sektorów 4K — jest to poprawne dla wszystkich nowoczesnych dysków, a błędne ustawienie później oznacza konieczność przebudowy puli. Sprawdź pulę:

zpool status tank
zpool list

Krok 4 — Dostrajanie dla obciążenia multimedialnego/pamięci masowej

Ustaw większy rozmiar rekordu (record size) dla dużych plików sekwencyjnych (wideo), włącz kompresję (prawie bezkosztową, pomaga nawet w przypadku metadanych wideo) i wyłącz atime (bezcelowe wzmocnienie zapisu):

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

recordsize=1M jest idealny do strumieniowania dużych plików. Jeśli ta pula będzie również przechowywać bazę danych lub wiele małych plików, utwórz dla niej osobny zbiór danych (dataset) z recordsize=16k.

Krok 5 — Tworzenie zbiorów danych (datasets)

Zbiory danych (datasets) są jak foldery z własnymi właściwościami. Organizuj według obciążenia:

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

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

Montują się automatycznie w /tank/vod, /tank/catchup itd.

Krok 6 — Dodawanie pamięci podręcznej NVMe (L2ARC) dla często odczytywanych danych

Jeśli Twoje obciążenie obejmuje często używane treści (popularne kanały w catch-up, popularne VOD), pamięć podręczna odczytu NVMe drastycznie zmniejsza obciążenie HDD. Dodaj zapasowy NVMe jako L2ARC:

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

Ustaw rozmiar L2ARC na ~5-10% rozmiaru puli. W przypadku obciążeń intensywnie zapisujących dane, oddzielne urządzenie SLOG (mirror dwóch małych, szybkich SSD) pomaga synchronizować zapisy, ale czyste serwowanie mediów rzadko tego wymaga.

Krok 7 — Konfiguracja automatycznych skanowań (scrubs)

Skanowania (scrubs) odczytują każdy blok i weryfikują sumy kontrolne, wykrywając ciche uszkodzenia danych, zanim się rozprzestrzenią. Zaplanuj miesięczne skanowanie:

# 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

Krok 8 — Monitorowanie stanu dysków

Skonfiguruj alerty e-mailowe dotyczące degradacji puli. Edytuj /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

Teraz, jeśli dysk ulegnie awarii, ZED natychmiast wyśle Ci e-mail. Z RAID-Z2 masz bufor na 2 awarie, ale powinieneś wymienić pierwszy uszkodzony dysk, zanim drugi ulegnie awarii.

Krok 9 — Wymiana uszkodzonego dysku

Gdy dysk ulegnie awarii, zpool status pokaże go jako DEGRADED. Wymień go:

# 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

Proces resilver na dysku 18 TB trwa 24-48 godzin. Pula pozostaje dostępna online i możliwa do odczytu przez cały czas — RAID-Z2 oznacza, że możesz stracić nawet kolejny dysk podczas resilver i nadal przetrwać.

Tabela referencyjna planowania pojemności

KonfiguracjaSurowaUżyteczna (RAID-Z2)Przetrwa
6× 18 TB108 TB72 TB2 awarie
8× 18 TB144 TB108 TB2 awarie
12× 18 TB216 TB180 TB2 awarie

Po przekroczeniu 12 dysków w pojedynczym vdev, podziel na wiele vdevów lub użyj RAID-Z3 — czasy odbudowy (resilver) na bardzo szerokich vdevach stają się własnym ryzykiem. Zobacz nasz pełny przewodnik po rozmiarach pamięci masowej.

Co dalej

Połącz to z gorącą warstwą NVMe dla aktywnych danych lub skonfiguruj z nami dedykowany serwer pamięci masowej. Aby uzyskać pełne obliczenia dotyczące pamięci masowej — wzrost catch-up, budżety odczytu, współczynniki trafień pamięci podręcznej — przeczytaj nasz post o rozmiarach pamięci masowej.