à Octopuce, nous gérons de plus en plus des infrastructures complexes, comprenant un grand nombre de machines virtuelles, pour permettre de garantir qu’un site web répondra même si une de ses VM est éteinte, soit pour maintenance, soit suite à une panne (ça arrive!)
Assez souvent, nous avons donc 2 serveurs web servant le même code PHP par exemple, déployé en parallèle sur 2 serveurs (appelons les web1 et web2). Or ces serveurs web reçoivent souvent des contenus soit des internautes, soit des administrateurs du site. Typiquement, des images, des photos, medias, qui doivent être ensuite rendus visibles sur le site, sans pour autant être dans leur dépôt de code source. Ces fichiers doivent donc être à la fois présents sur web1 et web2 à tout instant, tout en garantissant que si web1 ou web2 tombe, l’autre continuera à accepter de nouveaux fichiers. Comment faire ?
La première solution consiste à utiliser un dossier partagé en NFS, qui permet d’avoir un dossier (appelons-le assets/
) partagé entre web1 et web2. Ainsi, si quiconque écrit sur l’un, on verra le fichier immédiatement sur l’autre. Cependant, bien que tentante, cette solution ne fait que repousser le besoin de redondance sur le serveur NFS !
Glusterfs c’est quoi ?
Arrive alors GlusterFS, programme client/serveur pour Linux qui permet de résoudre ce problème :
Glusterfs a deux parties : un Serveur Gluster installé sur un ou plusieurs serveurs, et un ou plusieurs Client Gluster qui peuvent très bien être sur la même machine que le serveur.
- Chaque Serveur Gluster est rattaché à un ou plusieurs autres serveurs appelés peers, formant une grappe (cluster en anglais) de serveurs
- On lui fournit ensuite un ou plusieurs dossiers appelés bricks dans lesquels il va stocker ses données
- On y crée ensuite un partage appelé volume en précisant quelle redondance on souhaite pour ces données. Ainsi, si on a 2 serveurs gluster et qu’on pose une redondance de 2, chaque serveur aura une copie de l’intégralité des données
- Enfin, les clients peuvent se connecter aux volumes en utilisant un des protocoles classiques, NFS ou Samba, que gluster-server sait parler, ou plus simplement le protocole gluster, que l’on peut utiliser avec un client FUSE, donc directement dans /etc/fstab
Enfin pour piloter gluster, on utilise la ligne de commande gluster suivie d’une commande (volume create, peers status etc.)
Exemple de configuration
Nous allons vous montrer comment utiliser Gluster sur Debian Jessie sur web1 et web2. On installe glusterfs-server via apt sur les machines web1 et web2 :
web1~# apt-get install glusterfs-server
Notez que cela installe rpcbind, statd et idmapds, les outils nfs-common. Vous n’avez que besoin de rpcbind, vous pouvez désactiver les 2 autres via /etc/default/nfs-common
:
NEED_STATD=no NEED_IDMAPD=no
De plus, il faut disposer des ACL, les attributs Posix étendus sur les fichiers, sur votre serveur glusterfs. sur le système de fichier EXT2/3/4, il s’agit de l’option acl
dans /etc/fstab comme dans l’exemple ci-dessous :
/dev/md2 /chemin/vers/un/dossier ext4 auto,noatime,discard,acl 0 0
si vous devez modifier votre fichier fstab, n’oubliez pas de remonter la partition avec
mount /chemin/vers/un/dossier -o remount,acl
Configuration réseau
Glusterfs étant un protocole réseau, on ne souhaite pas forcément laisser ce service accessible depuis l’Internet. Je recommande donc de configurer le glusterd de telle sorte qu’il n’écoute que sur vos IP et interfaces privées. Par exemple : dans /etc/glusterfs/glusterd.vol, on mettra :
option transport.rdma.bind-address 10.0.1.61 option transport.socket.bind-address 10.0.1.61 option transport.tcp.bind-address 10.0.1.61
(où 10.0.1.61 est l’IP de web1) et on redémarre glusterfsd. N’oubliez pas de le faire sur les 2 serveurs.
web1~# service glusterfs-server restart web2~# service glusterfs-server restart
Découverte sur le réseau
Ensuite, on fait découvrir le serveur 1 au serveur 2, et on vérifie qu’ils se voient bien :
web1~# gluster peer probe web2.private web1~# gluster peer status Number of Peers: 1 Hostname: web2.private Uuid: 3c849f4e-1363-4e2b-a721-af920093a446 State: Peer in Cluster (Connected)
Ajout de Bricks, création d’un Volume
Ensuite, préparez sur chaque serveur un dossier avec suffisemment de place et indiquez le à gluster :
web1~# mkdir /data web2~# mkdir /data web1~# gluster volume create monpartage replica 2 transport tcp web2:/data/monpartage web1:/data/monpartage force web1~# gluster volume start monpartage
et voilà ! votre volume est désormais accessible sur le réseau
Installation du client gluster
On installe le client glusterfs via apt :
web1~# apt-get install glusterfs-client
et on peut ensuite monter le partage très simplement :
web1~# mount web1.private:/monpartage /var/www/shared -t glusterfs -o defaults
Si vous monter de même sur web2 :
web2~# mount web2.private:/monpartage /var/www/shared -t glusterfs -o defaults
Et voilà ! À partir de maintenant, tout fichier créé, modifié, ou effacé sur /var/www/shared sur l’une de ces machines sera automatiquement et immédiatement visible à l’autre.
Faire marcher Gluster dans un LXC ?
Chez Octopuce, nous cloisonnons la plupart de nos VM avec les Containers Linux (LXC), voici comment faire marcher glusterfs-server et glusterfs-client dans un container :
Le LXC doit avoir le droit de monter des partitions (utilisation de /etc/fstab
et des commandes mount et umount) et le droit de piloter le périphérique FUSE. Pour cela, on indique donc, dans le fichier config
du LXC :
Dans la liste des lxc.cap.drop, ne PAS enlever la capability sys_admin :
# lxc.cap.drop = sys_admin
Ajouter l’autorisation de gérer /dev/fuse : (les 2 lignes ci-dessous, si possible regroupée avec les autres devices.allow) :
# fuse lxc.cgroup.devices.allow = c 10:229 rwm
Enfin, dans le dossier /dev/
du rootfs de votre LXC, créez le périphérique /dev/fuse
:
physical-host:~# cd /var/lib/lxc/mavm/rootfs/dev physical-host:/var/lib/lxc/mavm/rootfs/dev# mknod fuse c 10 229