Instalarea unui stocare obiecte distribuită, rezistentă la defecte, LeoFS, compatibilă cu clienții care utilizează S3, NFS

Conform Opennet: LeoFS — stoc de obiecte distribuit și redundant la nivel de fault LeoFS, compatibil cu clienții care utilizează API Amazon S3 și REST-API, precum și cu suport pentru funcționarea în rol de server NFS. Există optimizări pentru stocarea atât a obiectelor mici, cât și a celor foarte mari, fiind prezent un mecanism încorporat de caching, și este posibilă replicarea stocărilor între centrele de date. Printre obiectivele proiectului se numără atingerea unei fiabilități de 99.9999999% prin replicarea redundantă a duplicatelor și eliminarea punctelor unice de eșec. Codul proiectului este scris în limbajul Erlang.

LeoFS este compus din trei componente:

  • LeoFS Storage — gestionează operațiile de adăugare, extragere și ștergere a obiectelor și metadatelor, responsabil cu executarea replicării, recuperării și formării cozii de cereri ale clienților.
  • LeoFS Gateway — gestionează cererile HTTP și redirecționează răspunsurile către clienți folosind REST-API sau S3-API, asigură caching-ul celor mai solicitate date în memorie și pe disc.
  • LeoFS Manager — monitorizează activitatea nodurilor LeoFS Gateway și LeoFS Storage, urmărește starea nodurilor și verifică sumarele de control. Garanție pentru integritatea datelor și disponibilitatea ridicată a stocării.

În această postare, vom instala LeoFS cu ajutorul ansible-playbook, vom testa S3, NFS.

Dacă încerci să instalezi LeoFS folosind playbook-urile oficiale, te așteaptă diferite erori: 1,2. În această postare voi scrie ce trebuie să faci pentru a evita aceste erori.

Acolo unde vei rula ansible-playbook, trebuie să instalezi netcat.

Exemplu de inventory

