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

Laut Opennet: LeoFS — verteilter, ausfallsicherer Objektspeicher LeoFS, der mit Amazon S3- und REST-API-Clients kompatibel ist und auch im NFS-Servermodus betrieben werden kann. Es gibt Optimierungen für die Speicherung sowohl kleiner als auch sehr großer Objekte, ein eingebauter Caching-Mechanismus ist vorhanden und die Replikation zwischen Rechenzentren ist möglich. Das Projektziel besteht darin, eine Zuverlässigkeit von 99,9999999 % durch redundante Duplikation und die Vermeidung von Einzelpunkten des Ausfalls zu erreichen. Der Code des Projekts wurde in Erlang geschrieben.

LeoFS besteht aus drei Komponenten:

  • LeoFS Storage — verwaltet die Operationen zum Hinzufügen, Abrufen und Löschen von Objekten und Metadaten, ist verantwortlich für die Durchführung von Replikation, Wiederherstellung und Verwaltung der Client-Anfragewarteschlange.
  • LeoFS Gateway — verwaltet HTTP-Anfragen und leitet Antworten an die Clients über REST-API oder S3-API weiter, sorgt für das Caching der am häufigsten angeforderten Daten im Speicher und auf der Festplatte.
  • LeoFS Manager — überwacht den Betrieb der LeoFS Gateway- und LeoFS Storage-Knoten, führt eine Statusüberwachung der Knoten durch und prüft die Prüfziffern. Garantiert die Integrität der Daten und eine hohe Verfügbarkeit des Speichers.

In diesem Beitrag installieren wir LeoFS mithilfe von ansible-playbook und testen S3, NFS.

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

Dort, wo Sie das Ansible-Playbook ausführen, muss netcat installiert werden.

Beispiel-Inventory

Beispiel-Inventory (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

Vorbereitung der Server

Deaktivierung von SELinux. Ich hoffe, dass die Community SELinux-Richtlinien 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 zur nächsten Neustart der Maschine
      command: setenforce 0
      ignore_errors: true
      changed_when: false

Installation von netcat und redhat-lsb-core. netcat wird benötigt für leofs-adm, redhat-lsb-core wird benötigt zur Bestimmung der OS-Version hier.

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

Erstellung des Benutzers leofs und Hinzufügen zur Gruppe wheel

    - name: Create user leofs
      group:
        name: leofs
        state: present

    - name: Allow 'wheel' group to have passwordless sudo
      lineinfile:
        dest: /etc/sudoers
        state: present
        regexp: '^%wheel'
        line: '%wheel ALL=(ALL) NOPASSWD: ALL'
        validate: 'visudo -cf %s'

    - name: Add the user 'leofs' to group 'wheel'
      user:
        name: leofs
        groups: wheel
        append: yes

Установка Erlang

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

Полную версию поправленых ansible playbook можно найти здесь: https://github.com/patsevanton/leofs_ansible

Установка, конфигурирование, запуск

Далее выполняем как написано в https://github.com/leo-project/leofs_ansible без 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

Проверяем статус кластера на Primary LeoManager

leofs-adm status

Primary и Secondary можно увидеть в логах ansible-playbook

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

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

Вывод будет примерно такой

 [System Confiuration]
-----------------------------------+----------
 Artikel                            | Wert     
-----------------------------------+----------
 Grund-/Konsistenzlevel
-----------------------------------+----------
                    Systemversion   | 1.4.3
                        Cluster-ID   | leofs_1
                             DC-ID    | dc_1
                    Gesamt-Raubkopien| 2
          Anzahl der Erfolge von R  | 1
          Anzahl der Erfolge von W  | 1
          Anzahl der Erfolge von D  | 1
 Anzahl der rack-aware Raubkopien   | 0
                         Ringgröße   | 2^128
-----------------------------------+----------
 Multi-DC-Replikationseinstellungen
-----------------------------------+----------
 [mdcr] Maximalanzahl der verbindbaren DCs | 2
 [mdcr] Gesamt-Raubkopien 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
-----------------------------------+----------

 [Status der Knoten]
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
 Typ   |         Knoten       |    Zustand   | Rack-ID |  Aktueller Ring |   Vorheriger Ring |          Aktualisiert am        
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
  S    | S0@172.26.9.179      | laufend      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.181      | laufend      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.182      | laufend      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.183      | verbunden    |         |                |                | 2019-12-05 10:33:58 +0000
  G    | G0@172.26.9.180      | laufend      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:49 +0000
  G    | G0@172.26.9.184      | laufend      |         | 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

Benutzerliste:

leofs-adm get-users
user_id     | role_id | access_key_id          | created_at                
------------+---------+------------------------+---------------------------
_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

Bucketliste:

 leofs-adm get-buckets
cluster id   | bucket   | owner  | permissions      | created at                
-------------+----------+--------+------------------+---------------------------
leofs_1      | leofs    | leofs  | Me(full_control) | 2019-12-02 10:44:02 +0000

s3cmd konfigurieren

Im Feld HTTP-Proxy-Servername IP-Adresse des Gateway-Servers angeben

s3cmd --configure 

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

Zugangs- und Geheimschlüssel sind Ihre Identifikatoren für Amazon S3. Lassen Sie sie leer, um die Umgebungsvariablen zu verwenden.
Zugangs-Schlüssel [9c2615f32e81e6a1caf5]: 
Geheimschlüssel [8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb]: 
Standardregion [US]: 

Verwenden Sie "s3.amazonaws.com" für den S3-Endpunkt und ändern Sie ihn nicht zum 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-Stil Bucket+Hostname:Port-Vorlage für den Zugriff auf einen Bucket [%(bucket)s.s3.amazonaws.com]: leofs

Das Verschlüsselungspasswort wird verwendet, um Ihre Dateien während der Übertragung zu S3 vor unbefugtem Zugriff zu schützen.
Verschlüsselungspasswort: 
Pfad zum GPG-Programm [/usr/bin/gpg]: 

Bei Verwendung des sicheren HTTPS-Protokolls ist die gesamte Kommunikation mit Amazon S3-Servern
vor Abhörmaßnahmen durch Dritte geschützt. Diese Methode ist
langsamer als das einfache HTTP und kann nur mit Python 2.7 oder neuer proxied werden.
HTTPS-Protokoll verwenden [Nein]: 

In einigen Netzwerken muss der gesamte Internetzugang über einen HTTP-Proxy erfolgen.
Versuchen Sie, ihn hier festzulegen, wenn Sie sich nicht direkt mit S3 verbinden können.
HTTP-Proxy-Server-Name [172.26.9.180]: 
HTTP-Proxy-Server-Port [8080]: 

Neue Einstellungen:
  Zugangs-Schlüssel: 9c2615f32e81e6a1caf5
  Geheimschlüssel: 8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb
  Standardregion: US
  S3-Endpunkt: s3.amazonaws.com
  DNS-Stil Bucket+Hostname:Port-Vorlage für den Zugriff auf einen Bucket: leofs
  Verschlüsselungspasswort: 
  Pfad zum GPG-Programm: /usr/bin/gpg
  HTTPS-Protokoll verwenden: Nein
  HTTP-Proxy-Server-Name: 172.26.9.180
  HTTP-Proxy-Server-Port: 8080

Zugang mit den bereitgestellten Anmeldeinformationen testen? [Y/n] Y
Bitte warten, versuche alle Buckets aufzulisten...
Erfolg. Ihr Zugangs-Schlüssel und Geheimschlüssel funktionieren einwandfrei :-)

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

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

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

