Installation d'un stockage d'objets distribué résilient LeoFS, compatible avec les clients utilisant S3 et NFS

Selon Opennet: LeoFS — stockage d'objets distribué et tolérant aux pannes LeoFS, compatible avec les clients utilisant l'API Amazon S3 et REST-API, ainsi que supportant le mode de fonctionnement en tant que serveur NFS. Des optimisations sont présentes pour le stockage à la fois d'objets petits et très grands, avec un mécanisme de mise en cache intégré, et la possibilité de répliquer les stockages entre les centres de données. Parmi les objectifs du projet, on note l'atteinte d'une fiabilité de 99,9999999 % grâce à la réplication redondante des duplicatas et à l'élimination d'un point de défaillance unique. Le code du projet est écrit en Erlang.

LeoFS se compose de trois composants :

  • LeoFS Storage — gère les opérations d'ajout, d'extraction et de suppression d'objets et de métadonnées, responsable de l'exécution de la réplication, de la restauration et de la formation de la file d'attente des demandes des clients.
  • LeoFS Gateway — assure la gestion des requêtes HTTP et redirige les réponses aux clients en utilisant REST-API ou S3-API, et garantit la mise en cache des données les plus demandées en mémoire et sur disque.
  • LeoFS Manager — surveille le fonctionnement des nœuds LeoFS Gateway et LeoFS Storage, garde un œil sur l'état des nœuds et vérifie les sommes de contrôle. Il garantit l'intégrité des données et la haute disponibilité du stockage.

Dans cet article, nous allons installer LeoFS à l'aide d'un playbook Ansible, tester S3, NFS.

Si vous essayez d'installer LeoFS en utilisant les playbooks officiels, vous rencontrerez diverses erreurs : 1,2. Dans cet article, je vais expliquer ce qu'il faut faire pour éviter ces erreurs.

Là où vous exécuterez le playbook Ansible, vous devez installer netcat.

Exemple d'inventaire

Exemple d'inventaire (dans le dépôt 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

Préparation des serveurs

Désactivation de SELinux. J'espère que la communauté créera des politiques SELinux pour LeoFS.

    - name: Installer libselinux comme prérequis pour le module Ansible SELinux
      yum:
        name: "{{item}}"
        state: latest
      with_items:
        - libselinux-python
        - libsemanage-python

    - name: Désactiver SELinux au prochain redémarrage
      selinux:
        state: disabled

    - name: Mettre SELinux en mode permissif jusqu'au redémarrage de la machine
      command: setenforce 0
      ignore_errors: true
      changed_when: false

Installation netcat et redhat-lsb-core. netcat nécessaire pour leofs-adm, redhat-lsb-core nécessaire pour déterminer la version de l'OS ici.

    - name: Installer des paquets
      yum: name={{ item }} state=present
      with_items:
        - nmap-ncat
        - redhat-lsb-core

Création de l'utilisateur leofs et ajout à la groupe wheel

    - name: Créer l'utilisateur leofs
      group:
        name: leofs
        state: present

    - name: Permettre au groupe 'wheel' d'avoir un sudo sans mot de passe
      lineinfile:
        dest: /etc/sudoers
        state: present
        regexp: '^%wheel'
        line: '%wheel ALL=(ALL) NOPASSWD: ALL'
        validate: 'visudo -cf %s'

    - name: Ajouter l'utilisateur 'leofs' au groupe 'wheel'
      user:
        name: leofs
        groups: wheel
        append: yes

Installation d'Erlang

    - name : Remote erlang-20.3.8.23-1.el7.x86_64.rpm installer avec 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

Vous pouvez trouver la version complète du playbook ansible corrigée ici : https://github.com/patsevanton/leofs_ansible

Installation, configuration, démarrage

Ensuite, exécutons comme indiqué dans https://github.com/leo-project/leofs_ansible sans 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

Vérifions le statut du cluster sur Primary LeoManager

leofs-adm status

Primary et Secondary peuvent être vus dans les logs ansible-playbook

Installation d'un stockage d'objets distribué résilient LeoFS, compatible avec les clients utilisant S3 et NFS

Installation d'un stockage d'objets distribué résilient LeoFS, compatible avec les clients utilisant S3 et NFS

La sortie sera à peu près comme ceci

 [Configuration Système]
-----------------------------------+----------
 Éléments                          | Valeur   
-----------------------------------+----------
 Niveau de base/consistance        
-----------------------------------+----------
                    version du système | 1.4.3
                        ID du cluster | leofs_1
                             ID DC   | dc_1
                    Répliques totales | 2
          nombre de succès de R     | 1
          nombre de succès de W     | 1
          nombre de succès de D     | 1
 nombre de répliques en conscience de rack | 0
                         taille de l'anneau | 2^128
