Instalación de un almacenamiento de objetos distribuido y tolerante a fallos LeoFS, compatible con clientes que utilizan S3, NFS

Según Opennet: LeoFS — almacenamiento de objetos distribuido y tolerante a fallos LeoFS, compatible con clientes que utilizan la API de Amazon S3 y REST-API, además de soportar el modo operativo como servidor NFS. Hay optimizaciones para almacenar tanto objetos pequeños como muy grandes, cuenta con un mecanismo de caché incorporado, y es posible la replicación de almacenamiento entre centros de datos. Entre los objetivos del proyecto se destaca alcanzar una fiabilidad del 99.9999999% mediante la replicación redundante de duplicados y la eliminación de un único punto de fallo. El código del proyecto está escrito en Erlang.

LeoFS consta de tres componentes:

  • LeoFS Storage — maneja las operaciones de adición, extracción y eliminación de objetos y metadatos, es responsable de ejecutar la replicación, recuperación y formar la cola de solicitudes de clientes.
  • LeoFS Gateway — maneja las solicitudes HTTP y redirige las respuestas a los clientes utilizando REST-API o S3-API, garantiza la caché de los datos más solicitados en memoria y en disco.
  • LeoFS Manager — monitorea el funcionamiento de los nodos LeoFS Gateway y LeoFS Storage, realiza seguimiento del estado de los nodos y verifica las sumas de verificación. Garantiza la integridad de los datos y una alta disponibilidad del almacenamiento.

En esta publicación, instalaremos LeoFS usando ansible-playbook, probaremos S3, NFS.

Si intentas instalar LeoFS utilizando los playbooks oficiales, te encontrarás con varios errores: 1,2. En esta publicación escribiré lo que necesitas hacer para evitar estos errores.

Donde vayas a ejecutar ansible-playbook, necesitas instalar netcat.

Ejemplo de inventario