Exemplu de inventory (în 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

Pregătirea serverelor

Dezactivarea Selinux. Sper că comunitatea va crea politici Selinux pentru LeoFS.

    - name: Instalează libselinux ca prerequisit pentru modulul Ansible SELinux
      yum:
        name: "{{item}}"
        state: latest
      with_items:
        - libselinux-python
        - libsemanage-python

    - name: Dezactivează SELinux la următoarea repornire
      selinux:
        state: disabled

    - name: Setează SELinux în modul permisiv până la repornirea mașinii
      command: setenforce 0
      ignore_errors: true
      changed_when: false

Instalare netcat și redhat-lsb-core. netcat necesar pentru leofs-adm, redhat-lsb-core necesar pentru determinarea versiunii OS aici.

    - name: Instalează Pachete
      yum: name={{ item }} state=present
      with_items:
        - nmap-ncat
        - redhat-lsb-core

Crearea utilizatorului leofs și adăugarea acestuia în grupul wheel

    - name: Creează utilizator leofs
      group:
        name: leofs
        state: present

    - name: Permite grupului 'wheel' să aibă sudo fără parolă
      lineinfile:
        dest: /etc/sudoers
        state: present
        regexp: '^%wheel'
        line: '%wheel ALL=(ALL) NOPASSWD: ALL'
        validate: 'visudo -cf %s'

    - name: Adaugă utilizatorul 'leofs' în grupul 'wheel'
      user:
        name: leofs
        groups: wheel
        append: yes

Instalarea Erlang

    - name: Instalare erlang-20.3.8.23-1.el7.x86_64.rpm de la distanță cu 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

Versiunea completă a ansible playbook-ului corectat poate fi găsită aici: https://github.com/patsevanton/leofs_ansible

Instalare, configurare, pornire

Acum executăm conform celor scrise în https://github.com/leo-project/leofs_ansible fără 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

Verificăm starea clusterei pe LeoManager Principal

leofs-adm status

Principalul și secundarul pot fi văzute în jurnalele ansible-playbook

Instalarea unui stocare obiecte distribuită, rezistentă la defecte, LeoFS, compatibilă cu clienții care utilizează S3, NFS

Instalarea unui stocare obiecte distribuită, rezistentă la defecte, LeoFS, compatibilă cu clienții care utilizează S3, NFS

Iesirea va fi aproximativ astfel

 [Configuratia Sistemului]
-----------------------------------+----------
 Item                              | Valoare    
-----------------------------------+----------
 Nivel de bază/consistență
-----------------------------------+----------
                    versiunea sistemului | 1.4.3
                        ID cluster | leofs_1
                             ID DC | dc_1
                    Replici totale | 2
          numărul de succesuri R | 1
          numărul de succesuri W | 1
          numărul de succesuri D | 1
 numărul de replici conștiente de rack | 0
                         dimensiune inel | 2^128
-----------------------------------+----------
 Setări de replicare Multi DC
-----------------------------------+----------
 [mdcr] numărul maxim de DC-uri conectabile | 2
 [mdcr] replici totale per DC    | 1
 [mdcr] numărul de succesuri R   | 1
 [mdcr] numărul de succesuri W   | 1
 [mdcr] numărul de succesuri D   | 1
-----------------------------------+----------
 Manager RING hash
-----------------------------------+----------
                 hash-ul actual al inelului | a0314afb
                hash-ul anterior al inelului | a0314afb
-----------------------------------+----------

 [Starea Node-urilor]
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
 tip  |         nod         |    stare     | rack id |  inel actual  |   inel anterior    |          actualizat la         
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
  S    | S0@172.26.9.179      | funcționează      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.181      | funcționează      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.182      | funcționează      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.183      | atașat     |         |                |                | 2019-12-05 10:33:58 +0000
  G    | G0@172.26.9.180      | funcționează      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:49 +0000
  G    | G0@172.26.9.184      | funcționează      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:49 +0000
-------+----------------------+--------------+---------+----------------+----------------+----------------------------

Creăm utilizator

Creăm utilizatorul leofs:

leofs-adm create-user leofs leofs

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

Lista utilizatorilor:

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

Creăm Bucket

Am creat bucket

leofs-adm add-bucket leofs 9c2615f32e81e6a1caf5
OK

Lista bucket-urilor:

 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

Configurarea s3cmd

În câmpul Numele serverului proxy HTTP specificăm IP-ul serverului Gateway

s3cmd --configure 

Introduceți noile valori sau acceptați valorile implicite din paranteze cu Enter.
Consultați manualul utilizatorului pentru o descriere detaliată a tuturor opțiunilor.

Cheia de acces și cheia secretă sunt identificatorii dvs. pentru Amazon S3. Lăsați-le goale pentru a utiliza variabilele de mediu.
Cheia de acces [9c2615f32e81e6a1caf5]: 
Cheia secretă [8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb]: 
Regiunea implicită [US]: 

Utilizați "s3.amazonaws.com" pentru Endpoint S3 și nu o modificați pentru Amazon S3 țintă.
Endpoint S3 [s3.amazonaws.com]: 

Utilizați "% (bucket)s.s3.amazonaws.com" pentru ținta Amazon S3. Variabilele "% (bucket)s" și "% (location)s" pot fi utilizate dacă sistemul S3 țintă acceptă bucket-uri bazate pe DNS.
Șablon bucket+hostname:port bazat pe DNS pentru accesarea unui bucket [%(bucket)s.s3.amazonaws.com]: leofs

Parola de criptare este utilizată pentru a vă proteja fișierele de citirea de către persoane neautorizate în timp ce sunt transferate către S3.
Parola de criptare: 
Calea către programul GPG [\/usr\/bin\/gpg]: 

Atunci când utilizați protocolul HTTPS securizat, toate comunicațiile cu serverele Amazon S3 sunt protejate de interceptarea terților. Această metodă este mai lentă decât HTTP-ul simplu și poate fi proxy doar cu Python 2.7 sau mai nou.
Utilizați protocolul HTTPS [Nu]: 

Pe unele rețele, tot accesul la internet trebuie să treacă printr-un server proxy HTTP.
Încercați să-l setați aici dacă nu puteți conecta direct la S3.
Numele serverului proxy HTTP [172.26.9.180]: 
Portul serverului proxy HTTP [8080]: 

Noile setări:
  Cheia de acces: 9c2615f32e81e6a1caf5
  Cheia secretă: 8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb
  Regiunea implicită: US
  Endpoint S3: s3.amazonaws.com
  Șablon bucket+hostname:port bazat pe DNS pentru accesarea unui bucket: leofs
  Parola de criptare: 
  Calea către programul GPG: \/usr\/bin\/gpg
  Utilizați protocolul HTTPS: False
  Numele serverului proxy HTTP: 172.26.9.180
  Portul serverului proxy HTTP: 8080

Testați accesul cu acreditivele furnizate? [Y\/n] Y
Vă rugăm să așteptați, încercând să listăm toate bucket-urile...
Succes. Cheia dvs. de acces și cheia secretă au funcționat bine :-)

Acum verificăm dacă criptarea funcționează...
Nu este configurat. Nu-i nimic.

Salvați setările? [y\/N] y
Configurarea a fost salvată în '\/home\/user\/.s3cfg'

