Instalando o recurso de armazenamento à prova de falhas distribuído LeoFS compatível com clientes usando S3, NFS

Eu sou da Luxoft.
De acordo com a Opennet : LeoFS é um recurso de armazenamento distribuído tolerante a falhas para objetos LeoFS , compatível com clientes que usam a API Amazon S3 e REST-API e também oferece suporte ao modo de operação como servidor NFS. Existem otimizações para armazenar objetos pequenos e muito grandes, existe um mecanismo de armazenamento em cache embutido, é possível replicar armazenamentos entre data centers. Entre os objetivos do projeto está a obtenção de 99,99999999% de confiabilidade devido à replicação excessiva de duplicatas e a eliminação de um único ponto de falha. O código do projeto está escrito em Erlang.


O LeoFS consiste em três componentes:


  • LeoFS Storage - presta serviços de manutenção às operações de adição, recuperação e exclusão de objetos e metadados, é responsável por replicar, restaurar e enfileirar solicitações de clientes.
  • LeoFS Gateway - atende solicitações HTTP e redireciona respostas a clientes usando a API REST ou S3-API, fornece armazenamento em cache dos dados mais solicitados na memória e no disco.
  • Gerenciador LeoFS - monitora a operação dos nós Gateway LeoFS e Armazenamento LeoFS, monitora o status dos nós e verifica as somas de verificação. Garante a integridade dos dados e alta disponibilidade de armazenamento.

Nesta postagem, instale o Leofs usando o ansible-playbook, teste S3, NFS.


Se você tentar instalar o LeoFS usando os manuais oficiais, ocorrerão erros diferentes: 1 , 2 . Neste post, escreverei o que precisa ser feito para evitar esses erros.


Onde você executará o ansible-playbook, precisará instalar o netcat.


Exemplo de inventário