-----------------------------------+----------
 Paramètres de réplication Multi DC
-----------------------------------+----------
 [mdcr] nombre max de DC joignables | 2
 [mdcr] répliques totales par DC     | 1
 [mdcr] nombre de succès de R         | 1
 [mdcr] nombre de succès de W         | 1
 [mdcr] nombre de succès de D         | 1
-----------------------------------+----------
 Hash de MANAGER RING
-----------------------------------+----------
                 hash actuel de l'anneau | a0314afb
                hash précédent de l'anneau | a0314afb
-----------------------------------+----------

 [État des Nœuds]
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
 type  |         nœud        |    état      | ID rack |  anneau actuel  |   ancien anneau |          mis à jour à         
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
  S    | S0@172.26.9.179      | en cours     |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.181      | en cours     |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.182      | en cours     |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.183      | attaché     |         |                |                | 2019-12-05 10:33:58 +0000
  G    | G0@172.26.9.180      | en cours     |         | a0314afb       | a0314afb       | 2019-12-05 10:33:49 +0000
  G    | G0@172.26.9.184      | en cours     |         | a0314afb       | a0314afb       | 2019-12-05 10:33:49 +0000
-------+----------------------+--------------+---------+----------------+----------------+----------------------------

Créons un utilisateur

Créons l'utilisateur leofs :

leofs-adm create-user leofs leofs

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

Liste des utilisateurs :

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

Créons un Bucket

Bucket créé

leofs-adm add-bucket leofs 9c2615f32e81e6a1caf5
OK

Liste des buckets :

 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

Configuration de s3cmd

Dans le champ Nom du serveur proxy HTTP indiquez l'IP du serveur Gateway

s3cmd --configure 

Entrez de nouvelles valeurs ou acceptez les valeurs par défaut entre crochets en appuyant sur Entrée.
Consultez le manuel de l'utilisateur pour une description détaillée de toutes les options.

La clé d'accès et la clé secrète sont vos identifiants pour Amazon S3. Laissez-les vides pour utiliser les variables d'environnement.
Clé d'accès [9c2615f32e81e6a1caf5]: 
Clé secrète [8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb]: 
Région par défaut [US]: 

Utilisez "s3.amazonaws.com" pour le point de terminaison S3 et ne le modifiez pas pour le S3 d'Amazon cible.
Point de terminaison S3 [s3.amazonaws.com]: 

Utilisez "%(bucket)s.s3.amazonaws.com" pour le S3 d'Amazon cible. Les variables "%(bucket)s" et "%(location)s" peuvent être utilisées
si le système S3 cible prend en charge les buckets basés sur DNS.
Modèle de bucket+nom d'hôte:port de type DNS pour accéder à un bucket [%(bucket)s.s3.amazonaws.com]: leofs

Le mot de passe de chiffrement est utilisé pour protéger vos fichiers de la lecture
par des personnes non autorisées lors de leur transfert vers S3.
Mot de passe de chiffrement: 
Chemin vers le programme GPG [\/usr\/bin\/gpg]: 

Lors de l'utilisation du protocole HTTPS sécurisé, toutes les communications avec les serveurs Amazon S3
sont protégées contre l'interception par des tiers. Cette méthode est
plus lente que le HTTP simple et ne peut être proxifiée qu'avec Python 2.7 ou supérieur.
Utiliser le protocole HTTPS [Non]: 

Sur certains réseaux, tout accès à Internet doit passer par un proxy HTTP.
Essayez de le définir ici si vous ne pouvez pas vous connecter directement à S3.
Nom du serveur proxy HTTP [172.26.9.180]: 
Port du serveur proxy HTTP [8080]: 

Nouvelles configurations:
  Clé d'accès: 9c2615f32e81e6a1caf5
  Clé secrète: 8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb
  Région par défaut: US
  Point de terminaison S3: s3.amazonaws.com
  Modèle de bucket+nom d'hôte:port de type DNS pour accéder à un bucket: leofs
  Mot de passe de chiffrement: 
  Chemin vers le programme GPG: /usr/bin/gpg
  Utiliser le protocole HTTPS: Faux
  Nom du serveur proxy HTTP: 172.26.9.180
  Port du serveur proxy HTTP: 8080

Tester l'accès avec les identifiants fournis? [Y/n] Y
Veuillez patienter, tentative de lister tous les buckets...
Succès. Votre clé d'accès et votre clé secrète ont bien fonctionné :-)

Vérification du bon fonctionnement du chiffrement...
Non configuré. Ne vous inquiétez pas.

Sauvegarder les paramètres? [y/N] y
Configuration enregistrée dans '\/home\/user\/.s3cfg'

