Vai al contenuto

Cluster ad Alta Disponibilità con GlusterFS

Prerequisiti

  • Conoscenza di un editor a riga di comando (in questo esempio utilizziamo vi)
  • Un buon livello di confidenza con l'emissione di comandi dalla riga di comando, la visualizzazione dei log e altri compiti generali di amministratore di sistema
  • Tutti i comandi sono eseguiti come utente root o sudo

Introduzione

GlusterFS è un file system distribuito.

Consente l'archiviazione di grandi quantità di dati distribuiti su cluster di server con una disponibilità molto elevata.

È composto da una parte server da installare su tutti i nodi dei cluster di server.

I client possono accedere ai dati tramite il client glusterfs o il comando mount.

GlusterFS può funzionare in due modalità:

  • modalità replicata: ogni nodo del cluster possiede tutti i dati.
  • modalità distribuita: nessuna ridondanza dei dati. Se uno storage si guasta, i dati sul nodo guasto vanno persi.

Entrambe le modalità possono essere utilizzate insieme per fornire un file system replicato e distribuito, purché si disponga del numero giusto di server.

I dati sono memorizzati all'interno dei blocchi.

Un Blocco è l'unità di base dello storage in GlusterFS, rappresentato da una directory di esportazione su un server del pool di storage fidato.

Piattaforma di Test

La nostra piattaforma fittizia è composta da due server e un client, tutti server Rocky Linux.

  • Primo nodo: node1.cluster.local - 192.168.1.10
  • Secondo nodo: node2.cluster.local - 192.168.1.11
  • Client1: client1.clients.local - 192.168.1.12

Nota

Assicuratevi di avere la larghezza di banda necessaria tra i server del cluster.

Ogni server del cluster dispone di un secondo disco per l'archiviazione dei dati.

Preparazione dei dischi

Creeremo un nuovo volume logico LVM che verrà montato su /data/glusterfs/vol0 su entrambi i server del cluster:

$ sudo pvcreate /dev/sdb
$ sudo vgcreate vg_data /dev/sdb
$ sudo lvcreate -l 100%FREE -n lv_data vg_data
$ sudo mkfs.xfs /dev/vg_data/lv_data
$ sudo mkdir -p /data/glusterfs/volume1

Nota

Se LVM non è disponibile sui vostri server, installatelo con il seguente comando:

$ sudo dnf install lvm2

Ora possiamo aggiungere il volume logico al file /etc/fstab:

/dev/mapper/vg_data-lv_data /data/glusterfs/volume1        xfs     defaults        1 2

E montarlo:

$ sudo mount -a

Poiché i dati sono memorizzati in un sottovolume chiamato brick, è possibile creare una directory in questo nuovo spazio dati dedicata ad esso:

$ sudo mkdir /data/glusterfs/volume1/brick0

Installazione

Al momento della stesura di questa documentazione, il repository originale CentOS Storage SIG non è più disponibile e il repository RockyLinux non è ancora disponibile.

Tuttavia, utilizzeremo (per il momento) la versione archiviata.

Prima di tutto, è necessario aggiungere il repository dedicato a gluster (nella versione 9) su entrambi i server:

sudo dnf install centos-release-gluster9

Nota

In seguito, quando sarà pronto sul sistema Rocky, potremo cambiare il nome di questo pacchetto.

Poiché l'elenco dei repo e l'url non sono più disponibili, cambiamo il contenuto di /etc/yum.repos.d/CentOS-Gluster-9.repo:

[centos-gluster9]
name=CentOS-$releasever - Gluster 9
#mirrorlist=http://mirrorlist.centos.org?arch=$basearch&release=$releasever&repo=storage-gluster-9
baseurl=https://dl.rockylinux.org/vault/centos/8.5.2111/storage/x86_64/gluster-9/
gpgcheck=1
enabled=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-SIG-Storage

Ora siamo pronti a installare il server glusterfs:

$ sudo dnf install glusterfs glusterfs-libs glusterfs-server

Regole del Firewall

Affinché il servizio funzioni sono necessarie alcune regole:

$ sudo firewall-cmd --zone=public --add-service=glusterfs --permanent
$ sudo firewall-cmd --reload

oppure:

$ sudo firewall-cmd --zone=public --add-port=24007-24008/tcp --permanent
$ sudo firewall-cmd --zone=public --add-port=49152/tcp --permanent
$ sudo firewall-cmd --reload

Risoluzione dei Nomi

Si può lasciare che sia il DNS a gestire la risoluzione dei nomi dei server del cluster, oppure si può scegliere di alleggerire i server da questo compito inserendo dei record per ciascuno di essi nei file /etc/hosts. In questo modo, le cose continueranno a funzionare anche in caso di malfunzionamento del DNS.

192.168.10.10 node1.cluster.local
192.168.10.11 node2.cluster.local

Avviare il servizio

Senza ulteriori indugi, avviamo il servizio:

$ sudo systemctl enable glusterfsd.service glusterd.service
$ sudo systemctl start glusterfsd.service glusterd.service

Siamo pronti a unire i due nodi allo stesso pool.

Questo comando deve essere eseguito una sola volta su un singolo nodo (qui sul nodo1):