Ejemplo de inventario (en el repositorio 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

Preparación de los servidores

Deshabilitar Selinux. Espero que la comunidad desarrolle políticas Selinux para LeoFS.

    - name: Instalar libselinux como requisito previo para el módulo Ansible de SELinux
      yum:
        name: "{{item}}"
        state: latest
      with_items:
        - libselinux-python
        - libsemanage-python

    - name: Deshabilitar SELinux en el próximo reinicio
      selinux:
        state: disabled

    - name: Configurar SELinux en modo permisivo hasta que la máquina se reinicie
      command: setenforce 0
      ignore_errors: true
      changed_when: false

Instalación netcat y redhat-lsb-core. netcat necesario para leofs-adm, redhat-lsb-core necesario para determinar la versión del SO aquí.

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

Creación del usuario leofs y su adición al grupo wheel

    - name: Crear usuario leofs
      group:
        name: leofs
        state: present

    - name: Permitir al grupo 'wheel' tener sudo sin contraseña
      lineinfile:
        dest: /etc/sudoers
        state: present
        regexp: '^%wheel'
        line: '%wheel ALL=(ALL) NOPASSWD: ALL'
        validate: 'visudo -cf %s'

    - name: Agregar al usuario 'leofs' al grupo 'wheel'
      user:
        name: leofs
        groups: wheel
        append: yes

Instalación de Erlang

    - name: Instalar remotamente erlang-20.3.8.23-1.el7.x86_64.rpm 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 versión completa del playbook de ansible corregido se puede encontrar aquí: https://github.com/patsevanton/leofs_ansible

Instalación, configuración, inicio

A continuación, procedemos como se indica en https://github.com/leo-project/leofs_ansible sin 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

Verificamos el estado del clúster en Primary LeoManager

leofs-adm status

Primary y Secondary se pueden ver en los registros de ansible-playbook

Instalación de un almacenamiento de objetos distribuido y tolerante a fallos LeoFS, compatible con clientes que utilizan S3, NFS

Instalación de un almacenamiento de objetos distribuido y tolerante a fallos LeoFS, compatible con clientes que utilizan S3, NFS

La salida será algo así

 [Configuración del Sistema]
-----------------------------------+----------
 Item                              | Value    
-----------------------------------+----------
 Nivel Básico/Consistencia
-----------------------------------+----------
                    version del sistema | 1.4.3
                        Id de clúster | leofs_1
                             Id de DC | dc_1
                    Réplicas totales | 2
          número de éxitos de R | 1
          número de éxitos de W | 1
          número de éxitos de D | 1
 número de réplicas con conciencia de rack | 0
                         tamaño del anillo | 2^128
-----------------------------------+----------
 Configuración de replicación Multi DC
-----------------------------------+----------
 [mdcr] número máximo de DCs unibles | 2
 [mdcr] réplicas totales por DC    | 1
 [mdcr] número de éxitos de R   | 1
 [mdcr] número de éxitos de W   | 1
 [mdcr] número de éxitos de D   | 1
-----------------------------------+----------
 Hash del anillo del Gerente
-----------------------------------+----------
                 hash actual del anillo | a0314afb
                hash anterior del anillo | a0314afb
-----------------------------------+----------

 [Estado de Nodo(s)]
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
 tipo  |         nodo         |    estado    | rack id |  anillo actual  |   anillo prev   |          actualizado en         
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
  S    | S0@172.26.9.179      | en ejecución  |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.181      | en ejecución  |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.182      | en ejecución  |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.183      | adjunto      |         |                |                | 2019-12-05 10:33:58 +0000
  G    | G0@172.26.9.180      | en ejecución  |         | a0314afb       | a0314afb       | 2019-12-05 10:33:49 +0000
  G    | G0@172.26.9.184      | en ejecución  |         | a0314afb       | a0314afb       | 2019-12-05 10:33:49 +0000
-------+----------------------+--------------+---------+----------------+----------------+----------------------------

Creamos el usuario

Creamos el usuario leofs:

leofs-adm create-user leofs leofs

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

Lista de usuarios:

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

Creando Bucket

He creado bucket

leofs-adm add-bucket leofs 9c2615f32e81e6a1caf5
OK

Lista de buckets:

 leofs-adm get-buckets
cluster id   | bucket   | owner  | permissions      | created at                
-------------+----------+--------+------------------+---------------------------
leofs_1      | leofs    | leofs  | Yo(control_total) | 2019-12-02 10:44:02 +0000

Configurando s3cmd

En el campo Nombre del servidor proxy HTTP especificamos la IP del servidor Gateway

s3cmd --configure 

Ingrese nuevos valores o acepte los predeterminados entre corchetes con Enter.
Consulte el manual del usuario para obtener una descripción detallada de todas las opciones.

La clave de acceso y la clave secreta son sus identificadores para Amazon S3. Déjelas vacías para utilizar las variables de entorno.
Clave de acceso [9c2615f32e81e6a1caf5]: 
Clave secreta [8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb]: 
Región predeterminada [US]: 

Utilice "s3.amazonaws.com" para el punto final de S3 y no lo modifique al S3 de destino.
Punto final de S3 [s3.amazonaws.com]: 

Utilice "%(bucket)s.s3.amazonaws.com" para el S3 de destino. Se pueden usar las variables "%(bucket)s" y "%(location)s"
sí el sistema S3 de destino soporta buckets basados en dns.
Plantilla de bucket+nombre de host:puerto estilo DNS para acceder a un bucket [%(bucket)s.s3.amazonaws.com]: leofs

La contraseña de cifrado se utiliza para proteger sus archivos de la lectura
por personas no autorizadas mientras se transfieren a S3.
Contraseña de cifrado: 
Ruta al programa GPG [\/usr\/bin\/gpg]: 

Al usar el protocolo HTTPS seguro, toda la comunicación con los servidores Amazon S3
está protegida contra la escuchas de terceros. Este método es
más lento que HTTP simple y solo se puede usar como proxy con Python 2.7 o superior.
Usar protocolo HTTPS [No]: 

En algunas redes, todo el acceso a internet debe pasar a través de un proxy HTTP.
Intente configurarlo aquí si no puede conectarse directamente a S3.
Nombre del servidor proxy HTTP [172.26.9.180]: 
Puerto del servidor proxy HTTP [8080]: 

Nuevas configuraciones:
  Clave de acceso: 9c2615f32e81e6a1caf5
  Clave secreta: 8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb
  Región predeterminada: US
  Punto final de S3: s3.amazonaws.com
  Plantilla de bucket+nombre de host:puerto estilo DNS para acceder a un bucket: leofs
  Contraseña de cifrado: 
  Ruta al programa GPG: \/usr\/bin\/gpg
  Usar protocolo HTTPS: Falso
  Nombre del servidor proxy HTTP: 172.26.9.180
  Puerto del servidor proxy HTTP: 8080

¿Probar acceso con las credenciales suministradas? [Y/n] Y
Por favor espere, intentando listar todos los buckets...
Éxito. Su clave de acceso y clave secreta funcionaron bien :-)

Ahora verificando que el cifrado funcione...
No configurado. No importa.

