Speicher verteilt nutzen mit Gluster

Erfahren Sie, wie Sie Gluster installieren und verwenden, um verteilten Speicher für Docker-Container auf einem Linux-Server bereitzustellen. Gluster ist ein verteiltes Dateisystem, mit dem Sie ein einziges Speicher-Volume über mehrere Hosts hinweg erstellen können.

Dank des neuen Docker Volume Plug-ins für Gluster ist Gluster die erste Wahl für die Erstellung eines verteilten Datenspeicher-Volume für Docker-Container. Es bietet eine einfache Lösung für Situationen, in denen Sie Container auf mehreren Hosts (Servern) ausführen müssen, die alle Zugriff auf das gleiche gemeinsame Speicher-Volume haben.

Anforderungen

  • Mindestens zwei Linux-Server, auf denen entweder Ubuntu 14.04 oder CentOS 7 läuft
  • Docker installiert und funktionsfähig

Firewall-Regeln

Um zu beginnen, müssen Sie den Firewall-Zugriff für die von Gluster verwendeten Ports erlauben. Gehen Sie zu Ihrem Cloud Panel und klicken Sie auf Netzwerk -> Firewall-Richtlinien (Network -> Firewall Policies) im Menü auf der linken Seite.

Click Network -> Firewall Policies

Wenn Sie zuvor eine Firewall-Richtlinie erstellt haben, klicken Sie auf diese Richtlinie, um sie auszuwählen, und scrollen Sie nach unten, um sie zu bearbeiten. Klicken Sie andernfalls auf Erstellen (Create), um Ihre neue Firewall-Richtlinie zu erstellen.

Click Create

Geben Sie Ihrer Richtlinie einen Namen und geben Sie dann Ihre Firewall-Regeln ein.

Add firewall policy

Nachdem Sie jede Regel hinzugefügt haben, klicken Sie auf die grüne Schaltfläche +, um sie hinzuzufügen und eine neue Zeile zu erhalten.

Click the green +

Fügen Sie die folgenden Regeln hinzu:

TCP/UDP, from port 111 to port 111, ALL 
TCP/UDP, from port 24007 to port 24007, ALL
TCP/UDP, from port 24008 to port 24008, ALL 
TCP, from port 2049 to port 2049, ALL  
TCP, from port 38465 to port 38465, ALL    
TCP, from port 38466 to port 38466, ALL     
TCP, from port 38467 to port 38467, ALL

Zusätzlich zu dieser Liste müssen Sie für jeden Knoten, der dem gemeinsamen Speicherpool hinzugefügt wird, einen TCP/UDP-Port von 49152 hinzufügen.

Dieses Tutorial verwendet zwei Knoten, daher müssen Sie mindestens die folgenden beiden Regeln hinzufügen:

TCP/UDP, from port 49152 to port 49152, ALL  
TCP/UDP, from port 49153 to port 49153, ALL   

WICHTIG: Wenn es sich um eine neue Firewall-Richtlinie handelt, sollten Sie auch alle Firewall-Regeln hinzufügen, die für Ihre bestehenden Dienste gelten.

Klicken Sie auf die Schaltfläche Vordefinierte Werte hinzufügen (Add Predefined Values) und wählen Sie alle zutreffenden Dienste aus. Stellen Sie zumindest sicher, dass Sie eine Regel für SSH hinzufügen, damit Sie SSH auf Ihrem Server verwenden können.

Add predefined values

Wenn Sie Ihre neuen Firewall-Regeln hinzugefügt haben, klicken Sie auf die Schaltfläche Erstellen (Create).

Click Create

Als nächstes müssen Sie Ihre Server dieser Firewall-Regel zuordnen. Scrollen Sie nach unten und klicken Sie auf die Schaltfläche Zuweisen (Assign).

Click Assign

Klicken Sie hier, um den/die Server auszuwählen, die Sie dieser Firewall-Regel zuordnen möchten, und klicken Sie dann auf Änderungen speichern.

Assign server

Gluster auf Ubuntu 14.04 installieren

Um Gluster auf Ubuntu 14.04 zu installieren, starten Sie mit dem Befehl:

sudo apt-get update

Sobald alle Pakete aktualisiert sind, führen Sie den Befehl aus:

sudo apt-get install glusterfs-server

Dadurch wird Gluster installiert und der Dienst gestartet.

Sie können den Status von Gluster mit dem Befehl überprüfen:

sudo service glusterfs-server status

Wenn Sie Gluster neu starten, stoppen oder starten müssen, gelten die üblichen Dienstbefehle:

sudo service glusterfs-server restart
sudo service glusterfs-server stop
sudo service glusterfs-server start

