Installation eines verteilten ausfallsicheren LeoFS-Speichers, der mit Clients kompatibel ist, die S3, NFS verwenden

Ich komme von Luxoft.
Laut Opennet : LeoFS ist eine verteilte fehlertolerante Speichereinrichtung für LeoFS- Objekte, die mit Clients kompatibel ist, die die Amazon S3-API und die REST-API verwenden, und die auch den Betriebsmodus als NFS-Server unterstützt. Es gibt Optimierungen für das Speichern von kleinen und sehr großen Objekten, es gibt einen eingebauten Caching-Mechanismus, die Replikation von Speichern zwischen Rechenzentren ist möglich. Zu den Zielen des Projekts gehört die Erreichung einer Zuverlässigkeit von 99,9999999% aufgrund einer übermäßigen Replikation von Duplikaten und der Beseitigung einer einzelnen Fehlerstelle. Der Projektcode ist in Erlang geschrieben.


LeoFS besteht aus drei Komponenten:


  • LeoFS-Speicher - Ermöglicht das Hinzufügen, Abrufen und Löschen von Objekten und Metadaten und ist für das Replizieren, Wiederherstellen und Einreihen von Clientanforderungen verantwortlich.
  • LeoFS-Gateway - Über das REST-API oder das S3-API werden HTTP-Anforderungen verarbeitet und Antworten an Clients umgeleitet. Die am häufigsten angeforderten Daten werden im Arbeitsspeicher und auf der Festplatte zwischengespeichert.
  • LeoFS-Manager - Überwacht den Betrieb von LeoFS-Gateway- und LeoFS-Speicherknoten, überwacht den Status von Knoten und überprüft die Prüfsummen. Gewährleistet Datenintegrität und hohe Speicherverfügbarkeit.

Installieren Sie in diesem Beitrag Leofs mit ansible-playbook, testen Sie S3, NFS.


Wenn Sie versuchen, LeoFS mithilfe der offiziellen Playbooks zu installieren, warten verschiedene Fehler auf Sie: 1 , 2 . In diesem Beitrag schreibe ich, was zu tun ist, um diese Fehler zu vermeiden.


Wenn Sie ansible-playbook ausführen, müssen Sie netcat installieren.


Inventarbeispiel


Beispielinventar (im hosts.sample-Repository):
# 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 

Servervorbereitung


Selinux deaktivieren. Ich hoffe, die Community erstellt Selinux-Richtlinien für LeoFS.


  - name: Install libselinux as prerequisite for SELinux Ansible module yum: name: "{{item}}" state: latest with_items: - libselinux-python - libsemanage-python - name: Disable SELinux at next reboot selinux: state: disabled - name: Set SELinux in permissive mode until the machine is rebooted command: setenforce 0 ignore_errors: true changed_when: false 

Installieren Sie netcat und redhat-lsb-core . Für leofs-adm wird netcat benötigt, für die Ermittlung der Betriebssystemversion netcat leofs-adm redhat-lsb-core benötigt.


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

Erstellen eines Benutzer-Leofs und Hinzufügen zu der Radgruppe


  - 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 

Installieren Sie 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 

Die Vollversion des korrigierten Ansible-Playbooks finden Sie hier: https://github.com/patsevanton/leofs_ansible


Installation, Konfiguration, Start


Führen Sie als Nächstes die in https://github.com/leo-project/leofs_ansible beschriebenen Schritte ohne build_leofs.yml aus


 ## 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 des Clusterstatus in Primary LeoManager


 leofs-adm status 

Primary und Secondary sind in den Ansible-Playbook-Protokollen zu sehen




