Existe-t-il un moyen de créer des copies de vache dans ZFS?

14

J'essaie de faire des copies de vache de certains fichiers / répertoires, mais de plusieurs façons que je connais, toutes semblent sous-optimales.

Par exemple, btrfs peut, avec l'utilisation de cp --reflink=autogénérer rapidement des copies de vache de fichiers.

Ce que j'ai essayé:

  1. Liens symboliques: Pas bon. Fichier renommé, lien brisé.
  2. Liens physiques: Mieux, mais toujours pas bons. Les modifications apportées à un fichier changeront l'autre, et je ne veux pas nécessairement que l'autre fichier soit modifié.
  3. Créez un instantané de l'ensemble de données, puis clonez l'instantané: cela peut fonctionner, mais pas bien. Souvent, je ne recherche pas une copie de l'ensemble de données ni les copies pour agir comme un autre ensemble de données. Ensuite, il y a les relations parent / enfant entre le clone / l'instantané / l'original, qui, si je comprends bien, sont difficiles, voire impossibles à briser.
  4. En utilisant zfs send/receiveet activé la déduplication, répliquez l'ensemble de données dans un nouvel ensemble de données: cela évite les relations parent / enfant d'utiliser un clone, mais crée toujours inutilement un autre ensemble de données, et souffre toujours de la lenteur impliquée dans les fichiers devant être lus à 100% et les blocs ont de nouveau référencé au lieu d'être écrits.
  5. Copiez les fichiers et laissez dedup faire son travail: cela fonctionne, mais est lent car les fichiers doivent être lus à 100%, puis les blocs référencés à nouveau au lieu d'écrire.

La lenteur de l'envoi / de la réception zfs et de la copie ou de la synchronisation physique est encore exacerbée car la plupart des choses sont stockées compressées et doivent être décompressées pendant la lecture, puis compressées avant que la déduplication ne fasse référence à des blocs en double.

Dans toutes mes recherches, je n'ai rien trouvé qui ressemble à distance à la simplicité de --reflink dans btrfs.

Alors, existe-t-il un moyen de créer des copies de vache dans ZFS? Ou est-ce que la copie «physique» et le fait que le dédoublage fasse son travail sont la seule vraie option?

killermist
la source

Réponses:

4

Je pense que l'option 3 que vous avez décrite ci-dessus est probablement votre meilleur pari. Le plus gros problème avec ce que vous voulez est que ZFS ne gère vraiment cette copie sur écriture qu'au niveau de l'ensemble de données / instantané.

Je suggère fortement d'éviter d'utiliser dedup à moins que vous n'ayez vérifié qu'il fonctionne bien avec votre environnement exact. J'ai une expérience personnelle avec le dédoublage qui fonctionne très bien jusqu'à ce qu'un autre utilisateur ou magasin VM soit installé, puis il tombe d'une falaise de performances et provoque beaucoup de problèmes. Tout simplement parce qu'il semble fonctionner parfaitement avec vos dix premiers utilisateurs, votre machine peut tomber lorsque vous ajoutez le onzième (ou le douzième, ou le treizième, ou autre). Si vous voulez suivre cette voie, assurez-vous absolument que vous disposez d'un environnement de test qui imite exactement votre environnement de production et qu'il fonctionne bien dans cet environnement.

De retour à l'option 3, vous devrez configurer un ensemble de données spécifique pour contenir chacune des arborescences de système de fichiers que vous souhaitez gérer de cette manière. Une fois que vous l'avez configuré et initialement rempli, prenez vos instantanés (un par ensemble de données qui différera légèrement) et promouvez-le ensuite en clones. Ne touchez plus jamais le jeu de données d'origine.

Oui, cette solution a des problèmes. Je ne dis pas que ce n'est pas le cas, mais étant donné les restrictions de ZFS, c'est probablement le meilleur. J'ai trouvé cette référence à quelqu'un qui utilise efficacement les clones: http://thegreyblog.blogspot.com/2009/05/sparing-disk-space-with-zfs-clones.html

Je ne connais pas vraiment btrfs, mais s'il prend en charge les options que vous souhaitez, avez-vous envisagé de configurer un serveur séparé juste pour prendre en charge ces ensembles de données, en utilisant Linux et btrfs sur ce serveur?