Installieren Sie Gluster auf CentOS 7.

Um Gluster auf CentOS 7 zu installieren, verwenden Sie zunächst den Befehl:

sudo yum update

Als nächstes laden Sie das neueste glusterfs-epel Repository herunter:

sudo wget -P /etc/yum.repos.d/ http://download.gluster.org/pub/gluster/glusterfs/LATEST/CentOS/glusterfs-epel.repo

Und das neueste EPEL-Repository:

sudo yum install http://dl.fedoraproject.org/pub/epel/epel-release-latest-7.noarch.rpm

Installieren Sie Gluster und Samba mit folgenden Befehl:

sudo yum install glusterfs-server samba

Nachdem die Installation von Gluster und Samba abgeschlossen wurde, starten Sie den Gluster-Dienst mit dem Befehl:

sudo systemctl start glusterd.service

Sie können den Status von Gluster mit folgendem Befehl überprüfen:

sudo systemctl status glusterd.service

Sollten Sie Gluster neu starten, stoppen oder starten müssen, gelten die üblichen systemctl-Befehle:

sudo systemctl restart glusterd.service
sudo systemctl stop glusterd.service
sudo systemctl start glusterd.service

Erstellen eines Clusters

Nach der Installation von Gluster können Sie mit folgendem Befehl überprüfen, ob es funktioniert:

sudo glusterfs --version

Wir werden für dieses Tutorial zwei Server verwenden, die als server1 und server2 bezeichnet werden. Sie können so viele andere Server verwenden, wie Sie möchten, führen Sie einfach die gleichen Befehle auf jedem Server aus.

Gluster kann mit Servern nach IP-Adresse oder nach Hostname arbeiten, wenn die Server über den Hostnamen erreichbar sind. In diesem Tutorial werden folgende Daten verwendet:

  • server1 IP Addresse: 192.0.0.1
  • server2 IP Addresse: 192.0.0.2

Ersetzen Sie in den folgenden Beispielen Ihre eigenen Hostnamen oder IP-Adressen.

Lassen Sie zu Beginn Gluster die Server testen, die Sie hinzufügen möchten. Testen Sie Server2 von Server1 aus mit folgendem Befehl:

sudo gluster peer probe 192.0.0.2

Gluster sollte bei Erfolg mit "Peer probe Success" antworten.

Wechseln Sie zu Server2 und testen Sie Server1:

sudo gluster peer probe 192.0.0.1

Gluster sollte wieder mit Peer-Sonde reagieren: Erfolg.

Nachdem Sie Gluster mitgeteilt haben, welche Server sich im Cluster befinden, testen Sie den Server-Cluster mit dem Befehl:

sudo gluster peer status

Dies sollte eine Meldung wie:

Number of Peers: 1

Hostname: 192.0.0.2
Uuid: 5d77763c-3043-4a1d-bdb7-e07a4d6dc46b
State: Peer in Cluster (Connected)

Diese Meldung sagt uns, dass der Zwei-Server-Cluster korrekt funktioniert. Es gibt 1 weiteren Peer im Cluster, die IP-Adresse 192.0.0.0.0.2.

Wenn Sie den gleichen Befehl von server2 ausführen, erhalten Sie eine ähnliche Antwort, aber es wird stattdessen die IP-Adresse von server1 angezeigt:

Number of Peers: 1

Hostname: 192.0.0.1
Uuid: 8186baf0-ef76-4b40-ae7d-6a3bd1957a3c
State: Peer in Cluster (Connected)

Erstellen eines Gluster-Volumes

Nachdem der Cluster nun betriebsbereit ist, ist es an der Zeit, das Speicher-Volume zuzuweisen.

Erstellen Sie zunächst ein Speicherverzeichnis auf Server1, das von Gluster zum Speichern der Daten verwendet wird:

sudo mkdir -p /data/media

Erstellen Sie das gleiche Speicherverzeichnis auf server2.

Um das Gluster-Volume zu erstellen, verwenden Sie den Befehl:

sudo gluster volume create [volume name] replica [replica number] transport tcp [Server 1 IP address or hostname]:[path to storage directory] [Server 2 IP address or hostname]:[path to storage directory] 

Wenn Sie mehr Server verwenden, fügen Sie einfach ihre Informationen am Ende im gleichen Format hinzu:

[server IP address or hostname]:[path to storage directory]

Wenn Sie weitere Volumes hinzufügen, ändern Sie die Repliknummer so, dass sie der Anzahl der von Ihnen verwendeten Volumes entspricht.

Für dieses Beispiel werden wir das Volume mit dem Befehl erstellen:

