Instalação de um armazenamento de objetos distribuído e tolerante a falhas LeoFS, compatível com clientes que utilizam S3 e NFS.

De acordo com Opennet: LeoFS — armazenamento de objetos distribuído e tolerante a falhas LeoFS, compatível com clientes que utilizam a API Amazon S3 e REST-API, além de suportar operação em modo NFS. Possui otimizações para armazenar tanto pequenos quanto muito grandes objetos, conta com um mecanismo de cache embutido e permite replicação de armazenamento entre data centers. Entre os objetivos do projeto, destaca-se alcançar uma confiabilidade de 99.9999999% por meio de replicação redundante de duplicatas e eliminação de ponto de falha único. O código do projeto é escrito na linguagem Erlang.

LeoFS é composto por três componentes:

  • LeoFS Storage — gerencia operações de adição, extração e exclusão de objetos e metadados, é responsável pela execução de replicação, recuperação e formação de fila de solicitações dos clientes.
  • LeoFS Gateway — gerencia solicitações HTTP e redireciona respostas aos clientes utilizando REST-API ou S3-API, garante o cache dos dados mais requisitados na memória e no disco.
  • LeoFS Manager — monitora o funcionamento dos nós LeoFS Gateway e LeoFS Storage, realiza a supervisão do estado dos nós e verifica as somas de verificação. Garante a integridade dos dados e alta disponibilidade do armazenamento.

Neste post, vamos instalar o LeoFS usando ansible-playbook e testar S3 e NFS.

Se você tentar instalar o LeoFS usando os playbooks oficiais, encontrará vários erros: 1,2. Neste post, vou descrever como evitar esses erros.

Onde você for executar o ansible-playbook, é necessário instalar o netcat.

Exemplo de inventory

