<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Stockage Répliqué on Zwindler's Reflection</title><link>https://blog.zwindler.fr/tags/stockage-r%C3%A9pliqu%C3%A9/</link><description>Recent content in Stockage Répliqué on Zwindler's Reflection</description><generator>Hugo -- gohugo.io</generator><language>fr</language><copyright>Licensed under CC BY-SA 4.0</copyright><lastBuildDate>Mon, 11 May 2020 06:35:00 +0000</lastBuildDate><atom:link href="https://blog.zwindler.fr/tags/stockage-r%C3%A9pliqu%C3%A9/index.xml" rel="self" type="application/rss+xml"/><item><title>Stockage distribué et répliqué avec DRBD</title><link>https://blog.zwindler.fr/2020/05/11/stockage-distribue-et-replique-avec-drbd/</link><pubDate>Mon, 11 May 2020 06:35:00 +0000</pubDate><guid>https://blog.zwindler.fr/2020/05/11/stockage-distribue-et-replique-avec-drbd/</guid><description>&lt;img src="https://blog.zwindler.fr/2020/04/drbd_infra-2.webp" alt="Featured image of post Stockage distribué et répliqué avec DRBD" /&gt;&lt;h2 id="drbd"&gt;DRBD
&lt;/h2&gt;&lt;p&gt;En 2015, j’avais voulu essayer la solution de stockage distribué DRBD. Et oui, 2015. C’est mon plus vieux brouillon sur le blog que je sors enfin. Vous vous en doutez, j’ai du repasser dessus pour ne pas vous donner de versions antédiluvienne ;-)&lt;/p&gt;
&lt;p&gt;&lt;a class="link" href="https://www.linbit.com/drbd/" target="_blank" rel="noopener"
&gt;DRBD (pour Distributed Replicated Block Device)&lt;/a&gt; est donc un logiciel disponible sous Linux et Windows qui permet de gérer des périphériques de stockages virtuels utilisables dans des infrastructures.&lt;/p&gt;
&lt;p&gt;Ces périphériques ont la particularité de pouvoir être « distribués » sur plusieurs serveurs sur un réseau de façon synchrone ou asynchrone et disposant de plusieurs méthodes de resynchronisation en cas de perte de lien ou d’incohérences.&lt;/p&gt;
&lt;p&gt;L’avantage de cette solution est qu’elle est robuste (fiabilité éprouvée) et qu’elle permet de répondre à des problématiques de haute disponibilité et de performance que n’offrent pas forcément toutes les solutions de stockage.&lt;/p&gt;
&lt;p&gt;Si cette solution peut paraître de prime abord un peu datée à l’époque des containers et de Kubernetes, sachez que Linbit a fait un effort assez conséquent justement sur cette partie, en essayant de se positionner comme un des acteurs du stockage distribué pour les architectures containerisées et/ou &amp;ldquo;cloud native&amp;rdquo; (surtout trusté par &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=ceph" &gt;Ceph/CephFS&lt;/a&gt;, voire &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=gluster" &gt;Gluster&lt;/a&gt;).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/04/linstor.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Pour tester DRBD, vous l’aurez compris, il va nous falloir au minimum deux serveurs. Pour faire simple, je vais utiliser des machines virtuelles (mais évidemment ça fonctionnera mieux sur un serveur physique) sur lesquelles j’ai installé une image Ubuntu 18.04.&lt;/p&gt;
&lt;p&gt;Dans mon cas, j’ai rajouté des disques virtuels de 16Go, pour simuler des disques physiques à synchroniser. De même, j’ai également rajouté des interfaces réseaux supplémentaires pour simuler un réseau dédié « stockage ».&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/04/drbd_infra-2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="installation-du-logiciel"&gt;Installation du logiciel
&lt;/h2&gt;&lt;p&gt;La société LINBIT qui distribue le logiciel DRBD propose des packages précompilés pour la plupart des distributions Linux classiques. L’ensemble des packages des différentes versions de DRBD sont disponibles sur le site de &lt;a class="link" href="https://www.linbit.com/drbd/" target="_blank" rel="noopener"
&gt;Linbit&lt;/a&gt;. Cependant, ces packages « officiels » précompilés nécessitent d’avoir payé le support.&lt;/p&gt;
&lt;p&gt;Note : Si les packages officiels sont réservés aux personnes qui payent le support, les sources, elles, sont bien entendu disponibles &lt;a class="link" href="https://www.linbit.com/linbit-software-download-page-for-linstor-and-drbd-linux-driver/" target="_blank" rel="noopener"
&gt;sur le site&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Heureusement, il est possible d’utiliser tout simplement les packages précompilés de votre distribution.&lt;/p&gt;
&lt;p&gt;A la base, quand j’avais écrit le tutoriel en 2015, j’avais des soucis de compatibilité entre la version du kernel et drbd de ma distribution CentOS (6.3 à l’époque&amp;hellip;). Ma version, 2.6.32-279 alors que les versions 8.3 et 8.4 de DRBD nécessitent le kernel 2.6.32-431. Mais rien ne vous empêche d’installer le kernel demandé pour résoudre ce problème.&lt;/p&gt;
&lt;p&gt;Pour ce tuto, voici les commandes que j’ai dû utiliser pour installer DRBD 9 (la dernière stable même si la 10 arrive bientôt) sur mes Ubuntu 18.04.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo apt update
sudo apt upgrade
sudo apt install software-properties-common
sudo add-apt-repository ppa:linbit/linbit-drbd9-stack
sudo apt-get update
sudo apt install drbd-utils python-drbdmanage drbd-dkms
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois que c’est installé, testez que tout fonctionne avec la commande suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;sudo modprobe drbd
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si tout se passe bien, elle ne devrait remonter aucune erreur. En revanche, si vous n’avez pas un kernel avec une version compatible, vous devriez avoir une erreur du type &amp;ldquo;file not found&amp;rdquo;. Dans ce cas-là, il faudra compiler DRBD à la main.&lt;/p&gt;
&lt;h2 id="préparation-des-machines"&gt;Préparation des machines
&lt;/h2&gt;&lt;p&gt;Les serveurs doivent évidemment pouvoir se joindre et se résoudre. Le mieux étant bien sûr un DNS correct, on pourra se rabattre dans le cadre d’un test sur &lt;em&gt;a minima&lt;/em&gt; un fichier /etc/hosts contenant les informations nécessaires :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;192.168.100.11 drbd1 drbd1.example.org
192.168.100.12 drbd2 drbd2.example.org
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Ensuite, j’ai créé, sur chaque serveur, deux partitions de 8 Go chacun sur le disque de 16. La première sera de type Linux, la seconde sera de type LVM.&lt;/p&gt;
&lt;p&gt;On oublie pas de créer les objets LVM pour pouvoir les utiliser plus tard.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;pvcreate /dev/sdb2
vgcreate vg_drbd /dev/sdb2
lvcreate -n lv_drbd -l 2047 vg_drbd
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="configuration"&gt;Configuration
&lt;/h2&gt;&lt;p&gt;Le fichier de configuration global de DRBD est &lt;em&gt;/etc/drbd.conf&lt;/em&gt;. Il définit les fichiers unitaires qui doivent être modifiés. Le fichier &lt;em&gt;/etc/drbd.conf&lt;/em&gt; en lui-même ne doit donc pas être modifié directement ; sauf dans le cas où on souhaite changer les fichiers de configuration inclus de répertoire.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/drbd.conf
# You can find an example in /usr/share/doc/drbd.../drbd.conf.example
include &amp;#34;drbd.d/global_common.conf&amp;#34;;
include &amp;#34;drbd.d/*.res&amp;#34;;
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Le fichier suivant doit contenir les paramètres et les commandes qui sont globaux à toutes les ressources DRBD.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;cat /etc/drbd.d/global_common.conf
# DRBD is the result of over a decade of development by LINBIT.
# In case you need professional services for DRBD or have
# feature requests visit http://www.linbit.com
global {
[...]
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="template-de-ressource"&gt;Template de ressource
&lt;/h3&gt;&lt;p&gt;Pour rendre la configuration lisible, on sépare les fichiers de configuration de manière à faire un fichier texte par ressource, nommé avec la convention r[nombre].res. Ici on prendra l’exemple le plus simple d’une synchronisation synchrone (protocole C, par défaut) dans un modèle actif/passif.
Pour vous aider à créer vos premières ressources, DRBD met à disposition, dans &lt;strong&gt;/etc/drbd.d/drbdctrl.res_template&lt;/strong&gt; un template dans lequel vous n’aurez qu’à modifier les valeurs.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;resource .drbdctrl {
net {
cram-hmac-alg sha1;
shared-secret &amp;#34;&amp;lt;your-shared-secret&amp;gt;&amp;#34;;
}
volume 0 {
device /dev/drbd0 minor 0;
disk /dev/mapper/&amp;lt;vgname&amp;gt;-.drbdctrl;
meta-disk internal;
}
on &amp;lt;node_1&amp;gt; {
node-id 0;
address &amp;lt;ipaddress&amp;gt;:&amp;lt;port&amp;gt;;
}
on &amp;lt;node_n&amp;gt; {
node-id &amp;lt;n&amp;gt;;
address &amp;lt;ipaddress&amp;gt;:&amp;lt;port&amp;gt;;
}
connection-mesh {
hosts &amp;lt;node_1&amp;gt; &amp;lt;node_2&amp;gt; ... &amp;lt;node_n&amp;gt;;
net {
protocol C;
}
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;h3 id="ressource-pour-un-disque-simple"&gt;Ressource pour un disque &amp;ldquo;simple&amp;rdquo;
&lt;/h3&gt;&lt;p&gt;Ici, c’est l’exemple le plus simple. On va indiquer que notre ressource est distribuée sur 2 serveurs sur un bête partition Linux. Les metadata, elles, sont stockées en local (ce qui n’est pas forcément le mieux, mais pour commencer ça suffira).&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/drbd.d/r0.res
resource r0 {
on drbd1 {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.100.11:7789;
meta-disk internal;
}
on drbd2 {
device /dev/drbd1;
disk /dev/sdb1;
address 192.168.100.12:7789;
meta-disk internal;
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Note : si le protocole de synchronisation n’est pas spécifié, on est en synchronisation synchrone par défaut.&lt;/p&gt;
&lt;p&gt;Attention : chaque ressource déclarée réserve le port TCP pour la communication de la ressource. Il faut donc incrémenter le numéro du device drbd ET incrémenter le numéro de port à chaque nouvelle ressource (et aussi s’assurer que le port est libre&amp;hellip;).&lt;/p&gt;
&lt;p&gt;Pour mes tests, j’ai également utilisé la possibilité offerte par DRBD d’utiliser des volumes LVM plutôt que des partitions brutes. La configuration est la même à ceci près qu’on pointe sur le LV plutôt que sur une partition.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/drbd.d/r1.res
resource r1 {
on drbd1 {
device /dev/drbd2;
disk /dev/vg_drbd/lv_drbd;
address 192.168.100.11:7790;
meta-disk internal;
}
on drbd2 {
device /dev/drbd2;
disk /dev/vg_drbd/lv_drbd;
address 192.168.100.12:7790;
meta-disk internal;
}
}
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="initialisation"&gt;Initialisation
&lt;/h2&gt;&lt;p&gt;Maintenant que tout est configuré, on va pouvoir déclencher l’étape d’initialisation des metadata et des ressources nouvellement créées.
Lancez les commandes suivantes sur les deux nœuds :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;drbdadm create-md r0
drbdadm create-md r1
drbdadm up r0
drbdadm up r1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Une fois que les commandes sont lancées, on peut afficher les informations sur l’initialisation des disques (état normal) avec &lt;strong&gt;drbdmon&lt;/strong&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/04/drbdmon1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Actuellement, les nœuds sont &lt;strong&gt;Inconsistants&lt;/strong&gt; et en Secondaire/Secondaire, car nous n’avons pas encore désigné le nœud principal. Nous allons &amp;ldquo;forcer&amp;rdquo; le sens dans lequel le disque doit être synchronisé.&lt;/p&gt;
&lt;p&gt;Sélectionner un des nœuds, qu’on va désigner comme &amp;ldquo;serveur primaire&amp;rdquo; et exécuter les commandes suivantes (uniquement sur lui) :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root@drbd1:~# drbdadm primary --force r0
root@drbd2:~# drbdadm primary --force r1
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ATTENTION : dans le cas d’un disque déjà créé, il faut bien ne pas se tromper de sens, au risque d’écraser le disque qui contiendrait les données.&lt;/p&gt;
&lt;p&gt;Une fois la synchronisation terminée, on peut utiliser le disque /dev/drbdX.&lt;/p&gt;
&lt;h2 id="cest-fini-"&gt;C’est fini ?
&lt;/h2&gt;&lt;p&gt;En fait, pas tout à fait. On ne va pas pouvoir utiliser nos disques exactement comme des disques classiques. Si vous formattez ce disque en ext4/xfs/whatever et que vous essayez de le monter sur vos deux serveurs drbd1 et drbd2, vous allez avoir une drôle de surprise.&lt;/p&gt;
&lt;p&gt;En effet, ces filesystems ne savent pas gérer les accès concurrents provenant de deux machines simultanées. On va donc devoir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;soit utiliser un filesystem capable de gérer les accès concurrents (&lt;a class="link" href="https://en.wikipedia.org/wiki/Clustered_file_system" target="_blank" rel="noopener"
&gt;page Wikipedia listant quelques clustered filesystems&lt;/a&gt;) comme OCFS2 ou GFS2. Si vous publiez les disques DRBD en iSCSI pour votre cluster VMware, vous n’aurez pas de problème non plus car le VMFS le gère très bien aussi.&lt;/li&gt;
&lt;li&gt;soit s’assurer à tout moment que le disque n’est monté que sur un seul serveur à la fois.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Évidemment la 2ème option est à proscrire si vous êtes dans un contexte de production. Cependant, cela reste possible si vous montez un cluster Pacemaker ou &lt;a class="link" href="https://blog.zwindler.fr/recherche/?keyword=RHCS" &gt;RHCS&lt;/a&gt; par exemple, qui va s’assurer que les bascules de stockage se font de manière propre.&lt;/p&gt;
&lt;p&gt;Enjoy !&lt;/p&gt;
&lt;h2 id="bonus--quelques-commandes-utiles"&gt;Bonus : quelques commandes utiles
&lt;/h2&gt;&lt;p&gt;Pour une ressource donnée, afficher le rôle du serveur local&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root@drbd1:~# drbdadm role r0
Primary
root@drbd1:~# drbdadm role r1
Secondary
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Afficher de manière concise l’état d’une ressource sur les nœuds&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root@drbd1:~# drbdadm dstate r0
UpToDate/UpToDate
root@drbd1:~# drbdadm dstate r1
Inconsistent/UpToDate
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Afficher plus de détails sur une ressource avec &lt;code&gt;drbdadmin&lt;/code&gt; pour un résultat simple ou &lt;code&gt;drbdsetup&lt;/code&gt; pour avoir plus de détails :&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2020/04/drbd_state.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;drbdsetup status r1 --verbose --statistics
r1 node-id:1 role:Secondary suspended:no
write-ordering:flush
volume:0 minor:2 disk:Inconsistent quorum:yes
size:8384220 read:0 written:1972628 al-writes:0 bm-writes:0 upper-pending:0 lower-pending:0 al-suspended:no blocked:no
drbd2 node-id:0 connection:Connected role:Primary congested:no ap-in-flight:0 rs-in-flight:0
volume:0 replication:SyncTarget peer-disk:UpToDate done:23.53 resync-suspended:no
received:1972628 sent:0 out-of-sync:6411740 pending:3 unacked:12 dbdt1:92.39 eta:68
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;En temps normal, toutes les ressources sont actives par défaut. Cependant, on peut les activer ou les désactiver à la main :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;drbdadm up r0
drbdadm down r1
# utiliser le mot clé « all » pour désigner toutes les ressources
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Si on modifie les fichiers de configuration global ou un fichier de ressource, il est nécessaire de mettre à jour la configuration sur les deux nœuds. Il est possible de reconfigurer les ressources même si elles sont opérationnelles grâce à la méthode suivante :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;drdbadm adjust r0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Changer le statut du nœud courant (pour le passer en primary s’il est secondary par exemple)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;drbdadm primary r1
drbdadm secondary r0
&lt;/code&gt;&lt;/pre&gt;&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://www.linbit.com/drbd-user-guide/drbd-guide-9_0-en/" target="_blank" rel="noopener"
&gt;User Guide DRBD 9.0 (Anglais)&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item><item><title>[Tutoriel] Créer un cluster de stockage GlusterFS sous Proxmox</title><link>https://blog.zwindler.fr/2017/02/28/tutoriel-creer-un-cluster-de-stockage-glusterfs-sous-proxmox/</link><pubDate>Tue, 28 Feb 2017 13:00:59 +0000</pubDate><guid>https://blog.zwindler.fr/2017/02/28/tutoriel-creer-un-cluster-de-stockage-glusterfs-sous-proxmox/</guid><description>&lt;img src="https://blog.zwindler.fr/2017/02/proxmox_and_glusterfs.webp" alt="Featured image of post [Tutoriel] Créer un cluster de stockage GlusterFS sous Proxmox" /&gt;&lt;h2 id="installation-de-glusterfs-sur-2-serveurs-proxmox"&gt;Installation de GlusterFS sur 2 serveurs Proxmox
&lt;/h2&gt;&lt;p&gt;Dans ce tutoriel je vais vous guider pas à pas pour ajouter la fonctionnalité de stockage distribué sur deux serveurs Proxmox. Ce tutoriel est également valable pour tout serveur sous Debian (Proxmox est une distribution Debian modifiée) ou même n’importe quelle autre distribution Linux modulo quelques ajustements.&lt;/p&gt;
&lt;h2 id="mais-comment-en-suis-je-arrivé-là-"&gt;Mais comment en suis-je arrivé là ?
&lt;/h2&gt;&lt;p&gt;Et bien récemment, j’ai commandé un serveur Kimsufi dans le but de pouvoir tester 2 ou 3 nouvelles technos sans encombrer un peu plus le dressing.&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2014/03/img_20140309_175554.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Un aperçu de mon dressing&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Me retrouvant donc avec 2 serveurs Kimsufi, j’ai voulu voir si je ne pouvais pas clusteriser tout ça. Pour la partie cluster de virtualisation, malheureusement ce n’est pas possible si les deux serveurs sont dans des réseaux distincts, pour des problèmes de multicast.&lt;/p&gt;
&lt;p&gt;Une solution aurait pu être de monter un VPN entre les deux mais j’ai préféré ne pas insister et voir si je ne pouvais pas me concentrer sur un autre point : créer un cluster de stockage !&lt;/p&gt;
&lt;p&gt;Dans les dernières versions, Proxmox VE propose directement dans la console une visualisation des volumes Ceph ainsi qu’un tutoriel pour &lt;a class="link" href="https://pve.proxmox.com/wiki/Ceph_Server" target="_blank" rel="noopener"
&gt;configurer la partie serveur directement sur les hôtes de virtualisation&lt;/a&gt;. Sur le papier, c’était donc le mécanisme de réplication de stockage à privilégier. Cependant, dans mon cas d’un « lab » avec seulement 2 serveurs sur un WAN, ce n’était pas l’idéal :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Before you start with Ceph, you need a working Proxmox VE cluster with 3 nodes (or more).&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Je me suis donc rabattu sur GlusterFS, qui a l’avantage d’être un peu plus simple de mise en place côté serveur même s’il n’est pas aussi bien intégré côté Proxmox.&lt;/p&gt;
&lt;h2 id="le-principe"&gt;Le principe
&lt;/h2&gt;&lt;p&gt;Déjà on peut commencer par la définition Wikipedia&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;GlusterFS est un système de fichiers libre distribué en parallèle, qui permet de stocker jusqu’à plusieurs pétaoctets (10^15 octets). C’est un système de fichiers de clusters. Livré en deux parties - un serveur et un client&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;En gros, &lt;em&gt;Gluster Server&lt;/em&gt; se charge de faire communiquer entre eux les hôtes et on défini des « &lt;em&gt;bricks&lt;/em&gt; » (espace de stockage sur un serveur donné) qu’on assemble entre elles pour donner un &lt;em&gt;volume&lt;/em&gt; (espace de stockage répliqué ou non). Et &lt;em&gt;Gluster Client&lt;/em&gt; vous permet d’accéder à un espace de fichiers qui va écrire simultanément sur l’ensemble des &lt;em&gt;bricks&lt;/em&gt; du &lt;em&gt;volume&lt;/em&gt; de manière transparente.&lt;/p&gt;
&lt;p&gt;Assez de théorie, maintenant, la pratique !&lt;/p&gt;
&lt;h2 id="prérequis"&gt;Prérequis
&lt;/h2&gt;&lt;p&gt;Sur les 2 serveurs Proxmox, j’ai créé en préventif un Fflesystem de 5G dédié à la configuration de Gluster. Pourquoi ? Car il y a un gros risque de plantage en cas de remplissage :&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Note: GlusterFS stores its dynamically generated configuration files at /var/lib/glusterd. If at any point in time GlusterFS is unable to write to these files (for example, when the backing filesystem is full), it will at minimum cause erratic behavior for your system; or worse, take your system offline completely. It is advisable to create separate partitions for directories such as /var/log to ensure this does not happen.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;lvcreate -L 5G -n var_lib_glusterd pve
Logical volume &amp;#34;var_lib_glusterd&amp;#34; created.
mkfs.ext4 /dev/pve/var_lib_glusterd
mkdir -p /var/lib/glusterd
echo &amp;#39;/dev/pve/var_lib_glusterd /var/lib/glusterd ext4 defaults 1 2&amp;#39; &amp;gt;&amp;gt; /etc/fstab
mount -a
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On récupère ensuite les sources sont disponibles sur le site &lt;a class="link" href="https://download.gluster.org/pub/gluster/glusterfs/LATEST/Debian/" target="_blank" rel="noopener"
&gt;gluster.org&lt;/a&gt;. Selon les distributions, la marche à suivre peut être différentes, notamment pour Ubuntu qui utilise un PPA.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;wget -O - http://download.gluster.org/pub/gluster/glusterfs/3.9/rsa.pub | apt-key add -
echo deb http://download.gluster.org/pub/gluster/glusterfs/3.9/LATEST/Debian/jessie/apt jessie main &amp;gt; /etc/apt/sources.list.d/gluster.list
apt-get update
apt-get install glusterfs-server
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Maintenant que le serveur est opérationnel, on créé nos bricks de 100Go sur un LV sur chaque serveur et on le monte.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;lvcreate -L 100G -n data_brick1 pve
mkfs.xfs /dev/pve/data_brick1
mkdir -p /data/brick1
echo &amp;#39;/dev/pve/data_brick1 /data/brick1 xfs defaults 1 2&amp;#39; &amp;gt;&amp;gt; /etc/fstab
mount -a &amp;amp;&amp;amp; mount
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Vérification du service sous Proxmox (Debian)&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;service glusterfs-server status
* glusterfs-server.service - LSB: GlusterFS server
Loaded: loaded (/etc/init.d/glusterfs-server)
Active: active (running) since Wed 2017-02-08 23:21:00 CET; 3 days ago
CGroup: /system.slice/glusterfs-server.service
└─29562 /usr/sbin/glusterd -p /var/run/glusterd.pid
Feb 08 23:21:00 srv2 glusterfs-server[29557]: Starting glusterd service: glusterd.
Feb 08 23:21:00 srv2 systemd[1]: Started LSB: GlusterFS server.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Comme les nœuds ont besoin d’échanger des informations entre eux, il va falloir ouvrir quelques ports, à savoir :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;111/UDP et TCP&lt;/li&gt;
&lt;li&gt;24007/TCP&lt;/li&gt;
&lt;li&gt;24008/TCP&lt;/li&gt;
&lt;li&gt;PUIS, un port par brique en partant du port 49152/TCP&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Sous iptables ça devrait donner quelque chose comme cela&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 24007:24008 -j ACCEPT
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 49152 -j ACCEPT
iptables -I INPUT -m state --state NEW -m tcp -p tcp --dport 111 -j ACCEPT
iptables -I INPUT -m state --state NEW -m udp -p udp --dport 111 -j ACCEPT
service iptables save
service iptables restart
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;ATTENTION : J’ai lu sur plusieurs sites qu’il faut ouvrir des ports à partir de 24009 pour les bricks. &lt;strong&gt;Ce n’est plus vrai depuis la version 3.4 !&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Si vous êtes dans ces versions plutôt ancienne, c’est effectivement le port 24009 et + qu’il faut ouvrir mais ce n’est maintenant plus le cas ! Vous aurez des problèmes difficiles à débuguer car vos noeuds serveurs dialoguerons mais les bricks d’un même volumes répliqué ne se synchroniseront pas.&lt;/p&gt;
&lt;p&gt;J’ai également lu qu’il était conseillé de s’assurer que la résolution soit toujours opérationnelle et donc de renseigner le fichier hosts mais ça, c’est à vous de voir.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;vi /etc/hosts
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On connecte maintenant les deux serveurs entre eux en exécutant cette commande que sur un des deux serveurs.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gluster peer probe srv2
peer probe: success.
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, le cluster est actif. On peut le vérifier avec les 2 commandes suivantes :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gluster peer status
Number of Peers: 1
Hostname: srv2
Uuid: aaaa-7d57-41c1-aaaa-c51f7e1c076a
State: Peer in Cluster (Connected)
gluster pool list
UUID Hostname State
aaaa-7d57-41c1-aaaa-c51f7e1c076a srv2 Connected
aaaa-6a78-44ce-aaaa-2feb3cfb3627 localhost Connected
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Sur les deux nœuds du cluster srv1 et srv2 :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;mkdir -p /data/brick1/gv0
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Depuis un des deux serveurs, on créé notre premier volume à partir des deux bricks de nos deux serveurs.&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gluster volume create gv0 replica 2 srv1:/data/brick1/gv0 srv2:/data/brick1/gv0
volume create: gv0: success: please start the volume to access data
gluster volume start gv0
volume start: gv0: success
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;On vérifie que le volume est marqué « Started » :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;gluster volume info
Volume Name: gv0
Type: Replicate
Volume ID: a3ffa060-ac5b-4b36-8b6c-8e77bad98cca
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: srv1:/data/brick1/gv0
Brick2: srv2:/data/brick1/gv0
Options Reconfigured:
transport.address-family: inet
performance.readdir-ahead: on
nfs.disable: on
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;A partir de là, notre volume est opérationnel est on peut commencer à le monter pour inscrire des données dedans !&lt;/p&gt;
&lt;h2 id="afficher-des-infos-sur-le-volume"&gt;Afficher des infos sur le volume
&lt;/h2&gt;&lt;p&gt;Afficher des infos très précises sur les performances du volume à l’aide des commandes suivantes :&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;root@srv2:~# gluster volume profile gv0 start
Starting volume profile on gv0 has been successful
root@srv2:~# gluster volume profile gv0 info
Brick: srv2:/data/brick1/gv0
---------------------------------------------
Cumulative Stats:
Block Size: 512b+ 65536b+ 131072b+
No. of Reads: 4 5 22
No. of Writes: 78 219 44
Block Size: 262144b+ 524288b+ 1048576b+
No. of Reads: 0 0 0
No. of Writes: 35 47 919
%-latency Avg-latency Min-Latency Max-Latency No. of calls Fop
--------- ----------- ----------- ----------- ------------ ----
0.00 0.00 us 0.00 us 0.00 us 5 RELEASE
0.00 0.00 us 0.00 us 0.00 us 442 RELEASEDIR
0.03 22.00 us 22.00 us 22.00 us 1 STATFS
0.04 32.00 us 32.00 us 32.00 us 1 GETXATTR
0.29 110.50 us 55.00 us 166.00 us 2 LOOKUP
99.64 38491.00 us 32866.00 us 44116.00 us 2 WRITE
Duration: 87590 seconds
Data Read: 3213312 bytes
Data Written: 1033611264 bytes
[...]
Brick: srv1:/data/brick1/gv0
--------------------------------------------
Cumulative Stats:
Block Size: 512b+ 65536b+ 131072b+
No. of Reads: 0 0 0
No. of Writes: 78 218 44
Block Size: 262144b+ 524288b+ 1048576b+
No. of Reads: 0 0 0
No. of Writes: 34 45 906
%-latency Avg-latency Min-Latency Max-Latency No. of calls Fop
--------- ----------- ----------- ----------- ------------ ----
0.00 0.00 us 0.00 us 0.00 us 5 RELEASE
0.00 0.00 us 0.00 us 0.00 us 1 RELEASEDIR
0.26 75.00 us 75.00 us 75.00 us 1 STATFS
0.35 103.00 us 103.00 us 103.00 us 1 GETXATTR
1.38 200.50 us 189.00 us 212.00 us 2 LOOKUP
98.01 14246.50 us 4943.00 us 23550.00 us 2 WRITE
Duration: 87589 seconds
Data Read: 0 bytes
Data Written: 1018144768 bytes
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Je vous rassure, ici, si les performances sont catastrophiques, c’est parce que le test a été réalisé en WAN sur ma lien ADSL pour particulier.&lt;/p&gt;
&lt;h2 id="configuration-dans-proxmox-partie-cliente"&gt;Configuration dans proxmox (partie cliente)
&lt;/h2&gt;&lt;p&gt;Maintenant que la partie serveur est configurée, on doit accéder au volume répliqué via le client. En effet, c’est seulement par ce biais que l’on pourra écrire en Y sur notre volume. Écrire directement dans le dossier d’un brick n’aura pas l’effet escompté.&lt;/p&gt;
&lt;p&gt;Depuis la console Proxmox, dans le menu « Stockage », cliquer sur « Ajouter / GlusterFS »&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/01/gluster_proxmox1.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/01/gluster3.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;p&gt;Dans la capture suivante, vous pouvez admirer ma connexion ADSL saturée en upload par la copie d’un fichier d’une machine virtuelle depuis mon serveur dans mon dressing vers mon kimsufi. Et après vérification, on a bien le fichier de machine virtuelle des deux côtés :-).&lt;/p&gt;
&lt;p&gt;&lt;img src="https://blog.zwindler.fr/2017/01/gluster2.avif"
loading="lazy"
&gt;&lt;/p&gt;
&lt;h2 id="sources"&gt;Sources
&lt;/h2&gt;&lt;ul&gt;
&lt;li&gt;&lt;a class="link" href="https://web.archive.org/web/20170312163612/https://www.0rion.netlib.re/forum4/viewtopic.php?t=298" target="_blank" rel="noopener"
&gt;www.0rion.netlib.re/forum4/viewtopic.php?t=298 (lien mort, j&amp;rsquo;utilise Internet Archive)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://www.guillaume-leduc.fr/le-stockage-distribue-avec-glusterfs.html" target="_blank" rel="noopener"
&gt;www.guillaume-leduc.fr/le-stockage-distribue-avec-glusterfs.html&lt;/a&gt; (lien mort, site fermé par son auteur en 2018, pas dispo sur Internet Archive)&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://pve.proxmox.com/wiki/Storage:_GlusterFS" target="_blank" rel="noopener"
&gt;pve.proxmox.com/wiki/Storage:_GlusterFS&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="link" href="https://docs.gluster.org/en/latest/Administrator-Guide/Monitoring-Workload/" target="_blank" rel="noopener"
&gt;docs.gluster.org/en/latest/Administrator-Guide/Monitoring-Workload/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description></item></channel></rss>