Dacă apare o eroare ERROR: S3 error: 403 (AccessDenied): Acces refuzat:

s3cmd put test.py s3:\/\/leofs\/\nupload: 'test.py' -> 's3:\/\/leofs\/test.py'  [1 din 1]
 382 din 382   100% în    0s     3.40 kB\/s  finalizat
ERROR: S3 error: 403 (AccessDenied): Acces refuzat

Atunci trebuie să corectăm signature_v2 în configurația s3cmd la True. Detalii în acest issue.

Dacă signature_v2 va fi False, atunci va apărea următoarea eroare:

AVERTISMENT: Se reîncercă cererea nereușită: \/?delimiter= (argumentul 2 al getaddrinfo() trebuie să fie un întreg sau un șir)
AVERTISMENT: Aștept 3 sec...
AVERTISMENT: Se reîncercă cererea nereușită: \/?delimiter= (argumentul 2 al getaddrinfo() trebuie să fie un întreg sau un șir)
AVERTISMENT: Aștept 6 sec...
EROARE: Test eșuat: Cererea a eșuat pentru: \/?delimiter=

Testarea încărcării

Creăm un fișier de 1GB

fallocate -l 1GB 1gb

Îl încărcăm în Leofs

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

Statistică

leofs-adm du pentru 1 nod:

leofs-adm du S0@172.26.9.179
 numărul activ de obiecte: 156
 numărul total de obiecte: 156
 dimensiunea activă a obiectelor: 602954495
 dimensiunea totală a obiectelor: 602954495
 raportul dimensiunii active: 100.0%
 ultima compacție începută: ____-__-__ __:__:__
 ultima compacție finalizată: ____-__-__ __:__:__

Se vede că output-ul nu este foarte informativ.

Să vedem unde este situat acest fișier.
leofs-adm whereis leofs/1gb

leofs-adm whereis leofs/1gb
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
 del?  |         nod          |             adresă ring             |    dimensiune    |   checksum   |  are copii  |  total chunk-uri  |     clock      |             când            
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
       | S0@172.26.9.181      | 657a9f3a3db822a7f1f5050925b26270     |    976563K |   a4634eea55 | adevărat      |             64 | 598f2aa976a4f  | 2019-12-05 10:48:15 +0000
       | S0@172.26.9.182      | 657a9f3a3db822a7f1f5050925b26270     |    976563K |   a4634eea55 | adevărat      |             64 | 598f2aa976a4f  | 2019-12-05 10:48:15 +0000

Activăm NFS

Activăm NFS pe serverul Leo Gateway 172.26.9.184.

Pe server și client instalăm nfs-utils

sudo yum install nfs-utils

Conform instrucțiunilor, vom modifica fișierul de configurare /usr/local/leofs/current/leo_gateway/etc/leo_gateway.conf

protocol = nfs

Pe serverul 172.26.9.184 vom porni rpcbind și leofs-gateway

sudo service rpcbind start
sudo service leofs-gateway restart

Pe serverul unde este pornit leo_manager vom crea un bucket pentru NFS și vom genera o cheie pentru conectarea la NFS

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

Conectare la NFS

sudo mkdir /mnt/leofs
## pentru Linux - "sudo mount -t nfs -o nolock <host>:/<bucket>/<token> <dir>" 
sudo mount -t nfs -o nolock ip-adresă-nfs-server-unde-aveți-gateway:~/bucket/access_key_id/cheia-obținută-din-gen-nfs-mnt-key /mnt/leofs
sudo mount -t nfs -o nolock 172.26.9.184:/test/05236/bb5034f0c740148a346ed663ca0cf5157efb439f /mnt/leofs

Vizualizarea spațiului pe disc prin intermediul clientului NFS

Spațiul pe disc având în vedere că fiecare nod de stocare are un disc de 40GB (3 noduri funcționale, 1 nod atașat):

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

Instalarea LeoFS cu 6 noduri de stocare.

Inventar (fără 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

Output leofs-adm status

Output leofs-adm status

 [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
-------+----------------------+--------------+---------+----------------+----------------+----------------------------

Spațiul pe disc având în vedere că fiecare nod de stocare are un disc de 40 GB (6 noduri funcționale):

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

Dacă sunt folosite 5 noduri de stocare

[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

Jurnale

Jurnalele se află în directoare /usr/local/leofs/current/*/log

Canal Telegram: SDS și Sisteme de Fișiere Clusterizate

Sursa: habr.com

Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS 🔥 Cumpără un hosting fiabil pentru site-uri cu protecție DDoS, servere VPS VDS | ProHoster