Der Abschluss wird ungefähr so ​​sein
  [System Confiuration] -----------------------------------+---------- Item | Value -----------------------------------+---------- Basic/Consistency level -----------------------------------+---------- system version | 1.4.3 cluster Id | leofs_1 DC Id | dc_1 Total replicas | 2 number of successes of R | 1 number of successes of W | 1 number of successes of D | 1 number of rack-awareness replicas | 0 ring size | 2^128 -----------------------------------+---------- Multi DC replication settings -----------------------------------+---------- [mdcr] max number of joinable DCs | 2 [mdcr] total replicas per a DC | 1 [mdcr] number of successes of R | 1 [mdcr] number of successes of W | 1 [mdcr] number of successes of D | 1 -----------------------------------+---------- Manager RING hash -----------------------------------+---------- current ring-hash | a0314afb previous ring-hash | a0314afb -----------------------------------+---------- [State of Node(s)] -------+----------------------+--------------+---------+----------------+----------------+---------------------------- type | node | state | rack id | current ring | prev ring | updated at -------+----------------------+--------------+---------+----------------+----------------+---------------------------- S | S0@172.26.9.179 | running | | a0314afb | a0314afb | 2019-12-05 10:33:47 +0000 S | S0@172.26.9.181 | running | | a0314afb | a0314afb | 2019-12-05 10:33:47 +0000 S | S0@172.26.9.182 | running | | a0314afb | a0314afb | 2019-12-05 10:33:47 +0000 S | S0@172.26.9.183 | attached | | | | 2019-12-05 10:33:58 +0000 G | G0@172.26.9.180 | running | | a0314afb | a0314afb | 2019-12-05 10:33:49 +0000 G | G0@172.26.9.184 | running | | a0314afb | a0314afb | 2019-12-05 10:33:49 +0000 -------+----------------------+--------------+---------+----------------+----------------+---------------------------- 

Erstellen Sie einen Benutzer


Erstellen Sie Benutzerleofs:


 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 | created_at ------------+---------+------------------------+--------------------------- _test_leofs | 9 | 05236 | 2019-12-02 06:56:49 +0000 leofs | 1 | 9c2615f32e81e6a1caf5 | 2019-12-02 10:43:29 +0000 

Erstellen Sie einen Bucket


Habe einen Eimer gemacht


 leofs-adm add-bucket leofs 9c2615f32e81e6a1caf5 OK 

Bucket-Liste:


  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


HTTP Proxy server name Feld HTTP Proxy server name die Gateway-Server-IP an


 s3cmd --configure Enter new values or accept defaults in brackets with Enter. Refer to user manual for detailed description of all options. Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables. Access Key [9c2615f32e81e6a1caf5]: Secret Key [8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb]: Default Region [US]: Use "s3.amazonaws.com" for S3 Endpoint and not modify it to the target Amazon S3. S3 Endpoint [s3.amazonaws.com]: Use "%(bucket)s.s3.amazonaws.com" to the target Amazon S3. "%(bucket)s" and "%(location)s" vars can be used if the target S3 system supports dns based buckets. DNS-style bucket+hostname:port template for accessing a bucket [%(bucket)s.s3.amazonaws.com]: leofs Encryption password is used to protect your files from reading by unauthorized persons while in transfer to S3 Encryption password: Path to GPG program [/usr/bin/gpg]: When using secure HTTPS protocol all communication with Amazon S3 servers is protected from 3rd party eavesdropping. This method is slower than plain HTTP, and can only be proxied with Python 2.7 or newer Use HTTPS protocol [No]: On some networks all internet access must go through a HTTP proxy. Try setting it here if you can't connect to S3 directly HTTP Proxy server name [172.26.9.180]: HTTP Proxy server port [8080]: New settings: Access Key: 9c2615f32e81e6a1caf5 Secret Key: 8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb Default Region: US S3 Endpoint: s3.amazonaws.com DNS-style bucket+hostname:port template for accessing a bucket: leofs Encryption password: Path to GPG program: /usr/bin/gpg Use HTTPS protocol: False HTTP Proxy server name: 172.26.9.180 HTTP Proxy server port: 8080 Test access with supplied credentials? [Y/n] Y Please wait, attempting to list all buckets... Success. Your access key and secret key worked fine :-) Now verifying that encryption works... Not configured. Never mind. Save settings? [y/N] y Configuration saved to '/home/user/.s3cfg' 

