Proxmox Backup Server : Stockage ZFS
Un mémo sur la mise en place d’un stockake ZFS pour l’hébergement des sauvegardes d’un Proxmox Backup Server.
L’objectif premier était de concevoir une architecture de stockage à la fois performante, résiliente et facile à maintenir.
Le serveur à ma disposition dispose de 12 disques HDD de 8 To (7.3 To nets) et d’un RAID1 pour le système.
NB : Cet article se concentre exclusivement sur la configuration de ZFS. Il ne couvre pas l’intégration dans proxmox, ni les fonctionnalités avancées telles que les politiques de rétention (Prune), la collecte des données obsolètes (Garbage Collection), ou d’autres options spécifiques à PBS.
Pourquoi ZFS et RAIDZ2 ?
ZFS est un système de fichiers avec comme fonctions :
- Protection contre la corruption de données
- Compression native
- Snapshots incrémentaux
- Et une gestion avancée des volumes et disques.
RAIDZ2 est l’équivalent du RAID6 : il permet de tolérer la perte de deux disques par vdev sans perte de données.
Architecture retenue
Configuration :
- 2 vdevs de 5 disques en RAIDZ2
- 2 disques en spare
-
Détails :
- Disques actifs : 10 (5+5 + 2×parité RAIDZ2)
- Disques spare : 2 (remplacement automatique en cas de panne)
- Tolérance aux pannes : jusqu’à 2 disques HS par vdev
- Capacité utilisable : environ 58.4 To nets (8 disques × 7.3 To)
Pourquoi deux vdevs RAIDZ2 au lieu d’un seul ?
Choisir 2 vdevs RAIDZ2 au lieu d’un seul vdev de 12 disques RAIDZ2 présente plusieurs avantages :
- Performance accrue : les deux vdevs fonctionnent en parallèle → plus d’IOPS.
- Resilvering plus rapide : une reconstruction de disque touche seulement un vdev (6 disques), pas 12.
- Risque réduit : 3 disques HS ne sont pas fatal si répartis sur les 2 vdevs.
- Évolutivité : possibilité d’ajouter un 3e vdev plus tard sans casser le pool.
Création du pool ZFS avec 2 disques en spares
- Création du pool :
zpool create -o ashift=12 -o autotrim=on \ -O compression=lz4 -O atime=off -O xattr=sa -O acltype=posixacl \ pbs_pool \ raidz2 /dev/sd[a-e] \ raidz2 /dev/sd[f-j] \ spare /dev/sdk /dev/sdl
-o ashift=12
:-O compression=lz4
-O atime=off
-O xattr=sa
-O acltype=posixacl
pbs_pool
raidz2 /dev/sd[a-e]
raidz2 /dev/sd[f-j]
spare /dev/sdk /dev/sdl
- Lister le pool :
Définit la taille minimale d’allocation à 4 Ko (2^12 = 4096).
Une fois définie, cette valeur ne peut pas être changée.
Active la compression transparente avec l’algorithme LZ4 (rapide, efficace).
Réduit l’espace utilisé sans impacter les performances.
Désactive la mise à jour automatique de l’horodatage d’accès à chaque lecture.
Réduit significativement les écritures inutiles → plus de performance.
Stocke les attributs étendus (xattr) dans des structures ZFS internes (plutôt qu’en fichiers séparés).
Améliore les performances, notamment avec PBS.
Permet de gérer des ACL POSIX (permissions avancées).
Important si PBS gère plusieurs utilisateurs ou scripts avec droits précis.
Nom du pool ZFS, ici pbs_pool
Crée un vdev RAIDZ2 avec 6 disques (ici sda à sde).
Tolère la perte de 2 disques dans ce groupe.
Deuxième vdev RAIDZ2 identique au premier.
Les deux vdevs forment un pool unique avec une performance en lecture/écriture parallèle.
Définit deux disques de secours.
ZFS les utilise automatiquement si un disque actif tombe en panne (resilvering automatique).
NAME SIZE ALLOC FREE CKPOINT EXPANDSZ FRAG CAP DEDUP HEALTH ALTROOT pbs_pool 72.8T 1.37M 72.7T - - 0% 0% 1.00x ONLINE -
- zpool list affiche la taille brute du pool
Ici 2 vdevs en RAIDZ2 de 6 disques de 7.3 To.
RAIDZ2 utilise 2 disques pour la parité par vdev, donc :- 6 disques – 2 parités = 4 disques utiles × 2 vdevs = 8 disques utiles.
- 8 × 7.3 To = ≈ 58.4 To utilisables.
C’est la capacité effective, celle réellement disponible pour les données.
Pourquoi zpool list indique 72.8 To ?
Explication :
- ZFS additionne tous les disques du pool, même ceux réservés à la parité.
- 12 disques × 7.3 To ≈ 87.6 To physiques.
- Deux disques sont hot spares, donc non comptés ici.
- 10 disques actifs × 7.3 To = ≈ 72.8 To ➜ c’est bien ce que ZFS affiche le SIZE.
Important à retenir :
- SIZE ≠ capacité utilisable.
Pour connaître l’espace réel du stockage, faut retirer les disques de parité.
zpool status
pool: pbs_pool state: ONLINE config: NAME STATE READ WRITE CKSUM pbs_pool ONLINE 0 0 0 raidz2-0 ONLINE 0 0 0 sda ONLINE 0 0 0 sdb ONLINE 0 0 0 sdc ONLINE 0 0 0 sdd ONLINE 0 0 0 sde ONLINE 0 0 0 raidz2-1 ONLINE 0 0 0 sdf ONLINE 0 0 0 sdg ONLINE 0 0 0 sdh ONLINE 0 0 0 sdi ONLINE 0 0 0 sdj ONLINE 0 0 0 spares sdk AVAIL sdl AVAIL errors: No known data errors
- Création du dataset pour PBS :
zfs create -o mountpoint=/mnt/datastore/pbs pbs_pool/pbs
L’écart entre la capacité brute ZFS et celle exposée dans PBS s’explique en trois points :
-
Unités To vs TB :
ZFS indique en tébioctets (1 To = 2¹⁰ GiB), PBS en téraoctets décimaux (1 TB = 10¹² octets).
~58.4 To ZFS ≃ 64.2 TB décimaux. -
Overhead et réserves ZFS :
ZFS réserve slack space et métadonnées pour maintenir les perfs (80–85 % d’usage max recommandé). -
Datastore PBS :
PBS ne compte que l’espace réellement assigné à son point de montage, en arrondissant et en gardant une marge pour ses opérations internes.
Élément | Valeur approximative |
---|---|
Disques utiles (8 × 7.3 To) | ≈ 58.4 To |
Conversion To → TB | 58.4 × 1.0995 ≃ 64.2 TB |
Overhead ZFS + réserves PBS | – 15–20 % |
Capacité visible dans PBS | ≈ 47.2 TB |
Cette valeur reflète l’espace réellement exploitable et sécurisé pour les sauvegardes PBS.
Bonus : Resilvering (reconstruction de disque)
Le resilvering est le processus par lequel ZFS reconstruit les données d’un disque défaillant ou remplacé dans un pool RAIDZ, en utilisant les autres disques et les données redondantes (parité).
C’est l’équivalent du rebuild dans les RAID classiques.
Contrairement aux RAID matériels, ZFS ne recopie pas tout le disque, mais uniquement les blocs réellement utilisés, ce qui rend le resilvering souvent plus rapide et plus sûr.