Installation eines verteilten, ausfallsicheren Objektspeichers LeoFS, kompatibel mit S3- und NFS-Clients

Laut Opennet: LeoFS — verteiltes, fehlertolerantes Objektspeicher LeoFS, kompatibel mit Clients, die die Amazon S3-API und REST-API nutzen, sowie im NFS-Servermodus arbeiten kann. Es gibt Optimierungen für die Speicherung sowohl kleiner als auch sehr großer Objekte, es ist ein integrierter Caching-Mechanismus vorhanden, und eine Replikation von Speichern zwischen Rechenzentren ist möglich. Zu den Zielen des Projekts gehört die Erreichung einer Zuverlässigkeit von 99,9999999 % durch redundante Replikation von Duplikaten und die Vermeidung eines Single Point of Failure. Der Code des Projekts ist in Erlang geschrieben.

LeoFS besteht aus drei Komponenten:

  • LeoFS Storage — behandelt die Operationen zum Hinzufügen, Abrufen und Löschen von Objekten und Metadaten, verantwortlich für die Durchführung von Replikationen, Wiederherstellungen und die Bildung von Warteschlangen für Kundenanfragen.
  • LeoFS Gateway — bearbeitet HTTP-Anfragen und leitet Antworten an die Clients unter Verwendung der REST-API oder S3-API weiter, sorgt für das Caching der meistgefragten Daten im Arbeitsspeicher und auf der Festplatte.
  • LeoFS Manager — überwacht den Betrieb der Knoten LeoFS Gateway und LeoFS Storage, führt eine Statusüberwachung der Knoten durch und prüft die Prüfziffern. Gewährleistet die Datenintegrität und hohe Verfügbarkeit des Speichers.

In diesem Beitrag werden wir LeoFS mit Ansible-Playbook installieren und S3, NFS testen.

Wenn Sie versuchen, LeoFS mit den offiziellen Playbooks zu installieren, werden Sie auf verschiedene Fehler stoßen: 1,2. In diesem Beitrag werde ich erläutern, was zu tun ist, um diese Fehler zu vermeiden.

Für den Ort, an dem Sie das Ansible-Playbook ausführen, muss Netcat installiert werden.

Beispiel-Inventar

Beispiel-Inventar (im Repository hosts.sample):

# Please check roles/common/vars/leofs_releases for available versions
[all:vars]
leofs_version=1.4.3
build_temp_path="/tmp/leofs_builder"
build_install_path="/tmp/"
build_branch="master"
source="package"

#[builder]
#172.26.9.177

# nodename of leo_manager_0 and leo_manager_1 are set at group_vars/all
[leo_manager_0]
172.26.9.176

# nodename of leo_manager_0 and leo_manager_1 are set at group_vars/all
[leo_manager_1]
172.26.9.178

[leo_storage]
172.26.9.179 leofs_module_nodename=S0@172.26.9.179
172.26.9.181 leofs_module_nodename=S0@172.26.9.181
172.26.9.182 leofs_module_nodename=S0@172.26.9.182
172.26.9.183 leofs_module_nodename=S0@172.26.9.183

[leo_gateway]
172.26.9.180 leofs_module_nodename=G0@172.26.9.180
172.26.9.184 leofs_module_nodename=G0@172.26.9.184

[leofs_nodes:children]
leo_manager_0
leo_manager_1
leo_gateway
leo_storage

Server vorbereiten

Deaktivierung von Selinux. Ich hoffe, dass die Gemeinschaft Richtlinien für Selinux für LeoFS erstellt.

    - name: Installiere libselinux als Voraussetzung für das SELinux-Ansible-Modul
      yum:
        name: "{{item}}"
        state: latest
      with_items:
        - libselinux-python
        - libsemanage-python

    - name: Deaktiviere SELinux beim nächsten Neustart
      selinux:
        state: disabled

    - name: Setze SELinux in den permissiven Modus, bis die Maschine neu gestartet wird
      command: setenforce 0
      ignore_errors: true
      changed_when: false

Installation netcat und redhat-lsb-core. netcat wird benötigt für leofs-adm, redhat-lsb-core wird benötigt, um die OS-Version zu bestimmen hier.

    - name: Pakete installieren
      yum: name={{ item }} state=present
      with_items:
        - nmap-ncat
        - redhat-lsb-core