sudo gluster volume create media replica 2 transport tcp 192.0.0.1:/data/media  192.0.0.2:/data/media force

Nachdem das Volume erstellt wurde, starten Sie das Volume mit dem Befehl:

sudo gluster volume start [volume name]

In diesem Fall lautet der Befehl: sudo gluster volume start media

sudo gluster volume start media

Sie können den Status des Volumes mit dem Befehl überprüfen:

sudo gluster volume info

Dies führt zu Ergebnissen, die in etwa so aussehen:

Volume Name: media
Type: Replicate
Volume ID: c5cadbea-0054-4c41-853e-b50733aacebf
Status: Started
Number of Bricks: 1 x 2 = 2
Transport-type: tcp
Bricks:
Brick1: 192.0.0.1:/data/media
Brick2: 192.0.0.2:/data/media
Options Reconfigured:
performance.readdir-ahead: on

Sie müssen das Gluster-Volume mounten, bevor Sie es richtig verwenden können. Obwohl es möglich ist, Dateien einfach auf das Gluster-Volume zu schreiben (in unserem Beispiel /data/media), wird dringend empfohlen, dass Sie mit dem Gluster-Volume über einen Mount-Punkt arbeiten.

Der Befehl zum Einbinden des Gluster-Volumes lautet:

sudo mount -t glusterfs [hostname or IP address]:/[volume name] [mount point]

Hinweis: Nach gängiger Konvention werden Speichermedien in das Verzeichnis /mnt eingebunden. Wenn Sie diesen Einhängepunkt jedoch bereits verwenden, müssen Sie einen neuen für Gluster erstellen. Dazu erstellen Sie einfach das Verzeichnis und verwenden dann den Pfad zu diesem Verzeichnis im Befehl.

Dieser Befehl muss für jeden Host wiederholt werden, der auf das Gluster-Volume zugreift.

Auf Server1 ist der Befehl:

sudo mount -t glusterfs 192.0.0.1:/media /mnt

Auf Server2 ist der Befehl:

sudo mount -t glusterfs 192.0.0.2:/media /mnt

Als nächstes testen Sie, um sicherzustellen, dass das Volume funktioniert. Führen Sie den Befehl von server1 aus:

sudo echo "Hello from Server1" >> /mnt/hello-from-server1

Wenn Sie die Dateien im Verzeichnis /mnt auflisten, sehen Sie die Datei dort:

ls /mnt

Wechseln Sie zu server2 und führen Sie den Befehl aus:

sudo echo "Hello from Server2" >> /mnt/hello-from-server2

Installieren Sie das Gluster Plug-In für Docker unter Ubuntu 14.04.

Installieren Sie Etherium zunächst mit den Befehlen:

sudo apt-get install software-properties-common
sudo add-apt-repository ppa:ethereum/ethereum
sudo add-apt-repository ppa:ethereum/ethereum-dev
sudo apt-get update
sudo apt-get install ethereum

Als nächstes installieren Sie Go, Git und Mercurial mit den Befehlen:

sudo apt-get install golang  
sudo apt-get install gccgo
sudo apt-get install mercurial
sudo apt-get install git

Aktualisieren Sie Ihre Umgebungsvariablen, indem Sie die Befehle ausführen:

export GOPATH=$HOME/go  
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$GOPATH/bin  

Installieren Sie schließlich das Docker Volume Plug-In für Gluster mit dem Befehl.

go get github.com/calavera/docker-volume-glusterfs

Installieren Sie das Gluster Plug-In für Docker auf CentOS 7.

Installieren Sie zunächst Go mit dem Befehl:

sudo yum install golang
export GOPATH=$HOME/go  
PATH=$PATH:$HOME/.local/bin:$HOME/bin:$GOPATH/bin  

Installieren Sie Git und Mercurial mit dem Befehl:

sudo yum install git
sudo yum install hg

Installieren Sie schließlich das Docker Volume Plug-In für Gluster mit dem Befehl:

go get github.com/calavera/docker-volume-glusterfs

Starten des Docker Volume Plug-Ins

Starten Sie zunächst das Plug-in auf server1 mit dem Befehl:

docker-volume-glusterfs -servers [Server 1 hostname or IP address]:[Server 2 hostname or IP address] &

Hinweis: sudo funktioniert standardmäßig nicht für den Befehl docker-volume-glusterfs. Werden Sie root über den Befehl "su root" oder fügen Sie den Befehl /root/go/bin/bin/docker-volume-glusterfs zu der Liste der mit "sudo" verfügbaren Befehle auf Ihrem System hinzu. 