Exemplo de inventory (no repositório 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

Preparação dos servidores

Desativação do Selinux. Espero que a comunidade crie políticas Selinux para LeoFS.

    - name: Instalar libselinux como pré-requisito para o módulo Ansible SELinux
      yum:
        name: "{{item}}"
        state: latest
      with_items:
        - libselinux-python
        - libsemanage-python

    - name: Desativar SELinux na próxima reinicialização
      selinux:
        state: disabled

    - name: Definir SELinux no modo permissivo até que a máquina seja reinicializada
      command: setenforce 0
      ignore_errors: true
      changed_when: false

Instalação netcat e redhat-lsb-core. netcat necessário para leofs-adm, redhat-lsb-core necessário para determinar a versão do SO aqui.

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

Criação do usuário leofs e adição ao grupo wheel

    - name: Criar usuário leofs
      group:
        name: leofs
        state: present

    - name: Permitir que o grupo 'wheel' tenha sudo sem senha
      lineinfile:
        dest: "/etc/sudoers"
        state: present
        regexp: '^%wheel'
        line: '%wheel ALL=(ALL) NOPASSWD: ALL'
        validate: 'visudo -cf %s'

    - name: Adicionar o usuário 'leofs' ao grupo 'wheel'
      user:
        name: leofs
        groups: wheel
        append: yes

Instalação do Erlang

    - name: Instalar remote erlang-20.3.8.23-1.el7.x86_64.rpm com 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

A versão completa dos playbooks ansible corrigidos pode ser encontrada aqui: https://github.com/patsevanton/leofs_ansible

Instalação, configuração, início

Em seguida, execute conforme escrito em https://github.com/leo-project/leofs_ansible sem 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 o status do cluster no Primary LeoManager

leofs-adm status

Primary e Secondary podem ser vistos nos logs do ansible-playbook

Instalação de um armazenamento de objetos distribuído e tolerante a falhas LeoFS, compatível com clientes que utilizam S3 e NFS.

Instalação de um armazenamento de objetos distribuído e tolerante a falhas LeoFS, compatível com clientes que utilizam S3 e NFS.

A saída será algo como

 [Configuração do Sistema]
-----------------------------------+----------
 Item                              | Valor    
-----------------------------------+----------
 Nível básico/consistência
-----------------------------------+----------
                    versão do sistema | 1.4.3
                        Id do cluster | leofs_1
                             Id do DC | dc_1
                    Total de réplicas | 2
          número de sucessos de R | 1
          número de sucessos de W | 1
          número de sucessos de D | 1
 número de réplicas ciente do rack | 0
                         tamanho do anel | 2^128
-----------------------------------+----------
 Configurações de replicação Multi DC
-----------------------------------+----------
 [mdcr] número máximo de DCs que podem se juntar | 2
 [mdcr] total de réplicas por DC     | 1
 [mdcr] número de sucessos de R      | 1
 [mdcr] número de sucessos de W      | 1
 [mdcr] número de sucessos de D      | 1
-----------------------------------+----------
 Hash do RING do Gerente
-----------------------------------+----------
                 hash do anel atual | a0314afb
                hash do anel anterior | a0314afb
-----------------------------------+----------

 [Estado do(s) Nó(s)]
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
 tipo  |         nó         |    estado    | id do rack |  anel atual    |   anel anterior |          atualizado em         
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
  S    | S0@172.26.9.179      | em execução  |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.181      | em execução  |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.182      | em execução  |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.183      | anexado     |         |                |                | 2019-12-05 10:33:58 +0000
  G    | G0@172.26.9.180      | em execução  |         | a0314afb       | a0314afb       | 2019-12-05 10:33:49 +0000
  G    | G0@172.26.9.184      | em execução  |         | a0314afb       | a0314afb       | 2019-12-05 10:33:49 +0000
-------+----------------------+--------------+---------+----------------+----------------+----------------------------

Criando usuário

Criando usuário leofs:

leofs-adm create-user leofs leofs

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

Lista de usuários:

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

Criando Bucket

Bucket criado

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  | Me(full_control) | 2019-12-02 10:44:02 +0000

Configuração do s3cmd

No campo Nome do servidor proxy HTTP informe o IP do servidor Gateway

s3cmd --configure 

Digite novos valores ou aceite os padrões entre colchetes com Enter.
Consulte o manual do usuário para uma descrição detalhada de todas as opções.

A chave de acesso e a chave secreta são seus identificadores para o Amazon S3. Deixe-as em branco para usar as variáveis de ambiente.
Chave de Acesso [9c2615f32e81e6a1caf5]: 
Chave Secreta [8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb]: 
Região Padrão [US]: 

Use "s3.amazonaws.com" para o Endpoint do S3 e não modifique para o Amazon S3 de destino.
Endpoint do S3 [s3.amazonaws.com]: 

Use "%(bucket)s.s3.amazonaws.com" para o Amazon S3 de destino. As variáveis "%(bucket)s" e "%(location)s" podem ser usadas
se o sistema S3 de destino suportar buckets baseados em DNS.
Template de bucket+hostname:port em estilo DNS para acessar um bucket [%(bucket)s.s3.amazonaws.com]: leofs

A senha de criptografia é usada para proteger seus arquivos de leitura
por pessoas não autorizadas durante a transferência para o S3.
Senha de Criptografia: 
Caminho para o programa GPG [\/usr\/bin\/gpg]: 

Ao usar o protocolo HTTPS seguro, toda a comunicação com os servidores Amazon S3
está protegida contra espionagem de terceiros. Este método é
mais lento que o HTTP simples e pode ser apenas proxyado com Python 2.7 ou mais recente.
Usar protocolo HTTPS [Não]: 

Em algumas redes, todo o acesso à internet deve passar por um proxy HTTP.
Tente configurá-lo aqui se você não conseguir se conectar ao S3 diretamente.
Nome do servidor proxy HTTP [172.26.9.180]: 
Porta do servidor proxy HTTP [8080]: 

Novas configurações:
  Chave de Acesso: 9c2615f32e81e6a1caf5
  Chave Secreta: 8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb
  Região Padrão: US
  Endpoint do S3: s3.amazonaws.com
  Template de bucket+hostname:port em estilo DNS para acessar um bucket: leofs
  Senha de Criptografia: 
  Caminho para o programa GPG: \/usr\/bin\/gpg
  Usar protocolo HTTPS: Falso
  Nome do servidor proxy HTTP: 172.26.9.180
  Porta do servidor proxy HTTP: 8080

Testar acesso com as credenciais fornecidas? [Y/n] Y
Aguarde, tentando listar todos os buckets...
Sucesso. Sua chave de acesso e chave secreta funcionaram bem :-)

Agora verificando se a criptografia funciona...
Não configurado. Sem problemas.

Salvar configurações? [y/N] y
Configuração salva em '\/home\/user\/.s3cfg'

Se você receber o erro ERROR: S3 error: 403 (AccessDenied): Acesso negado:

s3cmd put test.py s3:\/\/leofs\/
upload: 'test.py' -> 's3:\/\/leofs\/test.py'  [1 de 1]
 382 de 382   100% em    0s     3.40 kB\/s  concluído
ERROR: S3 error: 403 (AccessDenied): Acesso negado

