ZFS pour débutants
(ikrima.dev)- Un guide d’introduction né d’une panne ZFS sur FreeNAS, qui couvre le dépannage, la création de nouveaux volumes et la stratégie de sauvegarde, en présentant dans un même fil les structures et commandes nécessaires lors des premiers pas avec ZFS
- ZFS fournit à la fois un système de fichiers et un gestionnaire de volumes logiques ; lancé chez Sun Microsystems, il s’appuie aujourd’hui principalement sur le code OpenZFS sous Linux, FreeBSD, etc.
- Sa structure de base se divise en vdev, qui regroupe des disques physiques, en pool, qui agrège ces vdev, en dataset, qui joue le rôle de système de fichiers, et en volume, exposé sous forme de périphérique bloc ; RAIDZ-1/2/3 tolèrent respectivement la panne de 1, 2 ou 3 disques
- Les commandes utilisées en pratique tournent autour de
zpool create/status/list/import/export/destroy/scrubetzfs create/mount/list/get/set/snapshot/diff/rollback/send/recv/destroy; pour éviter les problèmes liés aux changements de nom de périphérique, l’usage des UUID de périphérique est préférable - Les snapshots protègent de manière légère l’état à un instant donné et peuvent être répliqués vers un autre pool ou système avec
zfs send/recv, mais à eux seuls ils remplacent difficilement une sauvegarde ou un PRA
Concepts de base de ZFS
- ZFS est un système de fichiers local, comme ext4, NTFS ou exFAT, tout en jouant aussi le rôle de gestionnaire de volumes logiques, comme LVM sous Linux
- Il a été créé par Sun Microsystems, et le code source de ZFS était publié sous licence open source jusqu’au rachat de Sun par Oracle
- Comme le code déjà publié avait été porté sur plusieurs OS, le projet OpenZFS a ensuite été créé ; ce code est utilisé sur la plupart des systèmes de type Unix, notamment Linux et FreeBSD
- Le contenu est organisé du point de vue d’un débutant, afin d’aider les personnes qui découvrent ZFS à comprendre sa structure et ses commandes d’exploitation
Composants de ZFS
- Un vdev est constitué d’un ou plusieurs disques physiques, et peut aussi inclure des fichiers en plus des disques durs
- Il peut être combiné sous forme de mirror ou de RAIDZ
- Il existe 7 types de vdev, dont des types importants comme hot spare, L2ARC et ZIL
- Un pool est constitué d’un ou plusieurs vdev ; on y crée généralement des volumes ou des datasets
- Lors de la création d’un pool avec la commande
zpool, les vdev sont définis en même temps - On peut mélanger plusieurs types de vdev pour configurer un niveau RAIDZ
- Lors de la création d’un pool avec la commande
- Un dataset est le composant qui correspond à un système de fichiers dans ZFS
- On peut y configurer l’accès utilisateur, les quotas, la compression, les snapshots, etc.
- Un volume ressemble à un dataset, mais fournit une représentation sous forme de périphérique bloc
- Il ne propose qu’une partie des fonctionnalités d’un dataset
- Il est utile pour exécuter un autre système de fichiers au-dessus de ZFS ou exporter un extent iSCSI
Types de RAIDZ
- Le Dynamic/Simple Stripe, c’est-à-dire RAID0, répartit les données sans parité ; si un périphérique est perdu, toutes les données sont perdues
- Le MIRROR, c’est-à-dire RAID1, met les disques en miroir et s’utilise avec 2 à 4 disques, voire davantage
- RAIDZ-1, c’est-à-dire RAID5, répartit la parité avec les données et peut tolérer la perte d’un disque physique avant une défaillance RAID
- RAIDZ nécessite au minimum 3 disques
- RAIDZ-2, c’est-à-dire RAID6, peut tolérer la perte de jusqu’à 2 disques physiques
- RAIDZ-2 nécessite au minimum 4 disques
- RAIDZ-3 peut tolérer la perte de jusqu’à 3 disques physiques
- Il nécessite au minimum 4 disques, mais il vaut mieux éviter de l’utiliser avec moins de 5 disques
Création d’un pool et vérification de son état
- Un pool ZFS se crée sous la forme
zpool create [pool] [devices]- Exemple de pool sur disque unique :
zpool create tank /dev/sdb - Exemple de stripe sur 3 disques :
zpool create tank /dev/sdb /dev/sdc /dev/sdd - Exemple de mirror sur 2 disques :
zpool create tank mirror sdb sdc - Exemple de pool RAIDZ :
zpool create tank raidz sdb sdc sdd - RAIDZ2/3 peuvent être créés sous la forme
zpool create [pool name] raidz[1,2,3] [devices]
- Exemple de pool sur disque unique :
- Lors de la création du pool, l’option
-mpermet de définir le point de montage par défaut- Exemple :
zpool create tank -m /mnt/tank mirror sdb sdc
- Exemple :
- Les exemples utilisent des noms de périphériques de la forme
/dev/sdx, mais pour éviter les problèmes de démarrage causés par un changement de nom de périphérique, il est préférable d’utiliser les UUID de périphérique zpool statusest la commande de base pour vérifier l’état d’un poolstateindique si le pool est en lignestatusaffiche des informations supplémentaires sur le poolactionindique les actions de suivi nécessairesscanaffiche la progression d’un scrub ou l’état du dernier scruberrorsindique s’il existe des problèmes sur le pool
zpool listaffiche des informations détaillées comme la taille du pool, l’espace alloué, l’espace libre, la fragmentation, la capacité, la déduplication et l’état de santézpool historyaffiche l’historique des commandes utilisées pour modifier la configuration depuis la création du pool
Import, export, suppression et scrub d’un pool
- Après sa création, un pool est généralement importé et monté automatiquement, mais un import manuel peut être nécessaire après un dépannage ou une réinstallation de l’image système
- Exécuter
zpool importsans nom de pool affiche la liste des pools importables- Si aucun pool n’est importable, le message
no pools available to imports’affiche - En indiquant un nom de pool, le pool correspondant est importé ; la commande d’import effectue aussi le montage du pool
zpool import -aimporte tous les pools importables
- Si aucun pool n’est importable, le message
- Avec
-R, comme danszpool import -R /mnt/tank2 tank, le pool est monté à un emplacement alternate root- Il ne s’agit pas du chemin de montage du pool lui-même, mais d’un dossier racine alternatif
zpool export [pool name]effectue l’opération inverse de l’import : il tente d’exporter le pool après avoir démonté les systèmes de fichiers montés qu’il contient- Si le démontage d’un système de fichiers échoue,
-fpermet de forcer le démontage - Si un volume ZFS est en cours d’utilisation, l’export échouera même avec
-f
- Si le démontage d’un système de fichiers échoue,
zpool destroysupprime un pool ainsi que ses datasets ou volumes enfants- Il faut l’utiliser avec prudence, car toutes les données et tous les snapshots sont supprimés
- Un scrub ZFS vérifie la validité des données en comparant tous les blocs du pool avec leurs checksums connus
- Dans les vdev avec parité, il répare les données corrompues en utilisant les données des disques sains
- Pour préserver l’état du système, il faut exécuter des scrubs selon un planning
- Démarrer :
zpool scrub [pool] - Vérifier l’état : consulter la zone
scandezpool status - Arrêter :
zpool scrub -s [pool]
Création et montage de datasets
zfs createest la commande qui crée un nouveau système de fichiers ou volume ; ici, l’accent est mis sur les datasets plutôt que sur les volumeszfs create tank/dataset1créedataset1soustank- Le dataset
tankest créé automatiquement lors dezpool create
- Le dataset
zfs create -pcrée aussi les datasets parents manquants, commemkdir -p- Si le dataset parent n’existe pas, un
zfs createclassique échoue
- Si le dataset parent n’existe pas, un
- Exécuter
zfs mountsans argument affiche les systèmes de fichiers ZFS actuellement montés et leurs points de montage- Cette sortie n’inclut pas les datasets enfants
zfs mount [pool|dataset]monte le système de fichiers indiquézfs mount -amonte tous les systèmes de fichiers
- Un dataset enfant peut être monté même sans son dataset parent
- Dans ce cas, le chemin nécessaire est créé dans le système de fichiers de l’OS
- Si l’on tente ensuite de monter le dataset parent, une erreur
directory is not emptypeut se produire à cause du répertoire créé
zfs unmount [dataset]démonte le dataset indiqué
Consultation des datasets et configuration des propriétés
zfs list [dataset name]affiche les informations du dataset indiqué- On peut aussi passer un point de montage en argument à la place du nom du dataset
- Exécuter
zfs listsans nom de dataset affiche récursivement tous les datasets du système - Lorsqu’un nom de dataset est indiqué, l’option
-rpermet d’afficher récursivement ce qui se trouve sous ce dataset - Les propriétés ZFS contrôlent le comportement des systèmes de fichiers, volumes, snapshots et clones
- Elles peuvent ressembler à des options de montage
zfs get all [dataset]affiche toutes les propriétés d’un dataset- Une propriété précise se consulte par exemple avec
zfs get compression tank - La configuration d’une propriété se fait avec
zfs set- Exemple :
zfs set compression=lz4 tank - Après la configuration,
zfs get compression tankpermet de vérifier que la valeur decompressionest passée àlz4
- Exemple :
Fonctionnement et usages des snapshots
- Un snapshot enregistre l’état d’un système de fichiers à un instant donné, mais ne copie pas les fichiers
- Un snapshot marque les données existantes en lecture seule ; même si de nouvelles données sont ensuite ajoutées au système de fichiers, les blocs de données existants protégés par le snapshot ne sont pas affectés
- Le déroulé d’exemple est le suivant
- Créer snapshot 1 sur un système de fichiers contenant les données existantes Data A
- Ajouter ensuite Data B et créer snapshot 2
- Ajouter ensuite Data C
- Snapshot 1 protège Data A, et snapshot 2 protège Data A et Data B
- Même si snapshot 1 est supprimé, Data A reste protégée par snapshot 2
- La quantité de données utilisée par un snapshot est très faible
- En effet, au lieu de copier les fichiers, il enregistre le bloc de métadonnées de plus haut niveau du système de fichiers indiquant l’appartenance au snapshot
- Les snapshots sont utiles pour les tests de développement logiciel ou pour créer un filet de sécurité avant une mise à jour
- Un snapshot seul ne doit pas être considéré comme une solution de sauvegarde ou de PRA
Commandes de snapshot
- La création d’un snapshot utilise la forme
zfs snapshot [pool/dataset@snapshot_name]- Exemple :
zfs snapshot tank/dataset1@snapshot1
- Exemple :
- La liste des snapshots se consulte avec
zfs list -t snapshot - S’il existe plusieurs datasets enfants, on peut créer un snapshot du dataset de niveau supérieur ou un snapshot récursif avec l’option
-r- Exemple de snapshot classique :
zfs snapshot tank@snapshot-master - Exemple de snapshot récursif :
zfs snapshot -r tank@recursive
- Exemple de snapshot classique :
zfs diff [older snapshot] [newer snapshot]compare les différences entre snapshots- La sortie permet de vérifier les fichiers ajoutés et les chemins modifiés
- La restauration d’un snapshot s’effectue avec
zfs rollback [pool/dataset@snapshot_name]- Un rollback supprime les fichiers créés après le snapshot
- Les snapshots plus récents sont également supprimés ; dans ce cas, l’utilisation de l’option
-rpeut être demandée
ZFS send/recv et réplication
- ZFS send est une fonctionnalité qui permet d’envoyer un snapshot sous forme de flux de données
- On peut répliquer un snapshot et un dataset vers un fichier, un autre pool ou un autre système via SSH
- Les exemples utilisent deux pools nommés
tanketbackup- Le dataset
tank/Moviescontient 1,50 G de données - Avant le transfert, un snapshot est créé avec
zfs snapshot tank/Movies@$(date '+%Y-%m-%d_%H-%M') zfs send tank/Movies@2020-11-03_15-29 | zfs recv backup/Moviesenvoie le snapshot vers le poolbackup
- Le dataset
- Après le transfert,
backup/Moviesettank/Moviessont tous deux visibles danszfs list, et les snapshots des deux côtés sont également visibles aveczfs list -t snapshot zfs sendmérite d’être exploré pour ses nombreuses options et cas d’usage ; combiné à RAIDZ et aux snapshots, il peut rendre le système de fichiers plus robuste
Suppression de datasets et de snapshots
- La suppression d’un dataset utilise la forme
zfs destroy [pool/dataset]- L’option
-rpeut aussi être utilisée
- L’option
- La suppression d’un snapshot utilise également
zfs destroy [pool/dataset@snapshot_name]- L’option
-rpeut aussi être utilisée pour supprimer des snapshots
- L’option
- ZFS offre bien plus de fonctionnalités, mais ce document constitue surtout un point de départ pour apprendre les concepts et commandes de base
1 commentaires
Avis de Hacker News
Par exemple, pour créer un pool, il utiliserait simplement des valeurs par défaut raisonnables comme
ashift=12, la compressionlz4,xattr=sa,acltype=posixacl,atime=off, et le chiffrement se limiterait à activé/désactivé plutôt qu’à de multiples optionsIl devrait générer la clé de chiffrement, configurer un service
systemdqui déchiffre le pool au démarrage, et guider l’utilisateur pour sauvegarder la clé.zfs listdevrait indiquer si les datasets sont montés, s’ils sont chiffrés et si la clé est chargéeJ’aimerais supprimer les datasets récursifs et distinguer clairement pool et dataset avec
{pool}:{dataset}au lieu de{pool}/{dataset}. Il serait aussi préférable de ne pas avoir à nommer soi-même les pools ou snapshots, mais d’appliquer automatiquement des conventions comme{hostname}-[A-Z],{pool name}_{datetime created}et des noms courts numériquesLors de la création d’un pool, il ne faudrait pas avoir à saisir directement les identifiants de disque ; on créerait le pool avec
/dev/sda,/dev/sdb, puis des métadonnées seraient stockées sur les disques pour éviter toute confusion si l’ordre des lecteurs changeLa progression devrait toujours être affichée avec
pv, et il faudrait configurer automatiquement un scrub hebdomadaire ainsi que des snapshots horaires/journaliers/hebdomadaires/mensuels et leur nettoyageSi l’on envoie vers un disque sans pool, il devrait, après confirmation, créer un pool à disque unique avec les mêmes paramètres que le pool émetteur, et
zpooletzfsdevraient être fusionnés en une seule commandeLors de l’envoi de datasets chiffrés,
--rawdevrait être utilisé automatiquement, la valeur par défaut pour les envois devrait être--replicate, et-Idevrait être utilisé si possible. Il faudrait aussi ne pas cacher le système de fichiers des snapshots dans un répertoire masqué, et fournir un moyen simple de monter et parcourir les datasets de snapshotsashift=12ou la syntaxe{pool}:{dataset}, mais il semble déjà trop tard pour changer cela, et certaines propositions pourraient casser des cas d’usage que l’on ne connaît pasNommer les pools avec le nom d’hôte ne convient pas aux pools SAN qui peuvent être importés depuis plusieurs hôtes
À mon avis, le scrub hebdomadaire, les snapshots périodiques et le nettoyage périodique relèvent du planificateur du système d’exploitation. Fusionner
zpooletzfsserait sans doute possible, mais on finirait avec des choses commezfs -pool XXXX,zfs -volume XXXX, et je ne vois pas bien l’intérêtLes datasets récursifs sont réellement utiles dans certains cas. En revanche, je suis totalement d’accord pour dire que
zfs listdevrait indiquer si un dataset est monté, s’il est chiffré et si la clé est chargéeLa partie sur le fait de ne pas saisir d’identifiant de disque est ambiguë. On peut désigner les disques de plusieurs façons — ID, WWN, label,
sdX, etc. — mais il faut bien indiquer, d’une manière ou d’une autre, quels disques utiliserLa fonctionnalité qui consiste à stocker des métadonnées sur les disques pour les retrouver même si l’ordre change existe déjà. Si l’on rebranche quelques lecteurs autrement et que l’on importe le pool, il les retrouve
Certaines propositions seraient de bonnes valeurs par défaut, mais plusieurs semblent ne pas assez tenir compte des usages et besoins autres que les siens. ZFS vise un public beaucoup plus large
/dev/sda,/dev/sdbembrouille ZFS, franchement, ce n’est pas un problème de ZFS, mais plutôt un problème d’utilisateur qui ne l’utilise pas de manière adaptée à l’époque actuelleSous Linux, il existe depuis assez longtemps des références complètes comme
/dev/disk/by-id/ata-$manufactuer-$serial-$whatever. C’est ce genre de chemin qu’il faut utiliser pour créer un pool{pool}:{dataset}Si vous ne voulez pas nommer vous-même les snapshots, mon petit outil https://github.com/rollcat/zfs-autosnap peut convenir
Mettez
zfs-autosnap snapdans cron toutes les heures etzfs-autosnap gcune fois par jour, et il fera tourner l’historique des snapshots selon la politique de conservationIl n’est pas difficile d’utiliser un simple wrapper de commandes ZFS ; vous pouvez donc reprendre mon code et créer votre propre outil
Au travail aussi, nous avons écrit plusieurs scripts pour créer des ensembles ZFS adaptés au type de déploiement prévu ce jour-là. Ils incluaient la création de volumes chiffrés LUKS sur lesquels placer des zvol, la standardisation des conventions de nommage et la définition de valeurs par défaut comme
ashift=12et la compressionlz4C’était bien avant l’arrivée du chiffrement natif de ZFS, et comme cette approche fonctionne encore sans problème, nous n’avons pas mis à jour les scripts pour prendre en charge le chiffrement ZFS
Aujourd’hui, je ne me souviens plus de nombreux flags, mais les scripts font office de documentation, et les autres membres de l’équipe n’ont qu’à exécuter
make-zfs-big-mirroroumake-big-zfs-undundant-raid0Si un jour il faut provisionner des systèmes plus de 20 fois par an, même cela pourra être automatisé par le provisioning
Dire qu’il ne faudrait pas nommer les pools n’a pas de sens. On ne crée pas des pools si souvent que cela, donc il suffit de leur donner un nom
Si vous ne voulez pas nommer les snapshots, vous pouvez utiliser
httmetzfs allow. Par exemple,httm -S .crée un snapshot commerpool/ROOT/ubuntu_tiebek@snap_2022-12-14-12:31:41_httmSnapFileMountzfsetzpoolsont chacun de très bonnes commandes Unix avec plusieurs sous-commandes. Je pense que les concepteurs de ZFS ont pris une décision très intelligente en ne créant pas une commande d’administration unique plus complexeMonter et parcourir explicitement un dataset de snapshots se fait aussi facilement avec
zfs mount. Cela dit, j’aimerais que l’on reconnaisse aussi qu’une interface virtuelle stable facilite la recherche dans toutes les versions d’un fichier, et que c’est beaucoup plus difficile avec btrfs, entre autres.httmmérite aussi d’être consulté[0]: https://kimono-koans.github.io/opinionated-guide/#dynamic-sn...
Il y a d’autres choses utiles dans ZFS. Il est bon de connaître la différence entre
zpool-attach(8)etzpool-replace(8), etzfs list -t all -o spacemontre où l’espace est utilisé.Pour protéger le système d’exploitation avant de gros changements ou mises à niveau, les ZFS Boot Environments sont la meilleure fonctionnalité. Pour commencer, https://is.gd/BECTL peut être utile.
zpool history poolnameaffiche toute la configuration du pool et l’historique des modifications. Par exemple, des changements commezpool create,autotrim=on,atime=off,compression=zstd,recordsize=1my sont enregistrés.Il manque aussi des informations importantes dans le guide. Un miroir 3-way conserve les données même si 2 disques sur 3 tombent en panne ; un miroir 4-way les conserve même si 3 disques sur 4 tombent en panne ; et un miroir N-way préserve les données même si N-1 disques sur N tombent en panne.
C’est utile quand les données sont primordiales, mais qu’on n’a pas beaucoup d’emplacements ou de disques.
J’exploite depuis plusieurs années de grosses bases de données PostgreSQL de plusieurs To sur ZFS. Grâce à ZFS, les sauvegardes, la création d’environnements de test à partir d’anciens instantanés et les économies de disque via la compression intégrée sont devenues très simples.
Si cela vous intéresse, vous pouvez lire ce retour d’expérience sur https://lackofimagination.org/2022/04/our-experience-with-po....
Ce qui m’a le plus aidé pour débuter avec ZFS, ce sont le ZFS Handbook de FreeBSD et les articles d’Aaron Toponce.
[0] https://docs.freebsd.org/en/books/handbook/zfs/
1 https://pthree.org/2012/04/17/install-zfs-on-debian-gnulinux...
J’ai installé FreeBSD sur un vieux HP Microserver avec 1 Go de RAM ECC qui traînait, et comme j’avais aussi cinq vieux disques durs de 500 Go, je les ai configurés en miroir 5x en suivant le FreeBSD Handbook. C’était ma première fois avec FreeBSD, et ça s’est fait très facilement.
Récemment, en reconstruisant une bonne partie d’une infrastructure principalement composée de serveurs LAMP, j’ai décidé de tout baser sur ZFS sous Linux pour bénéficier d’une réplication de sauvegarde efficace et du chiffrement.
J’utilisais depuis longtemps ZFS avec
rsyncpour les sauvegardes, donc j’étais assez à l’aise et, au final, cela a bien fonctionné, mais faire les choses correctement m’a pris beaucoup plus de temps que prévu. En particulier, il y avait beaucoup de mauvais conseils sur le Web concernant les bases de données et la réplication.Pour les bases de données, il faut au minimum effectuer les réglages de base, comme l’alignement de la taille des blocs. Pour mariadb/InnoDB, la ressource de Let’s Encrypt https://github.com/letsencrypt/openzfs-nvme-databases était de très loin la meilleure. Elle justifie chaque point et cite plusieurs sources, ce qui lui donne beaucoup de valeur.
Si l’on cherche davantage sur le Web, on tombe sans fin sur des conseils contradictoires, des anecdotes et des mythes, accompagnés de théories incomplètes et infondées. Au bout du compte, il faut tester soi-même, comprendre ce que l’on ajuste, et il est aussi tout à fait acceptable de décider de ne pas ajuster certains paramètres.
Pour la réplication, je recommande vraiment les pages de manuel. ZFS fournit des outils de réplication solides, mais ils sont tellement génériques qu’ils donnent l’impression de commandes de bas niveau à la Git. Comme ils ne supposent pas qu’on utilisera SSH, il faut assembler soi-même les morceaux, et si l’on veut automatiser, il faut aussi penser aux conditions limites, ce qui peut paraître intimidant au début.
C’est pourquoi tout le monde se tourne vers des outils comme
syncoid, mais les scripts de réplication du genresyncoidavaient quelque chose d’horrible : ils n’utilisent pas le modesend --replicationde ZFS et le réimplémentent imparfaitement en Perl au motif que ce serait plus flexible.Lors des premiers tests, quand on restaure à neuf et qu’on voit que toutes les racines de chiffrement sont cassées et que toutes les propriétés des datasets ne sont pas synchronisées automatiquement, il y a de quoi devenir fou. Avec les seules options de réplication récursives intégrées, ZFS gère cela.
Si l’on se décide à écrire son propre script, ce n’est pas difficile. Il suffit de rester simple et de ne pas empiler des tas de choses inutiles dans le pipeline comme
syncoid. Lors de vrais tests, ces éléments peuvent même ralentir le processus. On affiche la progression avecpvet on envoie simplement les données, et ça fonctionne rapidement.Je publierai peut-être un jour mon script de réplication. J’ai l’impression qu’il existe très peu de bons scripts de référence qui couvrent les bases sans réimplémenter la réplication de travers.
io_capacityetio_capacity_max, mais quand on ouvre la documentation MySQL pour voir le rôle réel de ces paramètres, ils ne sont malheureusement pas très utiles.Ces valeurs contrôlent les E/S en arrière-plan, comme la fusion du change buffer, et peuvent détourner des E/S des processus principaux qui en ont réellement besoin.
D’après mon expérience avec une base MySQL assez chargée à 120K QPS, je n’ai eu besoin de toucher à aucun des deux. Si vous pensez en avoir besoin, il faut d’abord surveiller le temps de remplissage du redo log et la proportion de pages sales dans le buffer pool. Il vaudra probablement mieux ajuster d’autres paramètres.
[0] https://dev.mysql.com/doc/refman/8.0/en/innodb-parameters.ht...
À un certain niveau, cela peut être plus efficace, mais d’après mon expérience, cela réduit fortement le taux de compression.
Effet secondaire intéressant : selon la charge de travail, si la bande passante disque est le goulot d’étranglement, le débit peut même se dégrader. Grâce à la compression, on peut lire et écrire plus vite que ce que le disque physique supporterait normalement ; si l’on casse la compression, cela peut nuire à la bande passante en lecture/écriture.
J’ai commencé à utiliser ZFS sous Linux il y a quelques années, et dans l’ensemble tout s’est bien passé.
La seule chose qui m’a surpris, c’est que la valeur par défaut de volblocksize est assez mauvaise pour la plupart des configurations RAIDZ. Il faut l’augmenter si l’on ne veut pas perdre 50 % de l’espace disque brut.
Les articles liés sont les suivants :
https://jro.io/nas/#overhead
https://openzfs.github.io/openzfs-docs/Basic%20Concepts/RAID...
https://www.delphix.com/blog/zfs-raidz-stripe-width-or-how-i...
J’ai fini par consulter l’une des feuilles de calcul consacrées à ZFS.
ZFS overhead calc.xlsx
https://docs.google.com/spreadsheets/d/1tf4qx1aMJp8Lo_R6gpT6...
RAID-Z parity cost
https://docs.google.com/spreadsheets/d/1pdu_X2tR4ztF6_HLtJ-D...
Quand j’étais plus jeune et plus idiot, j’ai lu beaucoup de textes de passionnés expliquant à quel point les OS de NAS open source — probablement FreeNAS — et ZFS étaient formidables. J’ai acheté sur eBay un microserveur HP d’occasion aux caractéristiques très modestes, et je me suis lancé sans vraiment savoir ce que je faisais.
J’ai posé quelques questions sur les forums de la communauté, mais la plupart des réponses étaient : « Avez-vous lu la documentation ? » ou « Avez-vous assez de RAM ? »
Cette fameuse documentation était une présentation PowerPoint au style difficile à lire, au ton un peu évangélisateur, avec beaucoup de prérequis implicites, et elle n’était pas mise à jour régulièrement. La quantité de RAM nécessaire était aussi floue, l’idée étant surtout d’en mettre autant que possible.
Au final, j’ai ignoré tous les signaux d’alerte concernant la technologie, l’ambiance exagérément enthousiaste et mon propre niveau de connaissances, et j’ai perdu beaucoup de données. J’ai beaucoup appris.
Le système de fichiers est devenu bien plus stable, et la documentation me semble aussi plus claire.
Cela dit, comme il est plus puissant et plus avancé qu’un système de fichiers journalisé traditionnel comme ext3, il offre aussi davantage de moyens de se tirer une balle dans le pied.
Pour en laisser quelques éléments pour plus tard : dans ZFS, toute la redondance se situe au niveau des vdev. Un zpool est constitué d’un ou plusieurs vdev, et dans tous les cas, si vous perdez ne serait-ce qu’un vdev dans un zpool, le zpool est définitivement détruit.
Historiquement, RAIDZ, c’est-à-dire le RAID à parité, ne pouvait pas être étendu en ajoutant des disques. La seule façon d’agrandir un RAIDZ était de remplacer chaque disque de la grappe, un par un, par un disque plus grand, en espérant qu’aucun disque ne tombe en panne pendant la reconstruction.
À vue de nez, et de manière très amateur, je n’envisagerais RAIDZ que dans les cas avec beaucoup de disques, comme RAIDZ2 ou RAIDZ3. Si n<=6 et que le budget le permet, j’utiliserais plusieurs vdev en miroir. En production, il faudrait examiner plus en détail les métriques de performances en lecture/écriture des différents RAID.
Cela dit, je ne recommanderais RAIDZ1 que si vous avez une sauvegarde complète sur site et une assez grande confiance dans vos compétences et votre supervision.
Dans mon cas, j’ai un pool de 3x3 disques, et j’envoie les snapshots vers une cible de sauvegarde située quelques U plus bas dans le rack. Cette cible de sauvegarde se réveille chaque jour, possède un pool de 3x4 disques, et utilise elle aussi RAIDZ1.
Si un disque tombe en panne dans le NAS, mon plan est de lancer immédiatement la sauvegarde pour qu’elle reçoive les snapshots, puis de remplacer le disque. Cela minimise la probabilité de perdre des données à cause d’une deuxième panne de disque pendant le resilvering.
Les données vraiment importantes sont bien sûr aussi stockées hors site.
Je rencontre un problème ZFS que je ne comprends pas. Sur un certain zpool,
zpool statusaffiche une liste d’erreurs détectées, mais elles ne se trouvent pas dans des fichiers : elles apparaissent toujours uniquement dans des snapshots, et probablement dans des entrées hexadécimales qui semblent correspondre à des snapshots supprimés.Si je supprime le snapshot signalé comme erroné et que je lance deux fois
zpool scrub, les erreurs disparaissent et le scrub ne trouve rien.zpool statusn’a jamais indiqué d’erreur sur le moindre périphérique.Il n’y a pas d’erreurs dans les fichiers, pas d’erreurs sur les périphériques, et aucune erreur détectée par le scrub, mais en fonctionnement, une douzaine de nouvelles « erreurs » apparaissent chaque jour dans
zpool status. Je ne comprends pas comment cela peut arriver.Le premier lien peut sembler étrange, mais c’est bien l’interface web normale de la liste de diffusion.
Impossible de le déplacer ou de le modifier ; on peut seulement le supprimer. Je n’ai aucune idée de la raison pour laquelle ces fichiers se corrompent. Heureusement, il ne s’agissait que de grosses ISO Linux, donc ce n’était pas catastrophique.