jlp
la source
C'est une bonne matière à réflexion. Si le "maître" (et donc les enfants) a besoin de modifications suffisamment importantes, un clone du maître pourrait être créé, amélioré, promu au nouveau poste de maître, alors tout clone subsidiaire suffisamment différent pourrait avoir des variations déterminées par la synchronisation. à part, les clones ont été détruits et reconstitués à partir du nouveau maître, et les changements se sont retirés du matériel retenu. Cela ne ressemble pas à une excellente solution, mais cela commence à ressembler à une bonne solution, et économise les frais généraux liés à l'activation de la déduplication. Doit y réfléchir davantage.
killermist
Oui, ce n'est pas une excellente solution, mais elle semble être la moins douloureuse de celles que vous avez décrites et je n'ai pu penser à aucune autre.
jlp
Le résumé de votre point est illustré par github.com/zfsonlinux/zfs/issues/405 Fondamentalement, ZFS ne prend pas en charge COW basé sur des fichiers, uniquement l'ensemble de données COW, il n'y a donc pas d'équivalent à BTRFS cp --reflink=auto.
mtalexan
1

L'option 5 est la meilleure.

En ce qui concerne les jeux de données parent / enfant dans l'option 3, vous pouvez promouvoir un clone et il ne sera plus un enfant du jeu de données cloné. Il n'utilisera toujours pas de blocs supplémentaires. Edit: A noté que cela ne fait qu'inverser la relation parent / enfant, pas la détruire.

En ce qui concerne les choses compressées / cryptées et qui ralentissent la copie, c'est complètement faux. Votre processeur est beaucoup plus rapide que votre périphérique bloc (même si vous utilisez des SSD). Juste pour quelques exemples de chiffres, disons qu'il faut 10 secondes pour lire un bloc, mais il ne faut qu'une seconde pour le décompresser et 2 secondes pour le décrypter. Le bloc 1 est lu en 10 secondes et envoyé au CPU. Le CPU commence la décompression et le décryptage pendant que le disque commence la lecture du bloc 2. Le CPU terminera sa tâche en 3 secondes, puis passera les 7 prochaines secondes à attendre sur le disque. Le disque a quant à lui passé exactement le même temps à lire ces deux blocs (20 secondes), que les blocs soient compressés ou non.

De même lors de l'écriture, seul le premier bloc est retardé. Le CPU compresse / chiffre le bloc 1 et l'envoie sur le disque. Pendant que le disque écrit le bloc 1, le CPU commencera à compresser / chiffrer les blocs suivants. Le CPU va parcourir les blocs beaucoup plus rapidement que le disque ne peut les écrire, donc ce n'est pas un problème. (Oui, c'est plus complexe que cela, mais c'est l'essentiel.)

Désolé pour l'explication trop longue d'un point mineur dans votre question, mais je voulais clarifier cette idée fausse.

bahamat
la source
1
La promotion d'un clone change simplement ce qui est considéré comme le parent et qui est considéré comme l'enfant. Il reste impossible de détruire l'instantané entre les deux, car le parent d'origine est désormais un enfant de l'instantané, qui est maintenant un enfant du clone promu. En plus de cela, il crée toujours inutilement des constructions de type jeu de données où je cherchais simplement à répliquer des fichiers dans le jeu de données.
killermist
De plus, sur un pool avec déduplication activée, je dois être en désaccord avec la conclusion sur le ralentissement de la compression. La copie d'un ensemble de données avec compression activée vers un ensemble de données avec compression activée, les vitesses dépassaient rarement 5 Mo / s. Si l'un des ensembles de données ou l'autre a la compression désactivée, les vitesses passent en moyenne à 10-15 Mo / s. Avec la compression des deux côtés désactivée, je vois facilement 20 Mo / sec avec des pointes plus élevées que cela (probablement parce que des portions atteignent la table de déduplication dans la RAM au lieu de tirer à partir de supports plus lents).
killermist
1
J'ai mis à jour ma réponse concernant le clonage. En ce qui concerne la compression / chiffrement / déduplication, les ralentissements sont plus causés par la mise à jour du DDT que par compression ou chiffrement. D'après mon expérience, l'impact de la compression et du chiffrement a toujours été négligeable. Je suppose que YMMV.
bahamat