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: Erneuter Versuch der fehlgeschlagenen Anforderung: \/?delimiter= (getaddrinfo() Argument 2 muss ganzzahl oder string sein)
WARNUNG: Warte 3 Sek...
WARNUNG: Erneuter Versuch der fehlgeschlagenen Anforderung: \/?delimiter= (getaddrinfo() Argument 2 muss ganzzahl oder string sein)
WARNUNG: Warte 6 Sek...
FEHLER: Test fehlgeschlagen: Anforderung 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

ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server đŸ”„ ZuverlĂ€ssiges Hosting fĂŒr Websites mit DDoS-Schutz kaufen, VPS VDS Server - ProHoster