Installazione di uno storage distribuito e fault-tolerant LeoFS, compatibile con i client che utilizzano S3, NFS

Secondo Opennet: LeoFS — sistema di archiviazione oggetti distribuito e altamente disponibile LeoFS, compatibile con i client che utilizzano API di Amazon S3 e REST-API, e supporta anche il funzionamento in modalità server NFS. Sono presenti ottimizzazioni per l'archiviazione sia di piccoli che di grandi oggetti, con un meccanismo di caching integrato e la possibilità di replicare gli archivi tra i data center. Tra gli obiettivi del progetto si segnala il raggiungimento di un'affidabilità del 99.9999999% attraverso la replicazione ridondante delle copie e l'eliminazione dei punti unici di guasto. Il codice del progetto è scritto in linguaggio Erlang.

LeoFS è composto da tre componenti:

  • LeoFS Storage — gestisce le operazioni di aggiunta, estrazione e rimozione di oggetti e metadati, ed è responsabile dell'esecuzione della replicazione, del ripristino e della gestione della coda delle richieste dei clienti.
  • LeoFS Gateway — gestisce le richieste HTTP e reindirizza le risposte ai clienti utilizzando REST-API o S3-API, garantendo la memorizzazione nella cache dei dati più richiesti sia in memoria che su disco.
  • LeoFS Manager — monitora il funzionamento dei nodi LeoFS Gateway e LeoFS Storage, effettua il monitoraggio dello stato dei nodi e verifica le somme di controllo. Garantisce l'integrità dei dati e l'elevata disponibilità dello storage.

In questo post installeremo LeoFS usando ansible-playbook, testeremo S3 e NFS.

Se provi a installare LeoFS utilizzando i playbook ufficiali, ti aspettano vari errori: 1,2. In questo post scriverò cosa fare per evitare questi errori.

Dove eseguirai l'ansible-playbook, è necessario installare netcat.

Esempio di inventory