Erstellen des Benutzers leofs und Hinzufügen zu der Gruppe wheel

    - name: Benutzer leofs erstellen
      group:
        name: leofs
        state: present

    - name: Erlaube der Gruppe 'wheel' passwortloses Sudo
      lineinfile:
        dest: /etc/sudoers
        state: present
        regexp: '^%wheel'
        line: '%wheel ALL=(ALL) NOPASSWD: ALL'
        validate: 'visudo -cf %s'

    - name: Füge den Benutzer 'leofs' zur Gruppe 'wheel' hinzu
      user:
        name: leofs
        groups: wheel
        append: yes

Erlang-Installation

    - name: Remote erlang-20.3.8.23-1.el7.x86_64.rpm mit yum installieren
      yum: name=https://github.com/rabbitmq/erlang-rpm/releases/download/v20.3.8.23/erlang-20.3.8.23-1.el7.x86_64.rpm

Die vollständige Version des korrigierten Ansible-Playbooks finden Sie hier: https://github.com/patsevanton/leofs_ansible

Installation, Konfiguration, Start

Führen Sie dann aus, wie es in https://github.com/leo-project/leofs_ansible ohne build_leofs.yml

## Install LeoFS
$ ansible-playbook -i hosts install_leofs.yml

## Config LeoFS
$ ansible-playbook -i hosts config_leofs.yml

## Start LeoFS
$ ansible-playbook -i hosts start_leofs.yml

Überprüfen Sie den Status des Clusters auf Primary LeoManager

leofs-adm status

Primary und Secondary sind in den Logs des Ansible-Playbooks zu sehen

Installation eines verteilten, ausfallsicheren Objektspeichers LeoFS, kompatibel mit S3- und NFS-Clients

Installation eines verteilten, ausfallsicheren Objektspeichers LeoFS, kompatibel mit S3- und NFS-Clients

Die Ausgabe wird ungefähr so aussehen

 [Systemkonfiguration]
-----------------------------------+----------
 Element                          | Wert    
-----------------------------------+----------
 Basis-/Konsistenzebene
-----------------------------------+----------
                    Systemversion | 1.4.3
                        Cluster-ID | leofs_1
                             DC-ID | dc_1
                    Gesamtanzahl der Replikate | 2
          Anzahl der Erfolge von R | 1
          Anzahl der Erfolge von W | 1
          Anzahl der Erfolge von D | 1
 Anzahl der rackbewussten Replikate | 0
                         Ringgröße | 2^128
-----------------------------------+----------
 Multi-DC-Replikationseinstellungen
-----------------------------------+----------
 [mdcr] max Anzahl der beitrittsfähigen DCs | 2
 [mdcr] Gesamtanzahl der Replikate pro DC    | 1
 [mdcr] Anzahl der Erfolge von R   | 1
 [mdcr] Anzahl der Erfolge von W   | 1
 [mdcr] Anzahl der Erfolge von D   | 1
-----------------------------------+----------
 Manager RING-Hash
-----------------------------------+----------
                 aktueller Ring-Hash | a0314afb
                vorheriger Ring-Hash | a0314afb
-----------------------------------+----------

 [Zustand der Node(s)]
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
 Typ  |         Node         |    Zustand   | Rack-ID |  aktueller Ring |   vorheriger Ring |          aktualisiert am         
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
  S    | S0@172.26.9.179      | läuft        |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.181      | läuft        |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.182      | läuft        |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.183      | angeschlossen |         |                |                | 2019-12-05 10:33:58 +0000
  G    | G0@172.26.9.180      | läuft        |         | a0314afb       | a0314afb       | 2019-12-05 10:33:49 +0000
  G    | G0@172.26.9.184      | läuft        |         | a0314afb       | a0314afb       | 2019-12-05 10:33:49 +0000
-------+----------------------+--------------+---------+----------------+----------------+----------------------------

Benutzer erstellen

Benutzer leofs erstellen:

leofs-adm create-user leofs leofs

  access-key-id: 9c2615f32e81e6a1caf5
  secret-access-key: 8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb

Liste der Benutzer:

leofs-adm get-users
user_id     | role_id | access_key_id          | erstellt am                
------------+---------+------------------------+---------------------------
_test_leofs | 9       | 05236                  | 2019-12-02 06:56:49 +0000
leofs       | 1       | 9c2615f32e81e6a1caf5   | 2019-12-02 10:43:29 +0000