¿Guardar configuraciones? [y/N] y
Configuración guardada en '\/home\/user\/.s3cfg'

Si obtiene el error ERROR: S3 error: 403 (AccessDenied): Acceso denegado:

s3cmd put test.py s3:\/\/leofs\/\nupload: 'test.py' -> 's3:\/\/leofs\/test.py'  [1 de 1]
 382 de 382   100% en    0s     3.40 kB\/s  hecho
ERROR: S3 error: 403 (AccessDenied): Acceso denegado

Entonces, es necesario corregir signature_v2 en el archivo de configuración s3cmd a True. Más detalles en esto. problema.

Si signature_v2 está en False, se obtendrá el siguiente error:

ADVERTENCIA: Reintentando solicitud fallida: \/?delimiter= (getaddrinfo() argumento 2 debe ser entero o cadena)
ADVERTENCIA: Esperando 3 seg...
ADVERTENCIA: Reintentando solicitud fallida: \/?delimiter= (getaddrinfo() argumento 2 debe ser entero o cadena)
ADVERTENCIA: Esperando 6 seg...
ERROR: Prueba fallida: Solicitud fallida para: \/?delimiter=

Prueba de carga

Creando archivo de 1GB

fallocate -l 1GB 1gb

Subiéndolo a Leofs

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

Estadísticas

leofs-adm du para 1 nodo:

leofs-adm en S0@172.26.9.179
 número activo de objetos: 156
 número total de objetos: 156
 tamaño activo de objetos: 602954495
 tamaño total de objetos: 602954495
 proporción de tamaño activo: 100.0%
 inicio de la última compactación: ____-__-__ __:__:__
 fin de la última compactación: ____-__-__ __:__:__

Vemos que la salida no es muy informativa.

Veamos dónde está este archivo.
leofs-adm whereis leofs/1gb

leofs-adm whereis leofs/1gb
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
 del?  |         nodo        |             dirección del anillo             |    tamaño    |   checksum   |  tiene hijos  |  total de fragmentos  |     reloj      |             cuándo            
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
       | 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

Activamos NFS

Activamos NFS en el servidor Leo Gateway 172.26.9.184.

En el servidor y en el cliente instalaremos nfs-utils

sudo yum install nfs-utils

Segun las instrucciones, corregiremos el archivo de configuración /usr/local/leofs/current/leo_gateway/etc/leo_gateway.conf

protocol = nfs

En el servidor 172.26.9.184, iniciaremos rpcbind y leofs-gateway

sudo service rpcbind start
sudo service leofs-gateway restart

En el servidor donde está ejecutándose leo_manager, creamos un bucket para NFS y generamos una clave para conectarse a NFS

leofs-adm add-bucket test 05236
leofs-adm gen-nfs-mnt-key test 05236 dirección-ip-cliente-nfs

Conexión a NFS

sudo mkdir /mnt/leofs
## para Linux - "sudo mount -t nfs -o nolock <host>:/<bucket>/<token> <dir>"
sudo mount -t nfs -o nolock dirección-ip-servidor-nfs-donde-tienes-gateway:/bucket/access_key_id/clave-obtenida-de-gen-nfs-mnt-key /mnt/leofs
sudo mount -t nfs -o nolock 172.26.9.184:/test/05236/bb5034f0c740148a346ed663ca0cf5157efb439f /mnt/leofs

Visualización del espacio en disco a través del cliente NFS

Espacio en disco considerando que cada nodo de almacenamiento tiene un disco de 40GB (3 nodos en ejecución, 1 nodo adjunto):

df -hP
Sistema de archivos                                                         Tamaño  Usado Disponible Uso% Montado en
172.26.9.184:/test/05236/e7298032e78749149dd83a1e366afb328811c95b   60G  3.6G   57G   6% /mnt/leofs

Instalación de LeoFS con 6 nodos de almacenamiento.

Inventario (sin 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

Salida de leofs-adm status

Salida de 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
-------+----------------------+--------------+---------+----------------+----------------+----------------------------

Espacio en disco considerando que cada nodo de almacenamiento tiene un disco de 40 GB (6 nodos en ejecución):

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

Si se utilizan 5 nodos de almacenamiento

[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

Registros

Los registros se encuentran en los directorios /usr/local/leofs/current/*/log

Canal de Telegram: SDS y Sistemas de Archivos en Clúster

Fuente: habr.com

Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS 🔥 Compra un hosting fiable para sitios web con protección contra DDoS, servidores VPS VDS | ProHoster