Si une erreur ERROR: S3 error: 403 (AccessDenied): Access Denied: se produit

s3cmd put test.py s3:\/\/leofs\/\nupload: 'test.py' -> 's3:\/\/leofs\/test.py'  [1 sur 1]
 382 sur 382   100% en    0s     3.40 kB\/s  terminé
ERROR: S3 error: 403 (AccessDenied): Access Denied

vous devez corriger signature_v2 sur True dans le fichier de configuration s3cmd. Détails dans ce issue.

Si signature_v2 est False, alors vous obtiendrez une erreur comme celle-ci :

WARNING: Réessai de la demande échouée : \/?delimiter= (getaddrinfo() argument 2 doit être un entier ou une chaîne)
WARNING: Attente de 3 sec...
WARNING: Réessai de la demande échouée : \/?delimiter= (getaddrinfo() argument 2 doit être un entier ou une chaîne)
WARNING: Attente de 6 sec...
ERROR: Test échoué : la demande a échoué pour : \/?delimiter=

Test de téléchargement

Créons un fichier de 1 Go

fallocate -l 1GO 1gb

Nous le téléchargeons dans Leofs

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

Statistiques

leofs-adm du pour 1 nœud :

leofs-adm du S0@172.26.9.179
 nombre d'objets actifs : 156
  nombre total d'objets : 156
   taille active des objets : 602954495
    taille totale des objets : 602954495
     ratio de taille active : 100.0%
    dernier démarrage de la compression : ____-__-__ __:__:__
      dernière fin de compression : ____-__-__ __:__:__

Nous constatons que la sortie n'est pas très informative.

Voyons où se trouve ce fichier.
leofs-adm whereis leofs\/1gb

leofs-adm où est leofs/1go
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
 del?  |         nœud         |             adresse du ring             |    taille    |   somme de contrôle   |  a des enfants  |  total des morceaux  |     horloge      |             quand            
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
       | S0@172.26.9.181      | 657a9f3a3db822a7f1f5050925b26270     |    976563K |   a4634eea55 | vrai           |             64 | 598f2aa976a4f  | 2019-12-05 10:48:15 +0000
       | S0@172.26.9.182      | 657a9f3a3db822a7f1f5050925b26270     |    976563K |   a4634eea55 | vrai           |             64 | 598f2aa976a4f  | 2019-12-05 10:48:15 +0000

Activation de NFS

Activation de NFS sur le serveur Leo Gateway 172.26.9.184.

Nous allons installer nfs-utils sur le serveur et le client

sudo yum install nfs-utils

Selon l'instruction, nous allons corriger le fichier de configuration /usr/local/leofs/current/leo_gateway/etc/leo_gateway.conf

protocol = nfs

Sur le serveur 172.26.9.184, nous allons démarrer rpcbind et leofs-gateway

sudo service rpcbind start
sudo service leofs-gateway restart

Sur le serveur où le leo_manager est en cours d'exécution, nous allons créer un bucket pour NFS et générer une clé pour se connecter à NFS

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

Connexion à NFS

sudo mkdir /mnt/leofs
## pour Linux - "sudo mount -t nfs -o nolock <host>:/<bucket>/<token> <dir>"
sudo mount -t nfs -o nolock adresse-ip-nfs-serveur-où-vous-avez-installé-gateway:/bucket/access_key_id/clé-obtenue-de-gen-nfs-mnt-key /mnt/leofs
sudo mount -t nfs -o nolock 172.26.9.184:/test/05236/bb5034f0c740148a346ed663ca0cf5157efb439f /mnt/leofs

Visualisation de l'espace disque via le client NFS

Espace disque en tenant compte que chaque nœud de stockage a un disque de 40 Go (3 nœuds en exécution, 1 nœud attaché) :

df -hP
Système de fichiers                                                         Taille  Utilisé Dispo Util% Monté sur
172.26.9.184:/test/05236/e7298032e78749149dd83a1e366afb328811c95b   60G  3.6G   57G   6% /mnt/leofs

Installation de LeoFS avec 6 nœuds de stockage.

Inventaire (sans 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

Sortie leofs-adm status

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

Espace disque disponible, étant donné que chaque nœud de stockage a un disque de 40 Go (6 nœuds en cours d'exécution):

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

Si 5 nœuds de stockage sont utilisés

[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

Journaux

Les journaux se trouvent dans les répertoires /usr/local/leofs/current/*/log

Canal Telegram: SDS et systèmes de fichiers en cluster

Source : habr.com

Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS 🔥 Acheter un hébergement fiable pour les sites avec protection DDoS, serveurs VPS VDS | ProHoster