GlusterFS : Filesystem cluster pour HA

From Deimos.fr / Bloc Notes Informatique
Jump to: navigation, search

1 Introduction

GlusterFS est un logiciel libre de système de fichiers distribué en parallèle, capable de monter jusqu'à plusieurs pétaoctets.
GlusterFS est un système de fichiers de cluster/réseaux. GlusterFS est livré avec deux éléments, un serveur et un client.
Le serveur de stockage (ou chaque serveur d'un cluster) fait tourner glusterfsd et les clients utilisent la commande mount ou glusterfs client pour monter les systèmes de fichiers servis, en utilisant FUSE.

Le but ici est de faire tourner 2 serveurs qui vont se faire une réplication complète d'une partie d'un filesystem.

Attention à ne pas faire tourner ce type d'architecture sur Internet car les performances seront catastrophiques. En effet, quand un noeud veut accéder en lecture à un fichier, il doit contacter tous les autres noeuds pour savoir s'il n'y a pas de divergences. Seulement ensuite, il autorise la lecture, ce qui peut prendre beaucoup de temps suivant les architectures.

2 Installation

Pour installer sur Debian...easy move :

Command aptitude
aptitude install glusterfs-server glusterfs-examples

3 Configuration

3.1 hosts

Comme tout bon cluster qui se respecte, nous devons configurer correctement la table des hosts afin de ne pas avoir d'ennuyes en cas de perte du DNS. Ajoutez donc les hosts :

Configuration File /etc/hosts
192.168.110.2 rafiki.deimos.fr  rafiki
192.168.20.6 ed.deimos.fr  ed

3.2 Génération des confs

Nous allons nous simplifier la vie ici en générant une configuration pour un RAID 1 :

Command
cd /etc/glusterfs
rm -f *
/usr/bin/glusterfs-volgen --name www --raid 1 rafiki:/var/www-orig ed:/var/www-orig

Ensuite sur chacun des serveurs, nous allons renommer le fichier correspondant au serveur sur lequel vous êtes en glusterfsd.vol et le fichier tcp en glusterfs.vol :

Command mv
mv rafiki-www-export.vol glusterfsd.vol
mv www-tcp.vol glusterfs.vol

N'oubliez pas de faire de même sur l'autre et vous pouvez redémarrer votre serveur glusterfs.

3.3 Serveur

Côté serveur, nous allons appliquer cette configuration :

Configuration File /etc/glusterfs/glusterfsd.vol
### file: server-volume.vol.sample
 
#####################################
###  GlusterFS Server Volume File  ##
#####################################
 
#### CONFIG FILE RULES:
### "#" is comment character.
### - Config file is case sensitive
### - Options within a volume block can be in any order.
### - Spaces or tabs are used as delimitter within a line. 
### - Multiple values to options will be : delimitted.
### - Each option should end within a line.
### - Missing or commented fields will assume default values.
### - Blank/commented lines are allowed.
### - Sub-volumes should already be defined above before referring.
 
volume posix1
  type storage/posix
  option directory /var/www
end-volume
 
volume locks1
    type features/locks
    subvolumes posix1
end-volume
 
volume brick1
    type performance/io-threads
    option thread-count 8
    subvolumes locks1
end-volume
 
volume server-tcp
    type protocol/server
    option transport-type tcp
    option auth.addr.brick1.allow *
    option transport.socket.listen-port 6996
    option transport.socket.nodelay on
    subvolumes brick1
end-volume

3.4 Client

Pour la partie cliente, nous lui indiquons que nous souhaitons faire du "raid1". Voici la configuration à appliquer sur le noeud "ed" :

Configuration File /etc/glusterfs/glusterfs.vol
### file: client-volume.vol.sample
 
#####################################
###  GlusterFS Client Volume File  ##
#####################################
 
#### CONFIG FILE RULES:
### "#" is comment character.
### - Config file is case sensitive
### - Options within a volume block can be in any order.
### - Spaces or tabs are used as delimitter within a line. 
### - Each option should end within a line.
### - Missing or commented fields will assume default values.
### - Blank/commented lines are allowed.
### - Sub-volumes should already be defined above before referring.
 
# RAID 1
# TRANSPORT-TYPE tcp
volume ed-1
    type protocol/client
    option transport-type tcp
    option remote-host ed
    option transport.socket.nodelay on
    option transport.remote-port 6996
    option remote-subvolume brick1
end-volume
 
volume rafiki-1
    type protocol/client
    option transport-type tcp
    option remote-host rafiki
    option transport.socket.nodelay on
    option transport.remote-port 6996
    option remote-subvolume brick1
end-volume
 
volume mirror-0
    type cluster/replicate
    subvolumes rafiki-1 ed-1
end-volume
 
volume readahead
    type performance/read-ahead
    option page-count 4
    subvolumes mirror-0
end-volume
 
volume iocache
    type performance/io-cache
    option cache-size `echo $(( $(grep 'MemTotal' /proc/meminfo | sed 's/[^0-9]//g') / 5120 ))`MB
    option cache-timeout 1
    subvolumes readahead
end-volume
 
volume quickread
    type performance/quick-read
    option cache-timeout 1
    option max-file-size 64kB
    subvolumes iocache
end-volume
 
volume writebehind
    type performance/write-behind
    option cache-size 4MB
    subvolumes quickread
end-volume
 
volume statprefetch
    type performance/stat-prefetch
    subvolumes writebehind
end-volume

4 Exécution

4.1 Serveur

Redémarrez glusterfs ensuite après avoir adapté à vos besoins.

4.2 Client

Il suffit de monter la partition glusterfs :

Command mount
glusterfs /var/www

Vous avez maintenant accès à votre point de montage glusterfs dans /var/www.

5 FAQ

5.1 Forcer la synchro d'un client

Si vous souhaitez forcer la synchro des données pour un client, c'est simple, il suffit de se mettre dans le répertoire ou se trouve le partage glusterfs (ici /mnt/glusterfs), puis effectuer un parcours des répertoires comme ceci :

Command ls
ls -lRa

Ceci aura pour but de tout lire et donc tout copier.

5.2 www-posix: Extended attribute not supported

Si vous regardez dans vos logs et que vous avez quelque chose comme ceci :

Configuration File /var/log/glusterfs/glusterfsd.vol.log
...
+------------------------------------------------------------------------------+
[2010-10-17 00:40:30] W [afr.c:2743:init] www-replicate: Volume is dangling.
[2010-10-17 00:40:30] C [posix.c:4936:init] www-posix: Extended attribute not supported, exiting.
[2010-10-17 00:40:30] E [xlator.c:844:xlator_init_rec] www-posix: Initialization of volume 'www-posix' failed, review your volfile again
[2010-10-17 00:40:30] E [glusterfsd.c:591:_xlator_graph_init] glusterfs: initializing translator failed
[2010-10-17 00:40:30] E [glusterfsd.c:1395:main] glusterfs: translator initialization failed.  exiting

C'est que vous avez des problèmes de permission. Pour ma part, ça m'est arrivé dans un container OpenVZ. Pour palier au problème, voici la solution à faire sur la machine host (et non dans le VE) (attention, ceci nécessite un arrêt, une application des confs, puis un redémarrage du VE) : Si vous souhaitez faire du glusterfs dans un VE, vous risquez de vous heurter à des problèmes de droit:

fuse: failed to open /dev/fuse: Permission denied

Pour les contourner on va donc créer le device fuse depuis l'host sur le VE en question et lui rajouter les droits d'admin (un peu moyen en terme de sécu, mais pas le choix) :

Command
vzctl set $my_veid --devices c:10:229:rw --save
vzctl exec $my_veid mknod /dev/fuse c 10 229
vzctl set $my_veid --capability sys_admin:on --save

Note: N'oubliez pas non plus de charger le module fuse sur votre machine host :

Configuration File /etc/modules
...
fuse

6 Ressources

High-Availability Storage Cluster With GlusterFS
http://www.howtoforge.org/high-availability-storage-with-glusterfs-on-debian-lenny-automatic-file-replication-across-two-storage-servers
http://forum.openvz.org/index.php?t=msg&goto=35230&
http://olemskoi.ru/node/3788