s3cmd put test.py s3://leofs/
upload: 'test.py' -> 's3://leofs/test.py'  [1 von 1]
 382 von 382   100% in    0s     3,40 kB/s  abgeschlossen
ERROR: S3 error: 403 (AccessDenied): Zugriff verweigert

müssen Sie die Einstellung signature_v2 in der s3cmd-Konfiguration auf True ändern. Einzelheiten dazu finden Sie in diesem war das Problem.

Wenn signature_v2 auf False gesetzt ist, erscheint folgender Fehler:

WARNING: Retrying failed request: /?delimiter=%2F (getaddrinfo() argument 2 must be integer or string)
WARNING: Waiting 3 sec...
WARNING: Retrying failed request: /?delimiter=%2F (getaddrinfo() argument 2 must be integer or string)
WARNING: Waiting 6 sec...
ERROR: Test failed: Request failed for: /?delimiter=%2F

Hochladetest

Eine 1 GB Datei erstellen

fallocate -l 1GB 1gb

Wir laden sie in Leofs hoch

time s3cmd put 1gb s3://leofs/
real    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
 Gesamte Anzahl von Objekten: 156
   aktive Größe der Objekte: 602954495
    gesamte Größe der Objekte: 602954495
     Verhältnis der aktiven Größe: 100,0%
    letzte Kompaktierung gestartet: ____-__-__ __:__:__
      letzte Kompaktierung beendet: ____-__-__ __:__:__

Wir sehen, dass die Ausgabe nicht sehr informativ ist.

Lassen Sie uns sehen, wo sich diese Datei befindet.
leofs-adm whereis leofs/1gb

leofs-adm whereis leofs/1gb
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
 del?  |         node         |             ring address             |    size    |   checksum   |  has children  |  total chunks  |     clock      |             when            
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
       | S0@172.26.9.181      | 657a9f3a3db822a7f1f5050925b26270     |    976563K |   a4634eea55 | true           |             64 | 598f2aa976a4f  | 2019-12-05 10:48:15 +0000
       | S0@172.26.9.182      | 657a9f3a3db822a7f1f5050925b26270     |    976563K |   a4634eea55 | true           |             64 | 598f2aa976a4f  | 2019-12-05 10:48:15 +0000

Aktivieren von NFS

Wir aktivieren NFS auf dem Server Leo Gateway 172.26.9.184.

Auf dem Server und dem Client installieren wir nfs-utils

sudo yum install nfs-utils

Wir passen die Konfigurationsdatei gemäß den Anweisungen 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, auf dem 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-da-wo-sie-gateway-installiert-haben:bucket/access_key_id/schlüssel-von-gen-nfs-mnt-key /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 der Annahme, dass jeder Storage-Knoten eine Festplatte von 40 GB hat (3 Knoten aktiv, 1 Knoten angeschlossen):

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

Installation von LeoFS mit 6 Storage-Knoten.

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 leofs-adm status

Ausgabe leofs-adm status

 [Systemkonfiguration]
-----------------------------------+----------
 Element                           | Wert     
-----------------------------------+----------
 Basis/Konsistenzstufe
-----------------------------------+----------
                    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 rack-bewussten Replikate | 0
                         Ringgröße   | 2^128
-----------------------------------+----------
 Multi-DC-Replikationseinstellungen
-----------------------------------+----------
 [mdcr] maximale Anzahl an joinbaren DCs | 2
 [mdcr] Gesamtreplikate 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
-----------------------------------+----------

 [Status der Node(s)]
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
 Typ   |         Knoten      |    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
-------+----------------------+--------------+---------+----------------+----------------+----------------------------

Speicherplatz 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 im 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

Protokolle

Die Protokolle befinden sich in den Verzeichnissen /usr/local/leofs/current/*/log

Telegram-Kanal: SDS und Cluster-FS

Quelle: habr.com

Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen 🔥 Zuverlässiges Webhosting mit DDoS-Schutz, VPS- und VDS-Server kaufen | ProHoster