# [Debian] GlusterFS

## Introduction

**GlusterFS** permet de créer des espaces de données partagées ce qui peut servir pour faire répliquer deux partitions identiques entre deux serveurs distants.

## Source

- [Tutoriel - Installer GlusterFS sur Debian 11](https://shape.host/resources/optimize-filesystem-scalability-install-glusterfs-debian-11)

## Installation du cluster

Pour la haute disponibilité il est recommandé d'utiliser au moins <span style="text-decoration: underline;">trois instances</span> sur lesquels nous aurons notre partitions partagée.

Pour le tutoriel nous utiliserons trois machines sur **Debian 11**.

- Tout d'abord, toutes les machines du cluster doivent posséder un hostname, pour cela on définit le hostname avec la commande suivante :

```bash
hostnamectl set-hostname <FQDN>
```

Puis ajoutez les entrées dans le fichier **/etc/hosts** dans le format suivant :

```
<IP> <FQDN>
```

<p class="callout success">Vérifiez que le ping fonctionne en utilisant les noms d'hôtes.</p>

Ensuite, nous devons préparer la partition qui va accueillir les données sur les trois machines (notre disque sera **/dev/sdb**) :

```bash
apt install -y parted
```

```bash
parted /dev/sdb mklabel gpt mkpart SHARE ext4 1MiB 100%
```

Maintenant, nous devons préparer le dossier qui va accueillir le point de montage (ici **/share**) :

```bash
mkdir /share
```

Puis ajoutez cela dans le **/etc/fstab** pour être persistant après redémarrage :

```
/dev/sdb1    /share    ext4    defaults    0 1
```

Pour appliquer les changements et détecter les erreurs :

```bash
mount -a
```

<p class="callout warning">Ne laissez pas d'erreur, sinon vous risquez de ne pas pouvoir démarrer au prochain redémarrage du système !</p>

 Créer le dossier **/share/brick0** qui va accueillir les fichiers partagés :

```bash
mkdir -p /share/brick0
```

Désormais, nous pouvons installer le **serveur GlusterFS** sur nos trois machines :

```bash
apt install -y gnupg2 apt-transport-https software-properties-common curl && curl https://download.gluster.org/pub/gluster/glusterfs/10/rsa.pub | gpg --dearmor > /usr/share/keyrings/glusterfs-archive-keyring.gpg && DEBID=$(grep 'VERSION_ID=' /etc/os-release | cut -d '=' -f 2 | tr -d '"') && DEBVER=$(grep 'VERSION=' /etc/os-release | grep -Eo '[a-z]+') && DEBARCH=$(dpkg --print-architecture) && echo "deb [signed-by=/usr/share/keyrings/glusterfs-archive-keyring.gpg] https://download.gluster.org/pub/gluster/glusterfs/LATEST/Debian/${DEBID}/${DEBARCH}/apt ${DEBVER} main" | sudo tee /etc/apt/sources.list.d/gluster.list && apt update && apt install -y glusterfs-server
```

Activer le service et démarrez le :

```bash
systemctl enable --now glusterd
```

```
systemctl enable glusterd
```

On peut initialiser le cluster depuis le premier noeud (<span style="text-decoration: underline;">Node 1</span>) du cluster avec la commande suivante :

```bash
gluster peer probe <FQDN_NODE_2> && gluster peer probe <FQDN_NODE_3>
```

<p class="callout success"> On peut vérifier que les noeuds ont bien rejoins le cluster avec la commande **gluster pool list**  .</p>

<p class="callout info">On peut vérifier l'état du cluster avec la commande **gluster peer status** .</p>

On peut maintenant créer un premier volume partagé

```bash
gluster volume create <VOL_NAME> replica 3 <FQDN_NODE_1>:/share/brick0 <FQDN_NODE_2>:/share/brick0 <FQDN_NODE_3>:/share/brick0
```

On démarrer le volume :

```bash
gluster volume start <VOL_NAME>
```

<p class="callout info">On peut afficher les informations du volume avec la commande **gluster volume info** .</p>

## Montage côté client

Comme on le ferait avec un partage réseau type NFS ou Samba par exemple, nous allons monter notre volume glusterfs sur notre ou nos clients.

Pour cela, on installe d'abord le paquet **glusterfs-client** :

```bash
apt install -y glusterfs-client
```

On peut créer le point de montage :

```bash
mkdir -p /mnt/share
```

Et on monte le volume :

```bash
mount.glusterfs <FQDN_NODE_1>:/<VOL_NAME> /mnt/share
```

Pour un partage persistant, on ajoute une entrée dans le **/etc/fstab** :

```bash
<FQDN_NODE_1>:<VOL_NAME> /mnt/share glusterfs defaults,_netdev 0 0
```

Puis :

```bash
mount -a
```

<p class="callout success">Le volume distribué est prêt et tolère la panne pour supporter la **HA** !</p>