Bucket erstellen

Bucket erstellt

leofs-adm add-bucket leofs 9c2615f32e81e6a1caf5
OK

Liste der Buckets:

 leofs-adm get-buckets
cluster id   | bucket   | owner  | berechtigungen      | erstellt am                
-------------+----------+--------+------------------+---------------------------
leofs_1      | leofs    | leofs  | Ich(vollständige Kontrolle) | 2019-12-02 10:44:02 +0000

S3cmd konfigurieren

Im Feld Name des HTTP-Proxyservers geben Sie die IP-Adresse des Gateway-Servers an

s3cmd --configure 

Geben Sie neue Werte ein oder akzeptieren Sie die Standardwerte in Klammern mit Enter.
Siehe Benutzerhandbuch für eine detaillierte Beschreibung aller Optionen.

Der Access Key und der Secret Key sind Ihre Identifikatoren für Amazon S3. Lassen Sie diese leer, um die Umgebungsvariablen zu verwenden.
Access Key [9c2615f32e81e6a1caf5]: 
Secret Key [8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb]: 
Standardregion [US]: 

Verwenden Sie "s3.amazonaws.com" für den S3-Endpunkt und ändern Sie ihn nicht in das Ziel-Amazon S3.
S3-Endpunkt [s3.amazonaws.com]: 

Verwenden Sie "%(bucket)s.s3.amazonaws.com" für das Ziel-Amazon S3. Die Variablen "%(bucket)s" und "%(location)s" können verwendet werden,
wenn das Ziel-S3-System DNS-basierte Buckets unterstützt.
DNS-ähnliche Bucket+Hostname:Port-Vorlage für den Zugriff auf einen Bucket [%(bucket)s.s3.amazonaws.com]: leofs

Das Passwort für die Verschlüsselung wird verwendet, um Ihre Dateien während der Übertragung an S3 vor dem Lesen durch Unbefugte zu schützen.
Verschlüsselungspasswort: 
Pfad zum GPG-Programm [\/usr\/bin\/gpg]: 

Wenn das sichere HTTPS-Protokoll verwendet wird, sind alle Kommunikationen mit den Amazon S3-Servern vor Lauschangriffen Dritter geschützt. Diese Methode ist
langsame als reines HTTP und kann nur mit Python 2.7 oder neuer proxyseitig verwendet werden.
HTTPS-Protokoll verwenden [Nein]: 

In einigen Netzwerken muss der gesamte Internetzugang über einen HTTP-Proxy erfolgen.
Versuchen Sie, hier Einstellungen vorzunehmen, wenn Sie keine direkte Verbindung zu S3 herstellen können.
Name des HTTP-Proxyservers [172.26.9.180]: 
HTTP-Proxyserver-Port [8080]: 

Neue Einstellungen:
  Access Key: 9c2615f32e81e6a1caf5
  Secret Key: 8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb
  Standardregion: US
  S3-Endpunkt: s3.amazonaws.com
  DNS-ähnliche Bucket+Hostname:Port-Vorlage für den Zugriff auf einen Bucket: leofs
  Verschlüsselungspasswort: 
  Pfad zum GPG-Programm: \/usr\/bin\/gpg
  HTTPS-Protokoll verwenden: Falsch
  Name des HTTP-Proxyservers: 172.26.9.180
  HTTP-Proxyserver-Port: 8080

Zugriff mit den angegebenen Anmeldedaten testen? [Y\/n] Y
Bitte warten, es wird versucht, alle Buckets aufzulisten...
Erfolg. Ihr Access Key und Secret Key haben gut funktioniert :-)

Jetzt wird geprüft, ob die Verschlüsselung funktioniert...
Nicht konfiguriert. Macht nichts.

Einstellungen speichern? [y\/N] y
Konfiguration in '\/home\/user\/.s3cfg' gespeichert

Wenn Sie den Fehler ERROR: S3-Fehler: 403 (AccessDenied): Zugriff verweigert: erhalten,

s3cmd put test.py s3:\/\/leofs\/\nupload: 'test.py' -> 's3:\/\/leofs\/test.py'  [1 von 1]
 382 von 382   100% in    0s     3.40 kB\/s  erledigt
ERROR: S3-Fehler: 403 (AccessDenied): Zugriff verweigert