sudo gluster peer probe node2.cluster.local
peer probe: success

Verifica:

node1 $ sudo gluster peer status
Number of Peers: 1

Hostname: node2.cluster.local
Uuid: c4ff108d-0682-43b2-bc0c-311a0417fae2
State: Peer in Cluster (Connected)
Other names:
192.168.10.11
node2 $ sudo gluster peer status
Number of Peers: 1

Hostname: node1.cluster.local
Uuid: 6375e3c2-4f25-42de-bbb6-ab6a859bf55f
State: Peer in Cluster (Connected)
Other names:
192.168.10.10

Ora possiamo creare un volume con 2 repliche:

$ sudo gluster volume create volume1 replica 2 node1.cluster.local:/data/glusterfs/volume1/brick0/ node2.cluster.local:/data/glusterfs/volume1/brick0/
Replica 2 volumes are prone to split-brain. Use Arbiter or Replica 3 to avoid this. See: http://docs.gluster.org/en/latest/Administrator%20Guide/Split%20brain%20and%20ways%20to%20deal%20with%20it/.
Do you still want to continue?
 (y/n) y
volume create: volume1: success: please start the volume to access data

Nota

Come dice il comando return, un cluster di 2 nodi non è la migliore idea al mondo contro lo split brain. Ma questo è sufficiente ai fini della nostra piattaforma di prova.

Ora possiamo avviare il volume per accedere ai dati:

$ sudo gluster volume start volume1

volume start: volume1: success

Controllare lo stato del volume:

$ sudo gluster volume status
Status of volume: volume1
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick node1.cluster.local:/data/glusterfs/v
olume1/brick0                               49152     0          Y       1210
Brick node2.cluster.local:/data/glusterfs/v
olume1/brick0                               49152     0          Y       1135
Self-heal Daemon on localhost               N/A       N/A        Y       1227
Self-heal Daemon on node2.cluster.local     N/A       N/A        Y       1152

Task Status of Volume volume1
------------------------------------------------------------------------------
There are no active volume tasks
$ sudo gluster volume info

Volume Name: volume1
Type: Replicate
Volume ID: f51ca783-e815-4474-b256-3444af2c40c4
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: node1.cluster.local:/data/glusterfs/volume1/brick0
Brick2: node2.cluster.local:/data/glusterfs/volume1/brick0
Options Reconfigured:
cluster.granular-entry-heal: on
storage.fips-mode-rchecksum: on
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

Lo stato deve essere " Started".

Possiamo già limitare un po' l'accesso al volume:

$ sudo gluster volume set volume1 auth.allow 192.168.10.*

È così semplice

Accesso client

Esistono diversi modi per accedere ai nostri dati da un client.

Il metodo preferito:

$ sudo dnf install glusterfs-client
$ sudo mkdir /data
$ sudo mount.glusterfs node1.cluster.local:/volume1 /data

Non ci sono repository aggiuntivi da configurare. Il client è già presente nei repo di base.

Creare un file e verificare che sia presente su tutti i nodi del cluster:

Sul client:

sudo touch /data/test

Su entrambe i server:

$ ll /data/glusterfs/volume1/brick0/
total 0
-rw-r--r--. 2 root root 0 Feb  3 19:21 test

Suona bene! Ma cosa succede se il nodo 1 si guasta? È quello specificato al momento del montaggio dell'accesso remoto.

Fermiamo il nodo uno:

$ sudo shutdown -h now

Controlla lo stato sul nodo2:

$ sudo gluster peer status
Number of Peers: 1

Hostname: node1.cluster.local
Uuid: 6375e3c2-4f25-42de-bbb6-ab6a859bf55f
State: Peer in Cluster (Disconnected)
Other names:
192.168.10.10
[antoine@node2 ~]$ sudo gluster volume status
Status of volume: volume1
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick node2.cluster.local:/data/glusterfs/v
olume1/brick0                               49152     0          Y       1135
Self-heal Daemon on localhost               N/A       N/A        Y       1152

Task Status of Volume volume1
------------------------------------------------------------------------------
There are no active volume tasks

Il nodo1 non è presente.

E sul client:

$ ll /data/test
-rw-r--r--. 1 root root 0 Feb  4 16:41 /data/test

Il file è ancora presente.

Al momento della connessione, il client glusterfs riceve un elenco di nodi a cui può rivolgersi, il che spiega la commutazione trasparente a cui abbiamo appena assistito.

Conclusioni

Anche se non ci sono repository attuali, l'uso dei repository archiviati che CentOS aveva per GlusterFS funzionerà ancora. Come già detto, GlusterFS è piuttosto facile da installare e mantenere. L'uso degli strumenti dalla riga di comando è un processo piuttosto semplice. GlusterFS aiuta a creare e mantenere cluster ad alta disponibilità per l'archiviazione e la ridondanza dei dati. Per ulteriori informazioni su GlusterFS e sull'utilizzo dello strumento, consultare le pagine della documentazione ufficiale.


Ultimo aggiornamento: 30 giugno 2022

Author: Antoine Le Morvan

Contributors: Steven Spencer, Franco Colussi