Então você precisa corrigir signature_v2 para True no arquivo de configuração do s3cmd. Mais detalhes nisso issue.

Se signature_v2 for False, você receberá o seguinte erro:

AVISO: Tentando novamente a solicitação falhada: \/?delimiter= (o argumento 2 de getaddrinfo() deve ser um inteiro ou uma string)
AVISO: Aguardando 3 seg...
AVISO: Tentando novamente a solicitação falhada: \/?delimiter= (o argumento 2 de getaddrinfo() deve ser um inteiro ou uma string)
AVISO: Aguardando 6 seg...
ERRO: Teste falhou: Solicitação falhada para: \/?delimiter=

Teste de upload

Criando arquivo de 1GB

fallocate -l 1GB 1gb

Carregando para o Leofs

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

Estatísticas

leofs-adm du para 1 nó:

leofs-adm du S0@172.26.9.179
 número ativo de objetos: 156
  número total de objetos: 156
   tamanho ativo dos objetos: 602954495
    tamanho total dos objetos: 602954495
     razão de tamanho ativo: 100.0%
    início da última compactação: ____-__-__ __:__:__
      fim da última compactação: ____-__-__ __:__:__

Podemos ver que a saída não é muito informativa.

Vamos ver onde este arquivo está localizado.
leofs-adm whereis leofs\/1gb

leofs-adm onde está leofs/1gb
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
 del?  |         nó        |             endereço do anel             |    tamanho    |   checksum   |  tem filhos  |  total de chunks  |     relógio      |             quando            
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
       | S0@172.26.9.181      | 657a9f3a3db822a7f1f5050925b26270     |    976563K |   a4634eea55 | verdadeiro     |             64 | 598f2aa976a4f  | 2019-12-05 10:48:15 +0000
       | S0@172.26.9.182      | 657a9f3a3db822a7f1f5050925b26270     |    976563K |   a4634eea55 | verdadeiro     |             64 | 598f2aa976a4f  | 2019-12-05 10:48:15 +0000

Ativando NFS

Activar NFS no servidor Leo Gateway 172.26.9.184.

Instalaremos nfs-utils no servidor e no cliente

sudo yum install nfs-utils

De acordo com as instruções, vamos corrigir o arquivo de configuração /usr/local/leofs/current/leo_gateway/etc/leo_gateway.conf

protocol = nfs

No servidor 172.26.9.184, vamos iniciar rpcbind e leofs-gateway

sudo service rpcbind start
sudo service leofs-gateway restart

No servidor onde o leo_manager está em execução, criaremos um bucket para NFS e geraremos uma chave para conexão com NFS

leofs-adm add-bucket test 05236
leofs-adm gen-nfs-mnt-key test 05236 endereço-ip-nfs-cliente

Conexão com NFS

sudo mkdir /mnt/leofs
## para Linux - "sudo mount -t nfs -o nolock :// "
sudo mount -t nfs -o nolock endereço-ip-nfs-servidor-onde-você-tem-o-gateway:bucket/access_key_id/chave-gerada-por-gen-nfs-mnt-key /mnt/leofs
sudo mount -t nfs -o nolock 172.26.9.184:/test/05236/bb5034f0c740148a346ed663ca0cf5157efb439f /mnt/leofs

Visualização do espaço em disco através do cliente NFS

Espaço em disco considerando que cada nó de armazenamento tem um disco de 40GB (3 nós em execução, 1 nó anexado):

df -hP
Sistema de arquivos                                                         Tamanho  Usado Disponível Uso% Montado em
172.26.9.184:/test/05236/e7298032e78749149dd83a1e366afb328811c95b   60G  3.6G   57G   6% /mnt/leofs

Instalação do LeoFS com 6 nós de armazenamento.

Inventário (sem 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

Saída do leofs-adm status

Saída do 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
-------+----------------------+--------------+---------+----------------+----------------+----------------------------

Espaço em disco considerando que cada nó de armazenamento tem um disco de 40GB (6 nós em execução):

df -hP
Sistema de arquivos                                                      Tamanho  Usado Disponível Uso% Montado em
172.26.9.184:/test/05236/e7298032e78749149dd83a1e366afb328811c95b    120G  3.6G  117G   3% /mnt/leofs

Se 5 nós de armazenamento estiverem em uso

[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

Logs

Os logs estão localizados em diretórios /usr/local/leofs/current/*/log

Canal do Telegram: SDS e Sistemas de Arquivos em Cluster

Fonte: habr.com

Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS 🔥 Compre hospedagem confiável para sites com proteção contra DDoS, servidores VPS VDS | ProHoster