đ Tirer parti de la dĂ©duplication de BTRFS: cas concret du versionnage
Le problĂšme
Il mâest arrivĂ© Ă plusieurs reprises de travailler sur des projets utilisant la librairie python filedepot, cette librairie est bien pratique pour gĂ©rer le stockage de fichier notamment en combinaison avec Sqlalchemy.
Un point qui ne reste nĂ©anmoins pas forcĂ©ment Ă©vident Ă gĂ©rer par-dessus ce type de librairie est la question du versionnage. Un cas que jâai eu lâoccasion de voir est le versionnage dans Tracim ou un contenu Ă diverse rĂ©vision qui peuvent ou non avoir un contenu fichier associĂ© diffĂ©rent.
Le fonctionnement du champ UploadedFileField
proposé pour Sqlalchemy
par
filedepot
, fonctionne de sorte à considérer que
le fichier est liée uniquement à une ligne de base de donnée
et il peut ĂȘtre compliquĂ© de tenter de partage un identifiant
dâun mĂȘme fichier entre divers contenus, car par exemple, la
suppression dâune ligne avec le contenu 1 supprimera le
fichier associĂ©, 2 pointant vers le mĂȘme contenu ne pourra
plus y accéder.
Comment alors Ă©viter que pour une modification mineure non liĂ©e au fichier, que le fichier soit dupliquĂ© inutilement consommant ainsi de lâespace inutilement ?
Je vois alors plusieurs approches :
- Mettre cette intelligence de « versionnage »
dans
filedepot
, mais cela demanderait un gros travail. - Mettre cette intelligence de « versionnage » dans lâapplication qui utilise filedepot notamment une table association entre lâidentifiant du fichier pour lâapplication et le champ. Ce qui rĂ©duirait un peu lâintĂ©rĂȘt simplificateur de filedepot Ă mon sens.
- CrĂ©er une sorte de couche intermĂ©diaire dâintelligence entre filedepot qui gĂšre cela. Cela pourrait ĂȘtre aussi lâoccasion de gĂ©rer dâautres features liĂ© au traitement du fichier : indexation, gĂ©nĂ©ration de preview, âŠ
Si la troisiÚme solution me semble la plus intéressante a creusé, elle demande du temps à mettre en place.
Ayant envie de gagner un peu dâespace disponible sur mon
serveur utilisant Tracim
, jâai trouvĂ© une
solution de contournement Ă partir du fait que btrfs supporte
la fonctionnalité de déduplication.
La Déduplication Quézako ?
La déduplication est une fonctionnalité de systÚme de
fichier qui permet Ă un systĂšme de fichier de dire quâun
certain contenu utilisĂ© par plusieurs fichiers est au mĂȘme
endroit. Ainsi, il est possible de copier via cp
--reflink=always
sans utiliser dâespace supplĂ©mentaire
(sauf quelques meta-données). Seul certain systÚme de fichier
supporte cette fonctionnalité dont BTRFS.
à noter que cette fonctionnalité
est activĂ© par default dans cp quand câest possible Ă partir
de coreutils-9.0. Ainsi, si vous utilisez un simple
cp
dans un Gnu/Linux assez récent et
utilisé un systÚme de fichier comme btrfs, votre copie sera
gérer automatiquement intelligemment sans réelle copie.
Revenons Ă nos moutons
Mais du coup, quâest-ce que ça change pour nous ? Parce quâon pourrait effectivement ajuster
filedepot
pour faire de la copie viareflink
, mais il faudrait pour cela⊠Quâil soit conscient quâil rĂ©alise une copie. Et donc on retombe dans une problĂ©matique de dĂ©veloppement plus ou moins complexeâŠ
Oui ⊠Sauf quâil y a une astuce !
Il est possible de réaliser la déduplication a posteriori,
quand on considĂšre que câest nĂ©cessaire grĂące Ă un outil
comme Duperemove
. Ainsi, il mâest possible de
rĂ©cupĂ©rer de lâespace disque sans avoir Ă me soucier de
lâoptimalitĂ© ou non des solutions techniques de stockage
utilisé par le logiciel utilisé.
Lâautre grosse force est que cela fonctionne pour tous les fichiers sans la moindre distinction. Ainsi peu importe si la duplication est le fait dâun utilisateur qui aurait copiĂ© 2 fois le mĂȘme fichier, dâun mĂ©canisme de versionnage non intelligent, ou simplement le hasard de 2 utilisateurs qui ne se connaissent mĂȘme pas qui tĂ©lĂ©verse lâexacte, mĂȘme contenu, la dĂ©duplication sâeffectuera.
Voici un exemple, Avec un tracim 4.5 tout neuf en conteneur et son contenu dans un systĂšme btrfs tout propre dans un fichier (grĂące Ă ce commentaire) :
Ajout dâun 1 fichier un peu gros sur lâinstance :
df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 10G 219M 9,3G 3% /mnt/dsk
Création de 2 nouvelles révisions sans vraie modification du fichier :
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 10G 639M 8,9G 7% /mnt/dsk
Letâs go la dĂ©duplication (en utilisant lâexemple de https://wiki.tnonline.net/w/Btrfs/Deduplication/Duperemove):
root@gnu:/mnt/dsk# chrt -i 0 duperemove -A -h -d -r -v -b128k --dedupe-options=noblock,same --lookup-extents=yes --io-threads=1 var/data/depot
Using 128K blocks
Using hash: murmur3
Gathering file list...
Skipping small file /mnt/dsk/var/data/depot/2031c9c0-076e-11ee-9c12-0242ac110002/file
Skipping small file /mnt/dsk/var/data/depot/2031c9c0-076e-11ee-9c12-0242ac110002/metadata.json
Skipping small file /mnt/dsk/var/data/depot/2032025a-076e-11ee-9c12-0242ac110002/file
Skipping small file /mnt/dsk/var/data/depot/2032025a-076e-11ee-9c12-0242ac110002/metadata.json
Skipping small file /mnt/dsk/var/data/depot/cb00f218-076e-11ee-a461-0242ac110002/file
Skipping small file /mnt/dsk/var/data/depot/cb00f218-076e-11ee-a461-0242ac110002/metadata.json
Skipping small file /mnt/dsk/var/data/depot/cb0142b8-076e-11ee-a461-0242ac110002/file
Skipping small file /mnt/dsk/var/data/depot/cb0142b8-076e-11ee-a461-0242ac110002/metadata.json
Skipping small file /mnt/dsk/var/data/depot/e89f0f58-076e-11ee-827e-0242ac110002/metadata.json
Skipping small file /mnt/dsk/var/data/depot/0f1a60a6-076f-11ee-a200-0242ac110002/metadata.json
Skipping small file /mnt/dsk/var/data/depot/55639ca8-076f-11ee-a315-0242ac110002/metadata.json
Using 1 threads for file hashing phase
[1/3] (33.33%) csum: /mnt/dsk/var/data/depot/e89f0f58-076e-11ee-827e-0242ac110002/file
[2/3] (66.67%) csum: /mnt/dsk/var/data/depot/0f1a60a6-076f-11ee-a200-0242ac110002/file
[3/3] (100.00%) csum: /mnt/dsk/var/data/depot/55639ca8-076f-11ee-a315-0242ac110002/file
Total files: 3
Total extent hashes: 3
Loading only duplicated hashes from hashfile.
Found 3 identical extents.
Simple read and compare of file data found 1 instances of extents that might benefit from deduplication.
Showing 3 identical extents of length 209.8M with id 54f11aa1
Start Filename
0.0 "/mnt/dsk/var/data/depot/e89f0f58-076e-11ee-827e-0242ac110002/file"
0.0 "/mnt/dsk/var/data/depot/0f1a60a6-076f-11ee-a200-0242ac110002/file"
0.0 "/mnt/dsk/var/data/depot/55639ca8-076f-11ee-a315-0242ac110002/file"
Using 1 threads for dedupe phase
[0x56351b1f30c0] (1/1) Try to dedupe extents with id 54f11aa1
[0x56351b1f30c0] Add extent for file "/mnt/dsk/var/data/depot/e89f0f58-076e-11ee-827e-0242ac110002/file" at offset 0.0 (3)
[0x56351b1f30c0] Add extent for file "/mnt/dsk/var/data/depot/0f1a60a6-076f-11ee-a200-0242ac110002/file" at offset 0.0 (4)
[0x56351b1f30c0] Add extent for file "/mnt/dsk/var/data/depot/55639ca8-076f-11ee-a315-0242ac110002/file" at offset 0.0 (5)
[0x56351b1f30c0] Dedupe 2 extents (id: 54f11aa1) with target: (0.0, 209.8M), "/mnt/dsk/var/data/depot/e89f0f58-076e-11ee-827e-0242ac110002/file"
Kernel processed data (excludes target files): 419.5M
Comparison of extent info shows a net change in shared extents of: 629.3M
AprĂšs deduplication :
df -h .
Filesystem Size Used Avail Use% Mounted on
/dev/loop0 10G 219M 9,3G 3% /mnt/dsk
On a ainsi gagné pas moins de 419.5M !
Autres points intéressant de Duperemove
:
- Vous nâutilisez pas btrfs ou voulez avoir une idĂ©e de lâespace gagnĂ©, il est possible de lancer duperemove en mode dĂ©tection seulement.
- Changer la taille des blocs (
-b
) permet de prendre en compte les fichiers plus petit, par exemple les preview dans le cas de Tracim. -
Duperemove
permet dâutiliser un hashfile qui Ă©vite de devoir recalculer les fichiers dĂ©jĂ lus, attention nĂ©anmoins Ă la taille du hashfile.
Aller plus loinâŠ
La solution Duperemove
se conjugue bien avec
le fonctionnement de Tracim, mais comment peut-on
faire autrement ? Quelles solutions les autres logiciels
utilisent pour conserver un historique sans surcharger les
disques ?
Nextcloud : De ce que je comprends de lâapproche de nextcloud sur ce genre de problĂ©matique, elle consiste Ă tenter de rĂ©duire le nombre de versions sauvegardĂ©es ainsi le versionnage de nextcloud nâest Ă ce sens pas trĂšs fiable dans une logique dâarchivage, une approche hybride Ă base de version par etiquette pour une gestion semi-automatique associĂ© ou non ne sorte dâIA ou dâalgorithme un peu malin pourrait faire lâaffaire afin de limiter les versions stockĂ©e tout en gardant lâessentiel de lâhistorique.
Gestion de version : Lâapproche des logiciels de gestion de versions comme git est intĂ©ressante et est clairement optimale en espace de stockage pour du fichier texte. Elle permet rĂ©ellement de lâarchivage, de plus le principe de pouvoir associer un texte Ă une modification commit, permet de sây retrouvĂ© facilement. NĂ©anmoins lâapproche ne se conjugue pas trĂšs bien avec du stockage de fichier binaire.
Voili VoilĂ ! đ