muss im s3cmd-Config die signature_v2 auf True gesetzt werden. Einzelheiten finden Sie darin issue.

Wenn signature_v2 auf False steht, wird der folgende Fehler angezeigt:

WARNUNG: Fehlgeschlagene Anfrage wird erneut versucht: \/?delimiter= (getaddrinfo() Argument 2 muss ein Integer oder String sein)
WARNUNG: Warte 3 Sek...
WARNUNG: Fehlgeschlagene Anfrage wird erneut versucht: \/?delimiter= (getaddrinfo() Argument 2 muss ein Integer oder String sein)
WARNUNG: Warte 6 Sek...
FEHLER: Test fehlgeschlagen: Anfrage fehlgeschlagen für: \/?delimiter=

Upload-Test

Eine 1GB-Datei erstellen

fallocate -l 1GB 1gb

Laden Sie sie in Leofs hoch

time s3cmd put 1gb s3:\/\/leofs\/\nreal    0m19.099s
user    0m7.855s
sys 0m1.620s

Statistik

leofs-adm du für 1 Knoten:

leofs-adm du S0@172.26.9.179
 aktive Anzahl von Objekten: 156
  gesamtzahl von Objekten: 156
   aktive Größe der Objekte: 602954495
    gesamte Größe der Objekte: 602954495
     Verhältnis der aktiven Größe: 100.0%
    letzter Komprimierungsstart: ____-__-__ __:__:__
      letzte Komprimierungsende: ____-__-__ __:__:__

Wir sehen, dass die Ausgabe nicht sehr informativ ist.

Schauen wir uns an, wo sich diese Datei befindet.
leofs-adm whereis leofs\/1gb

leofs-adm wo ist leofs/1gb
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
 del?  |         node         |             ring-Adresse             |    Größe    |   Prüfziffer   |  hat Kinder  |  gesamt Chunks  |     Uhrzeit      |             wann            
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
       | S0@172.26.9.181      | 657a9f3a3db822a7f1f5050925b26270     |    976563K |   a4634eea55 | wahr           |             64 | 598f2aa976a4f  | 2019-12-05 10:48:15 +0000
       | S0@172.26.9.182      | 657a9f3a3db822a7f1f5050925b26270     |    976563K |   a4634eea55 | wahr           |             64 | 598f2aa976a4f  | 2019-12-05 10:48:15 +0000

Aktivieren von NFS

Aktivieren von NFS auf dem Server Leo Gateway 172.26.9.184.

Auf dem Server und Client installieren wir nfs-utils

sudo yum install nfs-utils

Gemäß der Anleitung passen wir die Konfigurationsdatei an /usr/local/leofs/current/leo_gateway/etc/leo_gateway.conf

protocol = nfs

Auf dem Server 172.26.9.184 starten wir rpcbind und leofs-gateway

sudo service rpcbind start
sudo service leofs-gateway restart

Auf dem Server, wo der leo_manager läuft, erstellen wir einen Bucket für NFS und generieren einen Schlüssel für die Verbindung zu NFS

leofs-adm add-bucket test 05236
leofs-adm gen-nfs-mnt-key test 05236 ip-Adresse-nfs-client

Verbindung zu NFS

sudo mkdir /mnt/leofs
## für Linux - "sudo mount -t nfs -o nolock :// "
sudo mount -t nfs -o nolock ip-Adresse-nfs-server-wo-sie-gateway-haben://access_key_id/ /mnt/leofs
sudo mount -t nfs -o nolock 172.26.9.184:/test/05236/bb5034f0c740148a346ed663ca0cf5157efb439f /mnt/leofs

Überprüfung des Speicherplatzes über den NFS-Client

Speicherplatz unter Berücksichtigung, dass jeder Storage-Node eine 40GB-Festplatte hat (3 Nodes aktiv, 1 Node angehängt):

df -hP
Dateisystem                                                         Größe  Used Verfügbar Nutzung% Einghängt auf
172.26.9.184:/test/05236/e7298032e78749149dd83a1e366afb328811c95b   60G  3.6G   57G   6% /mnt/leofs

Installation von LeoFS mit 6 Storage-Nodes.

Inventar (ohne Builder):

# Please check roles/common/vars/leofs_releases for available versions
[all:vars]
leofs_version=1.4.3
build_temp_path="/tmp/leofs_builder"
build_install_path="/tmp/"
build_branch="master"
source="package"

