Laut : — verteilter, ausfallsicherer Objektspeicher , 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:
- — 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.
- — 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.
- — ü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: ,. 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_storageVorbereitung 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 .
- name: Pakete installieren
yum: name={{ item }} state=present
with_items:
- nmap-ncat
- redhat-lsb-coreErstellung 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 можно найти здесь:
Установка, конфигурирование, запуск
Далее выполняем как написано в без 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 statusPrimary и Secondary можно увидеть в логах ansible-playbook


Вывод будет примерно такой
[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: 8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39ebBenutzerliste:
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 +0000Bucket erstellen
Bucket erstellt
leofs-adm add-bucket leofs 9c2615f32e81e6a1caf5
OKBucketliste:
leofs-adm get-buckets
cluster id | bucket | owner | permissions | created at
-------------+----------+--------+------------------+---------------------------
leofs_1 | leofs | leofs | Me(full_control) | 2019-12-02 10:44:02 +0000s3cmd 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 verweigertmüssen Sie die Einstellung signature_v2 in der s3cmd-Konfiguration auf True ändern. Einzelheiten dazu finden Sie in diesem .
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=%2FHochladetest
Eine 1 GB Datei erstellen
fallocate -l 1GB 1gbWir laden sie in Leofs hoch
time s3cmd put 1gb s3://leofs/
real 0m19.099s
user 0m7.855s
sys 0m1.620sStatistik
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 +0000Aktivieren 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-utilsWir passen die Konfigurationsdatei gemäß den Anweisungen an /usr/local/leofs/current/leo_gateway/etc/leo_gateway.conf
protocol = nfsAuf dem Server 172.26.9.184 starten wir rpcbind und leofs-gateway
sudo service rpcbind start
sudo service leofs-gateway restartAuf 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-clientVerbindung 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/leofsInstallation 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_storageAusgabe 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/leofsWenn 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.183df -hP
172.26.9.184:/test/05236/e7298032e78749149dd83a1e366afb328811c95b 100G 3.0G 97G 3% /mnt/leofsProtokolle
Die Protokolle befinden sich in den Verzeichnissen /usr/local/leofs/current/*/log
Telegram-Kanal:
Quelle: habr.com