Listen Sie alle Server auf, die Sie verwenden, entweder nach IP-Adresse oder Hostname, getrennt durch einen Doppelpunkt (keine Leerzeichen) am Ende dieses Befehls.

Für dieses Beispiel verwenden wir zwei Server, also beginnen wir mit dem Befehl:

docker-volume-glusterfs -servers 192.0.0.1:192.0.0.2 &

Wechseln Sie zu server2 und führen Sie den gleichen Befehl aus, um das Plug-in zu starten. Wiederholen Sie dies für jeden anderen Server, den Sie dem Cluster hinzufügen.

Verwendung des Docker Volume Plug-Ins

Um das Gluster-Volume zu verwenden, fügen Sie einfach --volume-driver glusterfs zum Docker run-Befehl hinzu und verwenden Sie dann --volume, um das entfernte Volume anzugeben:

sudo docker run --volume-driver glusterfs -v [name of Gluster volume]:[path to storage directory] [other flags and commands as wanted]

Starten Sie das Gluster-Plugin für jeden der Container, die Sie mit dem Gluster-Volume verbinden möchten, auf jedem der Server, die Sie verwenden möchten.

Starten Sie zunächst auf server1 einen Container aus dem offiziellen CentOS 7-Image und lassen Sie ihn einen Befehl zum Erstellen einer Testdatei auf dem Container ausführen:

sudo docker run -it --volume-driver glusterfs -v media:/mnt centos echo "Hello from a container" >> /mnt/hello-from-container

Dass der Container gestartet ist, sehen Sie an der Datei hello-from-container, wenn Sie die Dateien im Verzeichnis /mnt auflisten: 

Sobald der Container gestartet ist, wenn Sie die Dateien im Verzeichnis /mnt auflisten, wechseln Sie zu server2, starten Sie einen Container aus dem offiziellen CentOS 7-Image und hängen Sie ihn in einem Terminal an: Sie sehen die Datei hello-from-container:

sudo docker run -it --volume-driver glusterfs -v media:/mnt centos /bin/bash

Sobald Sie sich an der Eingabeaufforderung des Containers befinden, listen Sie die Dateien im Shared Storage Volume mit dem Befehl auf:

ls /mnt

Sie sehen alle drei Dateien, die wir bisher erstellt haben: hello-from-server1, hello-from-server2 und hello-from-container.

Fehlerbehebung bei grundlegenden Gluster-Problemen

Wenn Sie Probleme mit Gluster haben, überprüfen Sie bitte die folgenden Punkte:

1. Läuft Gluster?

Sie können den Status des Gluster-Daemons mit Hilfe der Befehle überprüfen:

  • Ubuntu 14.04: sudo service glusterfs-server status
  • CentOS 7: sudo systemctl status glusterd.service

Wenn der Daemon nicht läuft, starten Sie ihn mit dem Befehl:

  • Ubuntu 14.04: sudo service glusterfs-server start
  • CentOS 7: sudo systemctl start glusterd.service

2. Läuft das Volume?

Verwenden Sie den Befehl:

sudo gluster volume info

Sie sollten eine wie folgt lautende Zeile sehen: 

Status: Started

Wenn nicht, müssen Sie das System möglicherweise mit folgendem Befehl starten:

sudo gluster volume start [volume name]

3. Sind alle Peers verbunden?

Sie können den Status aller Peers Ihres Clusters mit diesem Befehl überprüfen:

sudo gluster peer status

Der Befehl gibt die Anzahl der anderen Peeers im Cluster zurück. Wenn Sie beispielsweise zwei Server in einem Cluster haben, lautet die Ausgabe:

Number of Peers: 1

Es wird auch die IP-Adresse oder der Hostname der anderen Peers aufgelistet.

4. Sind alle Ports offen?

Gluster benötigt eine lange Liste von offenen Ports, einschließlich eines Ports für jeden Host, den Sie dem Cluster hinzufügen. Diese Liste muss zu Ihrem Cloud Panel und zu jeder anderen Firewall hinzugefügt werden, die Sie auf Ihren Servern verwenden.

5. Gluster neu synchronisieren (Selbstreparatur)

Der Gluster-Daemon synchronisiert Dateien automatisch neu (Self-heal / Selbstreparatur), wenn es Probleme gibt. Manchmal kann es jedoch sinnvoll sein, diesen Vorgang manuell auszulösen.

Um die Neusynchronisierung von Gluster zu erzwingen, verwenden Sie den Befehl:

sudo gluster volume heal [volume name]

Um beispielsweise das Volume, das wir in diesem Tutorial namens media erstellt haben, neu zu synchronisieren, wäre der Befehl wie folgt:

sudo gluster volume heal media