ZFS: redistribuer zvol sur tous les disques du zpool?

12

Existe-t-il un moyen de demander à ZFS de redistribuer un système de fichiers donné sur tous les disques de son zpool?

Je pense à un scénario où j'ai un volume ZFS de taille fixe qui est exporté en tant que LUN sur FC. Le zpool actuel est petit, seulement deux disques en miroir de 1 To, et le zvol est de 750 Go au total. Si je devais soudainement étendre la taille du zpool à, disons, 12 disques de 1 To, je pense que le zvol serait toujours effectivement «logé» sur les deux premières broches uniquement.

Étant donné que plus de broches = plus d'IOPS, quelle méthode pourrais-je utiliser pour «redistribuer» le zvol sur les 12 broches pour en tirer parti?

grandir
la source

Réponses:

8

Vous devrez réécrire vos données dans le zpool étendu afin de le rééquilibrer. Sinon, au fil du temps, vos écritures seront réparties sur l'ensemble du pool.

ewwhite
la source
Je ne suppose pas qu'il existe un moyen rapide et facile de le faire ...?
growse
7
zfs send | zfs recv
le-wabbit
Je vais tester cela - je ne peux pas croire que quelque chose d'aussi simple le ferait. :)
growse
3
Faites un rapport, je ne l'ai jamais fait et je suis curieux aussi.
StrangeWill
3

Il n'y a aucune raison pour que le zvol soit stocké uniquement sur les périphériques initiaux. Si vous agrandissez le pool, ZFS couvrira les données mises à jour sur tous les périphériques sous-jacents disponibles. Il n'y a pas de partitionnement fixe avec ZFS.

jlliagre
la source
4
D'après mon expérience, ce n'est pas vrai. Bien qu'il n'y ait pas de «partitionnement fixe», ZFS ne déplace pas les données de son plein gré en dehors des demandes d'E / S client. Si vous créez le scénario que j'ai décrit, ajoutez plus de disques, puis effectuez des E / S lourdes sur le LUN d'origine, vous ne verrez d'activité que sur les deux premiers disques de la baie, car c'est là que se trouvent les données. ewwhite souligne qu'au fil du temps, il est équilibré, mais je suis curieux de savoir s'il existe un moyen plus rapide de le faire.
growse
1
Désolé si je n'ai pas été clair. Bien sûr, les données existantes ne se déplaceront pas comme par magie. Seules les données mises à jour seront déplacées uniformément. C'est ce que je voulais dire par "nouvelles E / S". En ce qui concerne les données statiques existantes, la mise en cache améliorera également les performances tant que les blocs sont lus plusieurs fois.
jlliagre
0

Ceci est une "continuation" de la réponse d'ewwhite:

Vous devrez réécrire vos données dans le zpool étendu afin de le rééquilibrer

J'ai écrit un script PHP ( disponible sur github ) pour automatiser cela sur mon hôte Ubuntu 14.04.

Il suffit d'installer l'outil PHP CLI avec sudo apt-get install php5-cliet d'exécuter le script, en passant le chemin d'accès aux données de votre pool comme premier argument. Par exemple

php main.php /path/to/my/files

Idéalement, vous devez exécuter le script deux fois sur toutes les données du pool. La première exécution équilibrera l'utilisation du lecteur, mais les fichiers individuels seront trop alloués aux lecteurs ajoutés en dernier. La deuxième exécution garantira que chaque fichier est "équitablement" distribué sur les disques. Je dis assez au lieu de même car il ne sera réparti uniformément que si vous ne mélangez pas les capacités du lecteur comme je le suis avec mon raid 10 de paires de tailles différentes (miroir 4 To + miroir 3 To + miroir 3 To).

Raisons d'utiliser un script

  • Je dois résoudre le problème "sur place". Par exemple, je ne peux pas écrire les données sur un autre système, supprimez-les ici et tout réécrire.
  • J'ai rempli mon pool à plus de 50%, donc je ne pouvais pas simplement copier tout le système de fichiers à la fois avant de supprimer l'original.
  • S'il n'y a que certains fichiers qui doivent bien fonctionner, alors on pourrait simplement exécuter le script deux fois sur ces fichiers. Cependant, la deuxième exécution n'est efficace que si la première exécution a réussi à équilibrer l'utilisation des lecteurs.
  • J'ai beaucoup de données et je veux pouvoir voir une indication des progrès réalisés.

Comment savoir si une utilisation régulière du lecteur est atteinte?

Utilisez l'outil iostat sur une période de temps (par exemple iostat -m 5) et vérifiez les écritures. S'ils sont identiques, alors vous avez atteint une répartition uniforme. Ils ne sont pas parfaitement même dans la capture d'écran ci-dessous car j'utilise une paire de 4 To avec 2 paires de disques de 3 To en RAID 10, donc les deux 4 seront écrits un peu plus. entrez la description de l'image ici

Si l'utilisation de votre disque est "déséquilibrée", iostat affichera quelque chose de plus comme la capture d'écran ci-dessous où les nouveaux disques sont écrits de manière disproportionnée. Vous pouvez également dire que ce sont les nouveaux lecteurs car les lectures sont à 0 car ils ne contiennent aucune donnée. entrez la description de l'image ici

Le script n'est pas parfait, seulement une solution de contournement, mais il fonctionne pour moi en attendant jusqu'à ce que ZFS implémente un jour une fonctionnalité de rééquilibrage comme BTRFS (doigts croisés).

Programster
la source
Oh mon ... Wow ...
ewwhite
0

Eh bien, c'est un peu un hack mais étant donné que vous avez arrêté la machine en utilisant le zvol, vous pouvez zfs envoyer le système de fichiers vers un fichier local sur localhost appelé bar.zvol, puis vous recevez à nouveau le système de fichiers. Cela devrait rééquilibrer les données pour vous.

zfs send tank/bar > bar.zvol

zfs receive tank/bar < bar.zvol
Christian
la source
-1

la meilleure solution que j'ai trouvée était de dupliquer la moitié de vos données sur le pool étendu, puis de supprimer les données dupliquées d'origine.

reco
la source
3
Peux-tu élaborer?
ewwhite
@reco: les zvols ne sont pas des systèmes de fichiers, vous ne pouvez donc pas supprimer ou dupliquer des données sur eux. Vous pourriez écraser les données mais cela les corromprait à moins que vous ne le fassiez avec le même contenu qui couvrirait efficacement les données sur les volumes sous-jacents, mais c'est ce que ewwhite avait déjà suggéré il y a un an.
jlliagre
Oui, tu as raison. je regardais autour et recherchais le même sujet. ce que j'ai réalisé, c'est qu'avec zfs, la redistribution des données sur les vdevs n'est pas nécessaire. mais si vous voulez toujours pour une raison quelconque dupliquer des données et supprimer les originaux accélérera ce que zfs ferait avec le temps.
reco
1
La redistribution des données sur les vdevs est une demande légitime. Je crains que vous manquez toujours la question concerne les zvols, pas les systèmes de fichiers. Vous ne pouvez pas dupliquer ou supprimer des données sur un volume, cela n'a aucun sens.
jlliagre
salut jlliagre. oui vous avez raison désolé
reco