# nodename of leo_manager_0 and leo_manager_1 are set at group_vars/all
[leo_manager_0]
172.26.9.177

# nodename of leo_manager_0 and leo_manager_1 are set at group_vars/all
[leo_manager_1]
172.26.9.176

[leo_storage]
172.26.9.178 leofs_module_nodename=S0@172.26.9.178
172.26.9.179 leofs_module_nodename=S0@172.26.9.179
172.26.9.181 leofs_module_nodename=S0@172.26.9.181
172.26.9.182 leofs_module_nodename=S0@172.26.9.182
172.26.9.183 leofs_module_nodename=S0@172.26.9.183
172.26.9.185 leofs_module_nodename=S0@172.26.9.185

[leo_gateway]
172.26.9.180 leofs_module_nodename=G0@172.26.9.180
172.26.9.184 leofs_module_nodename=G0@172.26.9.184

[leofs_nodes:children]
leo_manager_0
leo_manager_1
leo_gateway
leo_storage

Ausgabe von leofs-adm status

Ausgabe von leofs-adm status

 [System Confiuration]
-----------------------------------+----------
 Item                              | Wert     
-----------------------------------+----------
 Basis-/Konsistenzlevel
-----------------------------------+----------
                    Systemversion | 1.4.3
                        Cluster ID | leofs_1
                             DC ID | dc_1
                    Gesamt-Replikate | 2
          Anzahl der Erfolge von R | 1
          Anzahl der Erfolge von W | 1
          Anzahl der Erfolge von D | 1
 Anzahl der rackbewussten Replikate | 0
                         Ringgröße | 2^128
-----------------------------------+----------
 Multi-DC-Replikationseinstellungen
-----------------------------------+----------
 [mdcr] Maximale Anzahl von beitretbaren DCs | 2
 [mdcr] Gesamt-Replikate pro DC    | 1
 [mdcr] Anzahl der Erfolge von R   | 1
 [mdcr] Anzahl der Erfolge von W   | 1
 [mdcr] Anzahl der Erfolge von D   | 1
-----------------------------------+----------
 Manager RING-Hash
-----------------------------------+----------
                 Aktueller Ring-Hash | d8ff465e
                Vorheriger Ring-Hash | d8ff465e
-----------------------------------+----------

 [Zustand der Node(s)]
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
 Typ  |         Node         |    Zustand   | Rack-ID |  Aktueller Ring  |   Vorheriger Ring    |          Aktualisiert am         
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
  S    | S0@172.26.9.178      | läuft        |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  S    | S0@172.26.9.179      | läuft        |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  S    | S0@172.26.9.181      | läuft        |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:30 +0000
  S    | S0@172.26.9.182      | läuft        |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  S    | S0@172.26.9.183      | läuft        |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  S    | S0@172.26.9.185      | läuft        |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  G    | G0@172.26.9.180      | läuft        |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:31 +0000
  G    | G0@172.26.9.184      | läuft        |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:31 +0000
-------+----------------------+--------------+---------+----------------+----------------+----------------------------

Festplattenspeicher unter der Annahme, dass jede Storage-Node eine 40GB Festplatte hat (6 Nodes laufen):

df -hP
Dateisystem                                                         Größe  Benutzt Verfügbar Nutzung% Eingehängt auf
172.26.9.184:/test/05236/e7298032e78749149dd83a1e366afb328811c95b  120G  3.6G  117G   3% /mnt/leofs

Wenn 5 Nodes für den Storage verwendet werden

[leo_storage]
172.26.9.178 leofs_module_nodename=S0@172.26.9.178
172.26.9.179 leofs_module_nodename=S1@172.26.9.179
172.26.9.181 leofs_module_nodename=S2@172.26.9.181
172.26.9.182 leofs_module_nodename=S3@172.26.9.182
172.26.9.183 leofs_module_nodename=S4@172.26.9.183

df -hP
172.26.9.184:/test/05236/e7298032e78749149dd83a1e366afb328811c95b  100G  3.0G   97G   3% /mnt/leofs

Logs

Logs befinden sich in Verzeichnissen /usr/local/leofs/current/*/log

Telegram-Kanal: SDS und Cluster-FS

Quelle: habr.com

60GB SSD 8Gb DDR4