Wenn Sie eine Fehlermeldung erhalten FEHLER: S3 Fehler: 403 (AccessDenied): Zugriff verweigert:


 s3cmd put test.py s3://leofs/ upload: 'test.py' -> 's3://leofs/test.py' [1 of 1] 382 of 382 100% in 0s 3.40 kB/s done ERROR: S3 error: 403 (AccessDenied): Access Denied 

Dann musst du signature_v2 in True s3cmd config korrigieren. Details in dieser Ausgabe .


Wenn signature_v2 False ist, tritt ein solcher Fehler auf:


 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 

Booten testen


Erstellen Sie eine 1 GB-Datei


 fallocate -l 1GB 1gb 

Laden Sie es zu Leofs hoch


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

Statistiken


leofs-adm du für 1 Knoten:


 leofs-adm du S0@172.26.9.179 active number of objects: 156 total number of objects: 156 active size of objects: 602954495 total size of objects: 602954495 ratio of active size: 100.0% last compaction start: ____-__-__ __:__:__ last compaction end: ____-__-__ __:__:__ 

Wir sehen, dass die Schlussfolgerung nicht sehr informativ ist.


Mal 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 Sie NFS


Wir aktivieren NFS auf dem Leo Gateway 172.26.9.184-Server.


Installieren Sie auf dem Server und dem Client nfs-utils


 sudo yum install nfs-utils 

Entsprechend den Anweisungen werden wir die Konfigurationsdatei /usr/local/leofs/current/leo_gateway/etc/leo_gateway.conf


 protocol = nfs 

Führen Sie auf dem Server 172.26.9.184 rpcbind und leofs-gateway aus


 sudo service rpcbind start sudo service leofs-gateway restart 

Erstellen Sie auf dem Server, auf dem leo_manager ausgeführt wird, einen Bucket für NFS und generieren Sie einen Schlüssel für die Verbindung mit NFS


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

Stellen Sie eine Verbindung zu NFS her


 sudo mkdir /mnt/leofs ## for Linux - "sudo mount -t nfs -o nolock <host>:/<bucket>/<token> <dir>" sudo mount -t nfs -o nolock ip--nfs-------gateway:/bucket/access_key_id/---gen-nfs-mnt-key /mnt/leofs sudo mount -t nfs -o nolock 172.26.9.184:/test/05236/bb5034f0c740148a346ed663ca0cf5157efb439f /mnt/leofs 

Anzeigen des Speicherplatzes über einen NFS-Client


Festplattenspeicher, wenn man bedenkt, dass jeder Speicherknoten über eine 40-GB-Festplatte verfügt (3 laufende Knoten, 1 angeschlossener Knoten):


 df -hP Filesystem Size Used Avail Use% Mounted on 172.26.9.184:/test/05236/e7298032e78749149dd83a1e366afb328811c95b 60G 3.6G 57G 6% /mnt/leofs 

Installieren Sie LeoFS mit 6 Speicherknoten.


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 

Leofs-adm Statusausgabe


