Economisez de l’espace disque avec OpenDedup
Je déduplique, tu dédupliques, il/elle déduplique … ça n’est pas encore dans le Petit Robert mais ça ne devrait plus tarder !
La déduplication est de plus en plus présente dans l’univers des solutions propriétaires de sauvegardes de données. Cependant une solution Open Source de déduplication montre le bout de son nez depuis quelques temps et commence à arriver à maturité : Opendedup.
Pour ceux qui auraient oublié ou qui ne connaissent pas cette technologie, je vous propose ma modeste traduction de la définition de Wikipedia :
« La déduplication des données est une forme spécifique de compression où les données redondantes sont éliminées, généralement pour améliorer l’utilisation du stockage.
Dans le processus de déduplication, les données dupliquées sont supprimées, ne laissant ainsi qu’une seule copie des données à stocker. La déduplication est capable de réduire la capacité de stockage puisque seules les données uniques sont stockées. Par exemple, un serveur de messagerie standard peut contenir 100 instances d’un même fichier joint de 1 Mo . Si cette plate-forme de messagerie est sauvegardée ou archivée, les 100 fichiers sont enregistrés, ce qui nécessite 100 Mo d’espace de stockage. Avec la déduplication des données, uniquement un seul fichier sera stocké. Chaque instance fait référence à la copie du fichier enregistré. Dans cet exemple, une demande 100 Mo de stockage pourrait être réduite à seulement 1 Mo. »
De plus, j’ajoute que pour optimiser cette déduplication, le stockage des données se fait le plus souvent au niveau des blocs de données comme le montre le schéma ci-dessous :
Les types d’applications qui fonctionnent très bien pour la déduplication
- Les sauvegardes
- Les machines virtuelles
- Les partages réseau pour les données non structurées telles que des documents de bureau et PST
- Toute demande avec une grande quantité de données dupliquées
Les types d’applications qui ne sont pas terribles pour la déduplication
- Tout ce qui a des données uniques
- Les photos
- Les fichiers musicaux
- Les films, les vidéos …
- Les données chiffrées
La déduplication avec OpenDedup
SDFS s’appuie sur la déduplication des données pour le stockage primaire. Il agit comme un système de fichiers normal qui peut être utilisé pour des opérations IO typiquement similaires à EXT3, NTFS … La différence est que les blocs de données SDFS qui sont écrits dans le système de fichiers sont seulement ceux qui sont uniques sur le disque. Les blocs qui ne sont pas uniques font simplement référence aux données qui sont déjà sur le disque.
Les prérequis
Système
- x64 Linux Distribution. (précision : Opendedup a été testé et développé sur Ubuntu 10.04)
- Fuse 2.8+ . Pour Debian, le package est disponible ici : http://opendedup.googlecode.com/files/debian-fuse.tar.gz
- 2 GB of RAM disponible pour opendedup
- Java 7 – disponible sur https://jdk7.dev.java.net/
Package optionnel
- attr – (setfattr and getfattr) pour paramétrer les attributs étendus des fichiers.
Installation (sur Debian 6)
Considérons que la distribution Debian 6 squeeze est déjà installée.
Opendedup
# wget http://opendedup.googlecode.com/files/sdfs-1.0.7.tar.gz # tar -zxf sdfs-1.0.5.tar.gz # mv sdfs-bin /opt/sdfs
Attr
# apt-get install attr
Fuse
# wget http://opendedup.googlecode.com/files/debian-fuse.tar.gz # tar -zxf debian-fuse.tar.gz # cd debian-fuse # apt-get install libselinux1-dev libsepol1-dev # dpkg -i libfuse2_2.8.3-opendedup0_amd64.deb \\ # libfuse-dev_2.8.3-opendedup0_amd64.deb \\ # fuse-utils_2.8.3-opendedup0_amd64.deb
Java
# tar -zxf jdk-7-fcs-bin-b146-linux-x64-20_jun_2011.tar.gz # mkdir /usr/lib/jvm # mv jdk1.7.0 /usr/lib/jvm/jdk # export JAVA_HOME=/usr/lib/jvm/jdk
Créer un système de fichiers SDFS
Pour connaître tous les paramètres possibles de la commande mkfs.sdfs : taper mkfs.sdfs –help
–volume-capacity et –volume-name sont obligatoires mais je conseille de mettre aussi –volume-maximum-full-percentage ce qui permettra de remonter une erreur quand le système de fichiers sera plein. Sinon la commande « df » affichera 100% mais l’espace de stockage continuera à augmenter. Par défaut, les données sont stockées dans /opt/sdfs/<volume name>.
# mv /opt/sdfs-bin /opt/sdfs # cd /opt/sdfs /opt/sdfs# ./mkfs.sdfs --volume-name=sdfs_vol1 --volume-capacity=500MB --volume-maximum-full-percentage=100 Attempting to create volume ... Volume [sdfs_vol1] created with a capacity of [500MB] check [/etc/sdfs/sdfs_vol1-volume-cfg.xml] for configuration details if you need to change anything
Monter le système de fichiers SDFS
/opt/sdfs# mkdir /mnt/sdfs /opt/sdfs# ./mount.sdfs -v sdfs_vol1 -m /mnt/sdfs Running SDFS Version 1.0.7 reading config file = /etc/sdfs/sdfs_vol1-volume-cfg.xml -f /mnt/sdfs -o direct_io,big_writes,allow_other,fsname=sdfs_vol1-volume-cfg.xml 11:11:05.114 main INFO [fuse.FuseMount]: Mounting filesystem
Tests
Copie de 2 fichiers identiques
Pour commencer, nous allons copier 2 fois le même fichier avec un nom différent sur la partition SDFS :
# du -hc /opt/sdfs/volumes/sdfs_vol1/ [...] 20K total # cp jdk-7-fcs-bin-b146-linux-x64-20_jun_2011.tar.gz /mnt/sdfs/ # df -h /mnt/sdfs/ Sys. de fichiers Taille Uti. Disp. Uti% Monté sur sdfs_vol1-volume-cfg.xml 500M 91M 410M 19% /mnt/sdfs # du -hc /opt/sdfs/volumes/sdfs_vol1/ [...] 91M total # cp jdk-7-fcs-bin-b146-linux-x64-20_jun_2011-copie.tar.gz /mnt/sdfs/ df -h /mnt/sdfs/ Sys. de fichiers Taille Uti. Disp. Uti% Monté sur sdfs_vol1-volume-cfg.xml 500M 181M 319M 37% /mnt/sdfs # du -hc /opt/sdfs/volumes/sdfs_vol1/ [...] 91M total
Nous pouvons constater que l’espace disque occupé par le système de fichiers SDFS est bien resté le même. La commande « df » indique bien la somme des 2 fichiers.
Copie de 2 Fichiers dont le 2ème contient 2 fois les données du 1er
# ls -lh ldap* -rw-r--r-- 1 root root 42M 8 juil. 13:56 ldap2x.ldif -rw-r--r-- 1 root root 21M 14 mars 2006 ldap.ldif # cp ldap*.ldif /mnt/sdfs/ # df -h /mnt/sdfs/ Sys. de fichiers Taille Uti. Disp. Uti% Monté sur sdfs_vol1-volume-cfg.xml 500M 63M 438M 13% /mnt/sdfs # du -hc /opt/sdfs/volumes/sdfs_vol1/ [...] 42M total
Pour ce test le taux de déduplication est de 1/3.
Copie de 500 Mo de fichiers en vrac (text, jpg, pdf, mp3 …) jusqu’à saturation du système de fichiers monté
# ls -rlh /mnt/sdfs/ -rw-r--r-- 1 root root 7,8M 21 sept. 2010 Water - Evolution.mp3 -rw-r--r-- 1 root root 643K 10 juin 10:27 terrain vague.jpg -rw-r--r-- 1 root root 34M 7 juin 09:48 squeezeboxserver_7.5.4_all.deb [...] # df -h /mnt/sdfs Sys. de fichiers Taille Uti. Disp. Uti% Monté sur sdfs_vol1-volume-cfg.xml 500M 500M 0 100% /mnt/sdfs # du -hc /mnt/sdfs [...] 564M total # du -hc /opt/sdfs/volumes/sdfs_vol1/ [...] 583M total
Là, j’avoue, j’ai un peu de mal à interpréter ces résultats !
Performances
Pour le test, j’ai utilisé une machine virtuelle avec 4 G0 de RAM, 2 CPU et 3 disques virtuels, puis j’ai installé la distribution Linux Debian Squeeze 6.0.
# hdparm -t /dev/sda /dev/sda: Timing buffered disk reads: 486 MB in 3.02 seconds = 160.71 MB/sec # hdparm -t /dev/sdb /dev/sdb: Timing buffered disk reads: 484 MB in 3.00 seconds = 161.18 MB/sec # hdparm -t /dev/sdc /dev/sdc: Timing buffered disk reads: 482 MB in 3.00 seconds = 160.43 MB/sec
- Test de copie d’un fichier de 698 Mo :
Système de fichiers | en s |
---|---|
ext3 | 13 |
ext4 | 6 |
sdfs | 19 |
Sans surprise EXT4 mène la course en tête et SDFS est proche de la voiture balai.
- Test avec dd
Test d’écriture
# time sh -c "dd if=/dev/zero of=/mnt/ext3/test bs=4096 count=175000 && sync" # time sh -c "dd if=/dev/zero of=/mnt/ext4/test bs=4096 count=175000 && sync" # time sh -c "dd if=/dev/zero of=/mnt/sdfs/test bs=4096 count=175000 && sync"
Dans cet exemple, on crée un fichier test sur chaque partition (ext3, ext4 et sdfs) dans lequel on va écrire 175 000 blocks de 4KB. Ce qui va nous donner un fichier de 717Mo. dd retournera ensuite la temps et la bande passante utilisée.
Système de fichiers | en s | en Mo/s |
ext3 | 1,95 | 367 |
ext4 | 1,79 | 401 |
sdfs | 8,36 | 86 |
SDFS est presque 4 fois plus lent que EXT3.
Test de lecture
time sh -c "dd if=/mnt/ext3/test of=/dev/null bs=4096 count=175000 && sync" time sh -c "dd if=/mnt/ext4/test of=/dev/null bs=4096 count=175000 && sync" time sh -c "dd if=/mnt/sdfs/test of=/dev/null bs=4096 count=175000 && sync"
On lit le même fichier test, (on l’envoie dans /dev/null). dd nous retournera les mêmes informations. Mais il s’agit maintenant de lecture disque.
Système de fichiers | en s | en Mo/s |
ext3 | 0,34 | 2100 |
ext4 | 0,32 | 2200 |
sdfs | 4,98 | 144 |
Dans ce 2ème test, l’écart est encore plus importants avec un ratio de 1/15 !
- Test avec bonnie++
L’étape suivante est l’analyse de performances en utilisant le programme bonnie++. Ce programme analyse les accès de type base de données dans un fichier, ainsi que les créations, lectures, et destructions de petits fichiers simulant ainsi les utilisations faites par des programmes tels Squid, INN, ou les programmes utilisant le format Maildir (qmail).
# bonnie++ -d /mnt/ext3 -s 512 -r 256 -u0 # bonnie++ -d /mnt/ext4 -s 512 -r 256 -u0 # bonnie++ -d /mnt/sdfs -s 512 -r 256 -u0
La commande lance le test en utilisant 512 Mo dans le système de fichiers monté. Les autres options spécifient la quantité de mémoire utilisée (256 Mo), et l’utilisateur (-u0, c’est-à-dire l’administrateur).
Notez que les « +++++ » affichés dans certaines cases signifies que le test à durer moins de 500 ms et que le résultat n’a pu être calculé.
Écritures séquentielles | Lectures séquentielles | Accès aléatoires | |||||||||||
Caractère | Bloc | Ré-écriture | Caractère | Bloc | |||||||||
SF | Espace de test | Ko/sec | % CPU | Ko/sec | % CPU | Ko/sec | % CPU | Ko/sec | % CPU | Ko/sec | % CPU | Ko/sec | % CPU |
ext3 | 512 Mo | 633 | 97 | 128217 | 32 | 92074 | 13 | 3744 | 97 | +++++ | +++ | 6071 | 32 |
ext4 | 512 Mo | 689 | 99 | 153463 | 21 | 162631 | 28 | 3854 | 98 | +++++ | +++ | 5941 | 28 |
sdfs | 512 Mo | 36 | 29 | 99782 | 11 | 71622 | 20 | 35 | 29 | 147618 | 7 | 3241 | 24 |
Créations séquentielles | Créations aléatoires | ||||||||||||
Création | Lecture | Suppression | Création | Lecture | Suppression | ||||||||
SF | Nb fichiers | / sec | % CPU | / sec | % CPU | / sec | % CPU | / sec | % CPU | / sec | % CPU | / sec | % CPU |
ext3 | 16 | 24219 | 37 | +++++ | +++ | 5241 | 7 | 26500 | 47 | +++++ | +++ | 3908 | 5 |
ext4 | 16 | 29919 | 60 | +++++ | +++ | 8112 | 11 | 30659 | 62 | +++++ | +++ | 5669 | 8 |
sdfs | 16 | 340 | 3 | 3747 | 7 | 907 | 3 | 405 | 3 | 4076 | 8 | 771 | 2 |
L’ordre est respecté avec EXT4 qui est légèrement supérieur à EXT3 et SDFS en bon dernier très loin derrière les 2 autres.
Conclusion
Opendedup est une solution intéressante et certainement prometteuse. Cependant pour avoir des performances correctes, je pense qu’il faut l’utiliser avec des disques à 15000 tours/min et avec minimum 4 Go de RAM. Par ailleurs j’ai noté un problème d’encodage des noms de fichiers lorsqu’ils contiennent des caractères accentués. De plus la déduplication qui est censée se faire au niveau blocs de données n’a pas l’air très efficace. Certes la documentation n’est pas très abondante mais elle contient à priori les informations suffisantes. Alors j’ai certainement dû rater quelque chose …
Vos commentaires sont les bienvenus si vous désirez approfondir ce sujet.
Références
- Site officiel Opendedup : http://www.opendedup.org/
- Wikipedia – Data Deduplication