16 votes

Comment 'rebalancer' les données dans ZFS? (Assurez-vous que les données sont réparties entre tous les miroirs rayés)

En utilisant un miroir rayé (Raid 10) comme exemple, si deux disques sont étendus à quatre, comment les données des deux disques peuvent-elles être 're-balancées' (réparties) entre les deux miroirs?

Autrement dit, comment les fichiers qui ont été écrits sur un miroir peuvent-ils être écrits sur deux miroirs pour tirer parti des disques rayés?

9 votes

@ewwhite Parfois, vous n'avez pas cette option.

7 votes

@ewwhite Et parfois la croissance ne peut pas être anticipée correctement, car elle dépend du marché extérieur. Vos conseils ne seraient valables que si vous aviez également une machine à remonter le temps fonctionnelle.

12voto

user121391 Points 2362

Seules les données nouvellement écrites (ajoutées) sont réparties entre tous les vdevs actuellement actifs, il n'y a pas d'opération de rééquilibrage explicite dans ZFS.

Deux solutions possibles :

  1. Attendre que toutes les anciennes données soient à nouveau écrites (à cause de la copie sur écriture, cela peut prendre très longtemps, dans le pire des cas, doubler le temps nécessaire pour écrire complètement le disque).
  2. Supprimer toutes les données et les réécrire (zfs send/recv est utile pour transférer toutes les données hors du pool et les remettre sans rien perdre). Cela ne doit pas nécessairement être fait en une seule fois, et cela peut être fait sur le même pool.

Pour être plus précis, je choisirais la deuxième solution et transférerais chaque système de fichiers séparément aux moments où la charge du système est faible (par exemple la nuit) :

  • Prendre un instantané (zfs snapshot -r) d'un système de fichiers de taille décente (et des systèmes de fichiers descendants, de manière récursive)
  • Utiliser zfs send | zfs recv avec les options appropriées pour envoyer l'instantané vers un nouveau système de fichiers temporaire (qui peut être sur le même pool si l'espace le permet) ; ce système de fichiers doit être situé au même endroit dans la hiérarchie que l'ancien
  • Après que la copie soit terminée (cela peut prendre un certain temps, car les disques doivent lire et écrire), zfs destroy l'ancien instantané et l'ancien système de fichiers
  • zfs rename le système temporaire avec l'ancien nom
  • Vérifier et modifier les points de montage avec zfs mount, réorganisant la situation précédente pour votre système de fichiers remplacé
  • Répéter jusqu'à ce que tous les systèmes de fichiers soient déplacés

3 votes

Si cela était fait dans la même piscine, cela n'affecterait-il pas la fragmentation?

7voto

jason_uruguru Points 61

3ème solution possible (comme mentionné par SirMaster dans ce forum FreeNAS post) :

  • ajouter un/des nouveau(x) disque(s) au zpool
  • copier de nombreux fichiers vers un nouveau répertoire /mnt/pool/temp/
  • supprimer les fichiers originaux : rm -rf original/
  • renommer le répertoire : mv temp/ original/

Cela fonctionne car ZFS va proportionnellement placer les écritures sur le vdev ayant le plus d'espace libre, dans ce cas les nouveaux disques qui étaient vides. (à partir de 0.7, zfs va privilégier des disques plus rapides pour les écritures, mais supposons que vos 2 nouveaux disques ont les mêmes performances ou supérieures aux disques originaux)

C'est probablement plus lent que zfs send | zfs recv, mais plus simple car vous n'avez pas à créer/détruire des instantanés.

Vous pouvez exécuter zpool list -v avant et après pour voir l'utilisation de chaque vdev.

J'ai également trouvé un script php qui effectue la procédure de copie/suppression/renommer sur une base de fichier par fichier. Cela a été lié dans une réponse similaire (mais zvol) à une question plus ancienne de quelques années. (je n'ai pas personnellement testé ce script)

3 votes

Merci, j'ai utilisé cette technique pour rééquilibrer mon laboratoire domestique après avoir étendu le pool avec un nouveau vdev raidz1. Ça a bien fonctionné.

0 votes

Soyez conscient - cette approche pourrait ne pas fonctionner comme vous vous y attendez...consultez les réponses de Cyberjock dans le fil de discussion lié à ce message.

1 votes

@quantum Ce "cyberjock" de il y a une décennie semblait inventer des choses. Il ne pouvait jamais répondre à des questions spécifiques sur les IOPS après le rééquilibrage, se contentant de prétendre être une sorte d'expert.

0voto

FlexMcMurphy Points 232

Ceci est similaire à la réponse de l'utilisateur121391, mais je viens de terminer une opération de rééquilibrage en utilisant l'excellent article de blog de Jim Salter datant de quelques années. Essentiellement, vous :

  1. Scrubbez votre pool et vérifiez l'état.
  2. Libérez un disque de chaque miroir en utilisant zpool detach.
  3. Créez un nouveau pool en utilisant les disques libérés.
  4. Copiez les données vers le nouveau pool. J'ai utilisé son syncoid pour cela.
  5. Scrubbez le nouveau pool et vérifiez l'état.
  6. zpool destroy votre ancien pool après avoir murmuré les formules porte-bonheur dont vous avez besoin.
  7. zpool attach les disques restants au nouveau pool.
  8. Renommez le nouveau pool avec le nom d'origine.

SistemesEz.com

SystemesEZ est une communauté de sysadmins où vous pouvez résoudre vos problèmes et vos doutes. Vous pouvez consulter les questions des autres sysadmins, poser vos propres questions ou résoudre celles des autres.

Powered by:

X