Leofs-adm Statusausgabe
  [System Confiuration] -----------------------------------+---------- Item | Value -----------------------------------+---------- Basic/Consistency level -----------------------------------+---------- system version | 1.4.3 cluster Id | leofs_1 DC Id | dc_1 Total replicas | 2 number of successes of R | 1 number of successes of W | 1 number of successes of D | 1 number of rack-awareness replicas | 0 ring size | 2^128 -----------------------------------+---------- Multi DC replication settings -----------------------------------+---------- [mdcr] max number of joinable DCs | 2 [mdcr] total replicas per a DC | 1 [mdcr] number of successes of R | 1 [mdcr] number of successes of W | 1 [mdcr] number of successes of D | 1 -----------------------------------+---------- Manager RING hash -----------------------------------+---------- current ring-hash | d8ff465e previous ring-hash | d8ff465e -----------------------------------+---------- [State of Node(s)] -------+----------------------+--------------+---------+----------------+----------------+---------------------------- type | node | state | rack id | current ring | prev ring | updated at -------+----------------------+--------------+---------+----------------+----------------+---------------------------- S | S0@172.26.9.178 | running | | d8ff465e | d8ff465e | 2019-12-06 05:18:29 +0000 S | S0@172.26.9.179 | running | | d8ff465e | d8ff465e | 2019-12-06 05:18:29 +0000 S | S0@172.26.9.181 | running | | d8ff465e | d8ff465e | 2019-12-06 05:18:30 +0000 S | S0@172.26.9.182 | running | | d8ff465e | d8ff465e | 2019-12-06 05:18:29 +0000 S | S0@172.26.9.183 | running | | d8ff465e | d8ff465e | 2019-12-06 05:18:29 +0000 S | S0@172.26.9.185 | running | | d8ff465e | d8ff465e | 2019-12-06 05:18:29 +0000 G | G0@172.26.9.180 | running | | d8ff465e | d8ff465e | 2019-12-06 05:18:31 +0000 G | G0@172.26.9.184 | running | | d8ff465e | d8ff465e | 2019-12-06 05:18:31 +0000 -------+----------------------+--------------+---------+----------------+----------------+---------------------------- 

Festplattenspeicher, wobei zu berücksichtigen ist, dass jeder Speicherknoten eine Festplatte mit 40 GB hat (6 ausgeführte Knoten):


 df -hP Filesystem Size Used Avail Use% Mounted on 172.26.9.184:/test/05236/e7298032e78749149dd83a1e366afb328811c95b 120G 3.6G 117G 3% /mnt/leofs 

Wenn 5 Speicherknoten 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


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


Wenn Sie Leofs manuell installieren / konfigurieren, können die folgenden Fehler auftreten.


[FEHLER] Mnesia ist nicht verfügbar

Starten Sie den Systemdienst Start Leofs-Manager-Master


 leofs-adm status [ERROR] Mnesia is not available 

System muss gestartet werden. Leofs-manager-slave muss auf leo_manager_1 gestartet werden


Leofs-Speicher startet nicht.

Es ist erforderlich, dass der Status von leofs-manager-master und leofs-manager-slave und leofs-adm aktiv ist, um den Status anzuzeigen.


Angehängte Knoten weniger als die Anzahl der Replikate

Wenn Sie leofs-adm start starten, erhalten Sie folgende Fehlermeldung:


 leofs-adm start [ERROR] Attached nodes less than # of replicas 

Nicht genügend Speicherknoten. Der Status leofs-adm zeigt Ihnen weniger als 2 Speicherknoten an. Erforderliche Mindestanzahl von Speicherknoten 2.


leofs-adm status wird angehängt, der rest läuft.

Die Knoten müssen neu ausbalanciert werden


 leofs-adm rebalance 

Nach dem Start von leofs-gateway sehen Sie den Gateway-Knoten nicht im Status leofs-adm

Muss leofs-adm starten


 leofs-adm start 

Verbindung zu LeoFS Manager auf dem Slave-Knoten konnte nicht hergestellt werden

(Standardmäßig funktioniert leofs-adm nicht auf dem Slave-Knoten!) ( Https://leo-project.net/leofs/docs/issues/documentation-issues/ )


Belastungstest


Das Testen erfolgt auf 2 Knoten mit der Konfiguration:


 CPU: Single Core Intel Core (Broadwell) (-MCP-) speed: 2295 MHz Kernel: 3.10.0-862.3.2.el7.x86_64 x86_64 Up: 1h 08m Mem: 1023.8/1999.6 MiB (51.2%) Storage: 10.00 GiB (43.5% used) Procs: 98 Shell: bash 4.2.46 inxi: 3.0.37 

Nehmen Sie zum Testen eine kleine Diskette
Auf beiden Knoten sehen wir eine 9.4G- und 5.9G-Festplatte mit freiem Speicherplatz.


 df -hP Filesystem Size Used Avail Use% Mounted on /dev/vda1 9.4G 5.9G 3.1G 66% / 

Telegrammkanal: SDS und Cluster FS

Source: https://habr.com/ru/post/de478990/


All Articles