Je vais commencé par vous présenter celui que je pense être de très loin le roi des file system distribués : CEPH.
Ceph est donc un système de fichier distribué, considéré comme stable depuis peu. La configuration du cluster est inconnue au client. CEPH peut être utilisé pour faire de l'object storage.
Comme d'habitude voici l'archi que nous allons réaliser :
Ceph utilise différents constituants :
L’installation est simpliste : elle repose sur un script, ceph-deploy qui fait tout le boulot à notre place! ( un vrai truc de manager ^^ ).
On commence par installer ceph sur toutes les machines.
wget -q -O- 'https://ceph.com/git/?p=ceph.git;a=blob_plain;f=keys/release.asc' | sudo apt-key add -
echo "deb http://ceph.com/debian/ wheezy main" >> /etc/apt/sources.list
Bon assurez vous que l'utilisateur root peu bien depuis chaque machine du cluster aller en ssh su chaque autre machine du cluster…
Nous pouvons donc commencer à installer ceph via ceph-deploy !!!
Pour utiliser ceph-deploy il vous faut :
sudo su
, on se log direct en root )/home/benwa/ceph
)Pour créer le cluster :
ceph-deploy new benwa-ceph-mon-1
Nous allons maintenant créer deux moniteurs :
ceph-deploy mon benwa-ceph-mon-1 benwa-ceph-mon-2
Ici aussi, rien de plus simple :
ceph-deploy mds create benwa-ceph-mds-1 benwa-ceph-mds-2
On commence par les préparer :
ceph-deploy osd prepare benwa-ceph-osd-1 benwa-ceph-osd-2 benwa-ceph-osd-3
Puis on les activent :
ceph-deploy osd activate benwa-ceph-osd-1 benwa-ceph-osd-2 benwa-ceph-osd-3
Note : D'autres fonctionnalités existent comme :
Il est de plus possible d'utiliser btrfs ^^
Celà est fait simplement depuis un moniteur par :
ceph health
On accède notamment à l'ensemble des problèmes des différents noeuds, etc…
Celà donne des possibilité de surveillance via monitoring ^^
L'installation des paquets ceph-common et ceph-fs-common est nécéssaire.
Voici l'entrée dans mon /etc/fstab
:
192.168.103.222:6789,192.168.103.223:6789:/ /mnt/mycephfs ceph name=admin,secretfile=/etc/ceph/secret,noatime 0
Les ips corresondent respectivement à benwa-ceph-master-1 et benwa-ceph-master-2.
Ceph utilise l'algorithme CRUSH pour répliquer les données. C'est un algorithme pseudo aléatoire ( rejouable, donc ) qui statistiquement équilibre les écritures.
On peut customiser l'algorithme via un fichier de configuration ( compilé… )
Pour le récupérer :
ceph osd getcrushmap -o fichier_ou_on_recupere_la_CRUSH_map
Pour le décompiler :
crushtool -d CRUSH_map_compile -o CRUSH_map_decompile
On fait notre vin puis on recompile :
crushtool -c CRUSH_map_modif -o CRUSH_map_compile
Et on utilise ce fichier compilé :
ceph osd setcrushmap -i CRUSH_map_compile
Les buckets : Un bucket est un objet. Il correspond à quelque chose qui vous fait sens ( osd, rack, salle, data-center, région, etc…) Vous pouvez créer vos propres buckets. Vous indiquez ensuite les items enfants, qui constituent le bucket. On indique aussi la capacité de stockage ( 1 ⇔ 1TB ).
Bien renseigner ses buckets permet de :
Les règles permettent de gérer la position des données pour un pool. On peut s'en servir pour orienter un pool de data vers des serveurs munis de SSDs et un autre pool de data vers un équipé de HDDs. On peut aussi forcer la réplication entre différentes salles, différents data-centers…
Ci joint mon set de règles, pour répliquer “potentiellement” des données avec CEPH entre le U1 et notre salle serveur :
# begin crush map # devices device 0 device0 device 1 device1 device 2 device2 device 3 osd.3 device 4 osd.4 device 5 osd.5 # types type 0 osd type 1 host type 2 rack type 3 row type 4 room type 5 datacenter type 6 root # buckets host benwa-ceph-ods-3 { id -2 # do not change unnecessarily # weight 0.010 alg straw hash 0 # rjenkins1 item osd.3 weight 0.010 } host benwa-ceph-osd-2 { id -3 # do not change unnecessarily # weight 0.010 alg straw hash 0 # rjenkins1 item osd.4 weight 0.010 } host benwa-ceph-ods-1 { id -4 # do not change unnecessarily # weight 0.010 alg straw hash 0 # rjenkins1 item osd.5 weight 0.010 } root default { id -1 # do not change unnecessarily # weight 0.030 alg straw hash 0 # rjenkins1 item benwa-ceph-ods-3 weight 0.010 item benwa-ceph-osd-2 weight 0.010 item benwa-ceph-ods-1 weight 0.010 } room salle_serveur_principale { id -5 alg straw hash 0 item benwa-ceph-ods-1 weight 0.010 item benwa-ceph-osd-2 weight 0.010 } room salle_serveur_U1 { id -6 alg straw hash 0 item benwa-ceph-ods-3 weight 0.020 } rule metadata { ruleset 1 type replicated min_size 1 max_size 10 step take default step chooseleaf firstn 0 type room step emit } rule rbd { ruleset 2 type replicated min_size 1 max_size 10 step take default step chooseleaf firstn 0 type room step emit } # end crush map
Je conseille par ailleurs la lecture de cette page.
Voici le quelques constats que j'ai pu faire :
Les +
Les -
GlusterFS est un système de fichier distribué en réseau, développé par RedHat.
Il est pensé pour être très largement scalable.
Nous nous baserons dans cet article sur cette installation :
Nous dupliquons les données sur les serveurs (2 à 2).
Cette architecture sera d'abord réalisé avec 4 serveurs GlusterFS, dont on prendra soin de remplir les disques avant d'ajouter deux derniers serveurs.
Commençons par créer le répertoire qui accueillera les données :
mkdir /data mkdir /data/exports
Maintenant installons Glusterfs :
apt-get install glusterfs-server
Éditions la configuration : ''nano /etc/glusterfs/glusterd.vol
volume posix type storage/posix option directory /data/exports end-volume volume locks type features/locks subvolumes posix end-volume volume brick type performance/io-threads option thread-count 8 subvolumes locks end-volume volume server type protocol/server option transport-type tcp option auth.addr.brick.allow 192.168.103.211 subvolumes brick end-volume
Je ne reviendrais pas sur ce fichier de conf, il est très explicite.
On redémarre glusterfs :
/etc/init.d/glusterfs-server restart
Et voilà, c'est aussi bête que ça. ( L'instalation de la VM prend beaucoup plus de temps que celle de GlusterFS !!! ).
Ici, on se contente d'installer le client GlusterFS :
apt-get install glusterfs-client
On cré le point de montage :
mkdir /mnt/glusterfs
Et un dossier pour abriter notre conf'.
mkdir /etc/glusterfs
Maintenant on rédige notre fichier de conf :
volume remote1 type protocol/client option transport-type tcp option remote-host benwa-glusterfs-1 option remote-subvolume brick end-volume volume remote2 type protocol/client option transport-type tcp option remote-host benwa-glusterfs-2 option remote-subvolume brick end-volume volume remote3 type protocol/client option transport-type tcp option remote-host benwa-glusterfs-3 option remote-subvolume brick end-volume volume remote4 type protocol/client option transport-type tcp option remote-host benwa-glusterfs-4 option remote-subvolume brick end-volume volume replicate1 type cluster/replicate subvolumes remote1 remote2 end-volume volume replicate2 type cluster/replicate subvolumes remote3 remote4 end-volume volume replicate3 type cluster/replicate subvolumes remote5 remote6 end-volume volume distribute type cluster/distribute subvolumes replicate1 replicate2 replicate3 end-volume volume writebehind type performance/write-behind option window-size 1MB subvolumes distribute end-volume volume cache type performance/io-cache option cache-size 512MB subvolumes writebehind end-volume
Revenons un peu plus sur ce fichier de conf :
Ensuite, il ne reste plus qu'à monter :
mount -t glusterfs /etc/glusterfs/glusterfs.vol /mnt/glusterfs
Et voilà, vous avez un système de fichier distribué
Je n'ai pu m'empêcher de ressortir iozone pour tester tout ceci plus en profondeur. Voici mes conclusions :
Ces résultats sont à prendre avec des pincettes. En effet ils sont obtenues en utilisant des KVMs comme client et comme serveur qui sont hébergées sur NAS.
Je pense que GlusterFS est un très bon système de fichier dès lors que la scalabilité prime plus que la nécessité des snapshots.
AUFS ( another Union File System ) est un système de fichier permettant de fusionner dans son point de montage plusieurs dossiers de votre Virtual File System. Un des usages possibles est de l'utiliser pour fusionner virtuellement deux points de montage NFS, que nous pourrons utiliser au travers de AuFS comme un seul et unique fileSystem.
Pour installer ce système de fichier sous Debian :
apt-get install aufs-tools modprobe aufs
Ensuite, pour pouvoir l'utiliser :
mount -t aufs -o br=/mnt/nfs1:/mnt/nfs2 none /mnt/aufs
Attention, il s'agit clairement d'un tric… Je vois pas qui utiliserais ça en prod… Comme pour glusterFS, le client doit avoir conscience de l'architecture de stockage, et en est responsable. Néanmoins cette solution utilise des modules kernels côté clients (nfs et aufs) et est donc beaucoup moins gourmande en ressource. En revanche, je n'ai pas encore trouvé comment apporter de la redondance à cette archi “maison”. De plus, il n'y a clairement pas le même jeu d'options possible comparé à GlusterFS.
Note : AuFS peut être utilisé pour virtuellement écrire sur un filesystem en readOnly (typiquement un live CD. ) On peut en effet écrire sur un file system en read only en gardant un delta des modifications faites aux fichiers de ce filesystem dans les fichiers de l'autre filesystem composant le montage aufs ( en RW, exemple, un truc en RAM ). Ainsi, grâce à ce subterfuge, et à l'aide d'un chroot, on arrive à utiliser virtuellement le filesystem du liveCD en mode RW.
Ceph :
GlusterFS :
AuFS :
Compléments d'articles :
— Benoit Tellier 2014/01/25 16:06