Esempio di inventory (nel 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

Preparazione dei server

Disabilitazione di Selinux. Spero che la comunità crei delle politiche Selinux per LeoFS.

    - name: Installa libselinux come prerequisito per il modulo Ansible di SELinux
      yum:
        name: "{{item}}"
        state: latest
      with_items:
        - libselinux-python
        - libsemanage-python

    - name: Disabilita SELinux al prossimo riavvio
      selinux:
        state: disabled

    - name: Imposta SELinux in modalità permissiva fino al riavvio della macchina
      command: setenforce 0
      ignore_errors: true
      changed_when: false

Installazione netcat e redhat-lsb-core. netcat necessario per leofs-adm, redhat-lsb-core necessario per determinare la versione del sistema operativo qui.

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

Creazione dell'utente leofs e aggiunta al gruppo wheel

    - name: Crea utente leofs
      group:
        name: leofs
        state: present

    - name: Consenti al gruppo 'wheel' di avere sudo senza password
      lineinfile:
        dest: /etc/sudoers
        state: present
        regexp: '^%wheel'
        line: '%wheel ALL=(ALL) NOPASSWD: ALL'
        validate: 'visudo -cf %s'

    - name: Aggiungi l'utente 'leofs' al gruppo 'wheel'
      user:
        name: leofs
        groups: wheel
        append: yes

Installazione di Erlang

    - name: Installa erlang-20.3.8.23-1.el7.x86_64.rpm da remoto con 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

La versione completa corretta dell'ansible playbook può essere trovata qui: https://github.com/patsevanton/leofs_ansible

Installazione, configurazione, avvio

Procediamo come indicato in https://github.com/leo-project/leofs_ansible senza 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

Verifichiamo lo stato del cluster su Primary LeoManager

leofs-adm status

Primary e Secondary possono essere visti nei log di ansible-playbook

Installazione di uno storage distribuito e fault-tolerant LeoFS, compatibile con i client che utilizzano S3, NFS

Installazione di uno storage distribuito e fault-tolerant LeoFS, compatibile con i client che utilizzano S3, NFS

L'output sarà all'incirca così

 [Configurazione di sistema]
-----------------------------------+----------
 Item                              | Valore    
-----------------------------------+----------
 Livello di base/coerenza
-----------------------------------+----------
                    versione sistema | 1.4.3
                        Id cluster | leofs_1
                             Id DC | dc_1
                    Replica totali | 2
          numero di successi di R | 1
          numero di successi di W | 1
          numero di successi di D | 1
 numero di repliche a consapevolezza rack | 0
                         dimensione anello | 2^128
-----------------------------------+----------
 Impostazioni di replicazione Multi DC
-----------------------------------+----------
 [mdcr] numero massimo di DC unibili | 2
 [mdcr] repliche totali per DC     | 1
 [mdcr] numero di successi di R    | 1
 [mdcr] numero di successi di W    | 1
 [mdcr] numero di successi di D    | 1
-----------------------------------+----------
 Hash del gestore RING
-----------------------------------+----------
                 hash anello corrente | a0314afb
                hash anello precedente | a0314afb
-----------------------------------+----------

 [Stato di Nodo(i)]
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
 tipo  |         nodo         |    stato     | rack id |  anello corrente  |   anello prev    |          aggiornato il         
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
  S    | S0@172.26.9.179      | in esecuzione      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.181      | in esecuzione      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.182      | in esecuzione      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.183      | allegato      |         |                |                | 2019-12-05 10:33:58 +0000
  G    | G0@172.26.9.180      | in esecuzione      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:49 +0000
  G    | G0@172.26.9.184      | in esecuzione      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:49 +0000
-------+----------------------+--------------+---------+----------------+----------------+----------------------------

Creiamo un utente

Creiamo un utente leofs:

leofs-adm create-user leofs leofs

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

Elenco degli utenti:

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

Creiamo un Bucket

Bucket creato

leofs-adm add-bucket leofs 9c2615f32e81e6a1caf5
OK

Elenco dei bucket:

 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

Configurazione s3cmd

Nel campo Nome del server proxy HTTP indichiamo l'IP del server Gateway

s3cmd --configure 

Inserisci nuovi valori o accetta i valori predefiniti tra parentesi premendo Invio.
Consulta il manuale utente per una descrizione dettagliata di tutte le opzioni.

La chiave d'accesso e la chiave segreta sono i tuoi identificatori per Amazon S3. Lasciale vuote per utilizzare le variabili ambientali.
Chiave d'accesso [9c2615f32e81e6a1caf5]: 
Chiave segreta [8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb]: 
Regione predefinita [US]: 

Utilizza "s3.amazonaws.com" come S3 Endpoint e non modificarlo per il target Amazon S3.
S3 Endpoint [s3.amazonaws.com]: 

Utilizza "%(bucket)s.s3.amazonaws.com" per il target Amazon S3. Le variabili "%(bucket)s" e "%(location)s" possono essere utilizzate
se il sistema S3 di destinazione supporta i bucket basati su DNS.
Template per accedere a un bucket in stile DNS: [%(bucket)s.s3.amazonaws.com]: leofs

La password di crittografia è utilizzata per proteggere i tuoi file dalla lettura
da parte di persone non autorizzate durante il trasferimento a S3.
Password di crittografia: 
Percorso del programma GPG [/usr/bin/gpg]: 

Quando si utilizza il protocollo HTTPS sicuro, tutta la comunicazione con i server Amazon S3
è protetta da intercettazioni di terzi. Questo metodo è
più lento rispetto all'HTTP semplice e può essere inoltrato solo con Python 2.7 o versioni più recenti.
Utilizzare il protocollo HTTPS [No]: 

Su alcune reti, tutto l'accesso a Internet deve passare attraverso un proxy HTTP.
Prova a impostarlo qui se non riesci a connetterti direttamente a S3.
Nome del server proxy HTTP [172.26.9.180]: 
Porta del server proxy HTTP [8080]: 

Nuove impostazioni:
  Chiave d'accesso: 9c2615f32e81e6a1caf5
  Chiave segreta: 8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb
  Regione predefinita: US
  S3 Endpoint: s3.amazonaws.com
  Template per accedere a un bucket in stile DNS: leofs
  Password di crittografia: 
  Percorso del programma GPG: /usr/bin/gpg
  Utilizzare il protocollo HTTPS: False
  Nome del server proxy HTTP: 172.26.9.180
  Porta del server proxy HTTP: 8080

Testare l'accesso con le credenziali fornite? [Y/n] Y
Attendere, tentativo di elencare tutti i bucket...
Successo. La tua chiave d'accesso e la chiave segreta hanno funzionato correttamente :-)

Ora si verifica che la crittografia funzioni...
Non configurato. Non fa niente.

Salvare le impostazioni? [y/N] y
Configurazione salvata in '/home/user/.s3cfg'

Se ricevi un errore ERROR: S3 error: 403 (AccessDenied): Accesso negato:

s3cmd put test.py s3://leofs/
upload: 'test.py' -> 's3://leofs/test.py'  [1 di 1]
 382 di 382   100% in    0s     3.40 kB/s  completato
ERROR: S3 error: 403 (AccessDenied): Accesso negato

Dovrai modificare signature_v2 su True nel file di configurazione s3cmd. Ulteriori dettagli in questo issue.

Se signature_v2 è False, si verificherà questo errore:

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

Test di caricamento

Creiamo un file di 1GB

fallocate -l 1GB 1gb

Carichiamo su Leofs

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

Statistiche

leofs-adm du per 1 nodo:

leofs-adm du S0@172.26.9.179
 numero attivo di oggetti: 156
 numero totale di oggetti: 156
 dimensione attiva degli oggetti: 602954495
 dimensione totale degli oggetti: 602954495
 rapporto dimensione attiva: 100.0%
 ultimo inizio compattazione: ____-__-__ __:__:__
 ultimo fine compattazione: ____-__-__ __:__:__

Possiamo vedere che l'output non è molto informativo.

Vediamo dove si trova questo file.
leofs-adm whereis leofs/1gb

leofs-adm dove è leofs/1gb
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
 del?  |         nodo         |             indirizzo del ring             |    dimensione    |   checksum   |  ha figli  |  totale chunk  |     orologio      |             quando            
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
       | S0@172.26.9.181      | 657a9f3a3db822a7f1f5050925b26270     |    976563K |   a4634eea55 | vero           |             64 | 598f2aa976a4f  | 2019-12-05 10:48:15 +0000
       | S0@172.26.9.182      | 657a9f3a3db822a7f1f5050925b26270     |    976563K |   a4634eea55 | vero           |             64 | 598f2aa976a4f  | 2019-12-05 10:48:15 +0000

Attiviamo NFS

Attiviamo NFS sul server Leo Gateway 172.26.9.184.

Installeremo nfs-utils sul server e sul client

sudo yum install nfs-utils

Modificheremo il file di configurazione secondo le istruzioni /usr/local/leofs/current/leo_gateway/etc/leo_gateway.conf

protocol = nfs

Sul server 172.26.9.184 avvieremo rpcbind e leofs-gateway

sudo service rpcbind start
sudo service leofs-gateway restart

Sul server dove è in esecuzione leo_manager creeremo un bucket per NFS e genereremo una chiave per la connessione a NFS

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

Connessione a NFS

sudo mkdir /mnt/leofs
## per Linux - "sudo mount -t nfs -o nolock :// "
sudo mount -t nfs -o nolock indirizzo-ip-nfs-del-server-dove-avete-installato-gateway:/bucket/access_key_id/chiave-ottenuta-da-gen-nfs-mnt-key /mnt/leofs
sudo mount -t nfs -o nolock 172.26.9.184:/test/05236/bb5034f0c740148a346ed663ca0cf5157efb439f /mnt/leofs

Visualizzazione dello spazio su disco tramite client NFS

Spazio su disco considerando che ogni nodo di storage ha un disco da 40 GB (3 nodi in esecuzione, 1 nodo collegato):

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

Installazione di LeoFS con 6 nodi di storage.

Inventario (senza 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    
-----------------------------------+----------
 Livello base/coerenza
-----------------------------------+----------
                    versione sistema | 1.4.3
                        Id cluster | leofs_1
                             Id DC | dc_1
                    Repliche totali | 2
          numero di successi di R | 1
          numero di successi di W | 1
          numero di successi di D | 1
 numero di repliche consapevoli del rack | 0
                         dimensione anello | 2^128
-----------------------------------+----------
 Impostazioni di replicazione Multi DC
-----------------------------------+----------
 [mdcr] numero massimo di DC unibili | 2
 [mdcr] repliche totali per DC       | 1
 [mdcr] numero di successi di R      | 1
 [mdcr] numero di successi di W      | 1
 [mdcr] numero di successi di D      | 1
-----------------------------------+----------
 Hash RING gestore
-----------------------------------+----------
                 hash anello attuale | d8ff465e
                hash anello precedente | d8ff465e
-----------------------------------+----------

 [Stato del Nodo(i)]
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
 tipo  |         nodo         |    stato     | id rack |  anello attuale |   anello prev   |          aggiornato il         
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
  S    | S0@172.26.9.178      | in esecuzione |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  S    | S0@172.26.9.179      | in esecuzione |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  S    | S0@172.26.9.181      | in esecuzione |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:30 +0000
  S    | S0@172.26.9.182      | in esecuzione |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  S    | S0@172.26.9.183      | in esecuzione |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  S    | S0@172.26.9.185      | in esecuzione |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  G    | G0@172.26.9.180      | in esecuzione |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:31 +0000
  G    | G0@172.26.9.184      | in esecuzione |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:31 +0000
-------+----------------------+--------------+---------+----------------+----------------+----------------------------

Spazio disco tenendo conto che ogni nodo storage ha un disco da 40GB (6 nodi in esecuzione):

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

Se vengono utilizzati 5 nodi storage

[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

Log

I log si trovano nelle directory /usr/local/leofs/current/*/log

Canale Telegram: SDS e File System Clusterizzati

Fonte: habr.com

Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server 🔥 Acquista hosting affidabile per siti web con protezione DDoS, VPS VDS server | ProHoster