Inventário de exemplo (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 do servidor


Desativando o Selinux. Espero que a comunidade crie políticas Selinux para o LeoFS.


  - name: Install libselinux as prerequisite for SELinux Ansible module yum: name: "{{item}}" state: latest with_items: - libselinux-python - libsemanage-python - name: Disable SELinux at next reboot selinux: state: disabled - name: Set SELinux in permissive mode until the machine is rebooted command: setenforce 0 ignore_errors: true changed_when: false 

Instale o netcat e o redhat-lsb-core . netcat necessário para leofs-adm , redhat-lsb-core necessário para determinar a versão do sistema operacional aqui .


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

Criando leofs de um usuário e adicionando-o ao grupo de roda


  - name: Create user leofs group: name: leofs state: present - name: Allow 'wheel' group to have passwordless sudo lineinfile: dest: /etc/sudoers state: present regexp: '^%wheel' line: '%wheel ALL=(ALL) NOPASSWD: ALL' validate: 'visudo -cf %s' - name: Add the user 'leofs' to group 'wheel' user: name: leofs groups: wheel append: yes 

Instale Erlang


  - name: Remote erlang-20.3.8.23-1.el7.x86_64.rpm install with 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 do playbook ansible corrigido 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 

Verificando o status do cluster no LeoManager Primário


 leofs-adm status 

Primário e Secundário podem ser vistos nos logs do ansible-playbook




A conclusão será algo como isto
  [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 | a0314afb previous ring-hash | a0314afb -----------------------------------+---------- [State of Node(s)] -------+----------------------+--------------+---------+----------------+----------------+---------------------------- type | node | state | rack id | current ring | prev ring | updated at -------+----------------------+--------------+---------+----------------+----------------+---------------------------- S | S0@172.26.9.179 | running | | a0314afb | a0314afb | 2019-12-05 10:33:47 +0000 S | S0@172.26.9.181 | running | | a0314afb | a0314afb | 2019-12-05 10:33:47 +0000 S | S0@172.26.9.182 | running | | a0314afb | a0314afb | 2019-12-05 10:33:47 +0000 S | S0@172.26.9.183 | attached | | | | 2019-12-05 10:33:58 +0000 G | G0@172.26.9.180 | running | | a0314afb | a0314afb | 2019-12-05 10:33:49 +0000 G | G0@172.26.9.184 | running | | a0314afb | a0314afb | 2019-12-05 10:33:49 +0000 -------+----------------------+--------------+---------+----------------+----------------+---------------------------- 

Crie um usuário


Crie leofs de usuário:


 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 

Criar um balde


Fez um balde


 leofs-adm add-bucket leofs 9c2615f32e81e6a1caf5 OK 

Lista de baldes:


  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 

Configurando o s3cmd


No campo HTTP Proxy server name , especifique o IP do servidor Gateway


 s3cmd --configure Enter new values or accept defaults in brackets with Enter. Refer to user manual for detailed description of all options. Access key and Secret key are your identifiers for Amazon S3. Leave them empty for using the env variables. Access Key [9c2615f32e81e6a1caf5]: Secret Key [8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb]: Default Region [US]: Use "s3.amazonaws.com" for S3 Endpoint and not modify it to the target Amazon S3. S3 Endpoint [s3.amazonaws.com]: Use "%(bucket)s.s3.amazonaws.com" to the target Amazon S3. "%(bucket)s" and "%(location)s" vars can be used if the target S3 system supports dns based buckets. DNS-style bucket+hostname:port template for accessing a bucket [%(bucket)s.s3.amazonaws.com]: leofs Encryption password is used to protect your files from reading by unauthorized persons while in transfer to S3 Encryption password: Path to GPG program [/usr/bin/gpg]: When using secure HTTPS protocol all communication with Amazon S3 servers is protected from 3rd party eavesdropping. This method is slower than plain HTTP, and can only be proxied with Python 2.7 or newer Use HTTPS protocol [No]: On some networks all internet access must go through a HTTP proxy. Try setting it here if you can't connect to S3 directly HTTP Proxy server name [172.26.9.180]: HTTP Proxy server port [8080]: New settings: Access Key: 9c2615f32e81e6a1caf5 Secret Key: 8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb Default Region: US S3 Endpoint: s3.amazonaws.com DNS-style bucket+hostname:port template for accessing a bucket: leofs Encryption password: Path to GPG program: /usr/bin/gpg Use HTTPS protocol: False HTTP Proxy server name: 172.26.9.180 HTTP Proxy server port: 8080 Test access with supplied credentials? [Y/n] Y Please wait, attempting to list all buckets... Success. Your access key and secret key worked fine :-) Now verifying that encryption works... Not configured. Never mind. Save settings? [y/N] y Configuration saved to '/home/user/.s3cfg' 

Se você receber um erro ERRO: Erro S3: 403 (AccessDenied): Acesso negado:


 s3cmd put test.py s3://leofs/ upload: 'test.py' -> 's3://leofs/test.py' [1 of 1] 382 of 382 100% in 0s 3.40 kB/s done ERROR: S3 error: 403 (AccessDenied): Access Denied 

Então você precisa corrigir signature_v2 na configuração True s3cmd. Detalhes nesta edição .


Se signature_v2 for False, haverá um erro:


 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 

Teste de inicialização


Crie um arquivo de 1 GB


 fallocate -l 1GB 1gb 

Carregue-o no Leofs


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

Estatísticas


leofs-adm du para 1 nó:


 leofs-adm du S0@172.26.9.179 active number of objects: 156 total number of objects: 156 active size of objects: 602954495 total size of objects: 602954495 ratio of active size: 100.0% last compaction start: ____-__-__ __:__:__ last compaction end: ____-__-__ __:__:__ 

Vemos que a conclusão não é muito informativa.


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


 leofs-adm whereis leofs/1gb -------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+---------------------------- del? | node | ring address | size | checksum | has children | total chunks | clock | when -------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+---------------------------- | 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 

Ativar NFS


Ativamos o NFS no servidor Leo Gateway 172.26.9.184.


No servidor e no cliente, instale o nfs-utils


 sudo yum install nfs-utils 

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


 protocol = nfs 

No servidor 172.26.9.184, execute rpcbind e leofs-gateway


 sudo service rpcbind start sudo service leofs-gateway restart 

No servidor em que leo_manager está em execução, crie um bucket para NFS e gere uma chave para conectar-se ao NFS


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

Conectar-se ao NFS


 sudo mkdir /mnt/leofs ## for Linux - "sudo mount -t nfs -o nolock <host>:/<bucket>/<token> <dir>" sudo mount -t nfs -o nolock ip--nfs-------gateway:/bucket/access_key_id/---gen-nfs-mnt-key /mnt/leofs sudo mount -t nfs -o nolock 172.26.9.184:/test/05236/bb5034f0c740148a346ed663ca0cf5157efb439f /mnt/leofs 

Exibir espaço em disco através de um cliente NFS


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


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

Instale o LeoFS com 6 nós de armazenamento.


Inventário (sem construtor):
 # 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 de status Leofs-adm


Saída de status Leofs-adm
  [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, levando em consideração que cada nó de armazenamento possui um disco de 40 GB (6 nós em execução):


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

Se 5 nós de armazenamento forem usados


 [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 nos diretórios /usr/local/leofs/current/*/log


Se você instalar / configurar os Leofs manualmente, poderá encontrar os seguintes erros.


[ERRO] Mnesia não está disponível

Inicie o serviço systemctl start leofs-manager-master


 leofs-adm status [ERROR] Mnesia is not available 

Precisa iniciar o systemctl start leofs-manager-slave em leo_manager_1


Leofs-storage não inicia.

É necessário que os status leofs-manager-master e leofs-manager-slave e leofs-adm estejam em execução para mostrar o status.


Nós anexados com menos de # de réplicas

Ao iniciar o leofs-adm start, você recebe este erro:


 leofs-adm start [ERROR] Attached nodes less than # of replicas 

Nós de armazenamento insuficientes. O status leofs-adm mostrará menos de 2 nós de armazenamento. Número mínimo necessário de nós de armazenamento 2.


O status leofs-adm mostra em anexo, o resto está em execução.

Necessidade de reequilibrar os nós


 leofs-adm rebalance 

Após iniciar o leofs-gateway, você não vê o nó Gateway no status leofs-adm

Precisa iniciar leofs-adm


 leofs-adm start 

Não foi possível conectar-se ao LeoFS Manager no nó Escravo

(Por padrão, leofs-adm não está funcionando no nó escravo!] ( Https://leo-project.net/leofs/docs/issues/documentation-issues/ )


Teste de carga


O teste ocorre em 2 nós com a configuração:


 CPU: Single Core Intel Core (Broadwell) (-MCP-) speed: 2295 MHz Kernel: 3.10.0-862.3.2.el7.x86_64 x86_64 Up: 1h 08m Mem: 1023.8/1999.6 MiB (51.2%) Storage: 10.00 GiB (43.5% used) Procs: 98 Shell: bash 4.2.46 inxi: 3.0.37 

Para testar, pegue um pequeno disco
Nos dois nós, vemos um disco de espaço livre de 9,4G e 5,9G.


 df -hP Filesystem Size Used Avail Use% Mounted on /dev/vda1 9.4G 5.9G 3.1G 66% / 

Canal de telegrama: SDS e Cluster FS

Source: https://habr.com/ru/post/pt478990/


All Articles