Инсталация на разпределено отказоустойчиво хранилище с обекти LeoFS, съвместимо с клиенти, използващи S3, NFS

Според Opennet: LeoFS — разпределено отказоустойчиво хранилище на обекти LeoFS, съвместимо с клиентите, използващи API на Amazon S3 и REST-API, а също така поддържа режим на работа като NFS-сървер. Има оптимизации за съхранение както на малки, така и на много големи обекти, наличен е вграден механизъм за кеширане, възможна е репликация на хранилищата между дата центровете. Сред целите на проекта е постигането на надеждност 99.9999999% чрез излишна репликация на дубликати и изключване на единна точка на отказ. Кодът на проекта е написан на Erlang.

LeoFS се състои от три компонента:

  • LeoFS Storage — обслужва операциите по добавяне, извличане и премахване на обекти и метаданни, отговаря за изпълнението на репликация, възстановяване и организиране на опашките от клиентски заявки.
  • LeoFS Gateway — обработва HTTP заявки и пренасочва отговорите към клиентите, използвайки REST-API или S3-API, осигурява кеширане на най-използваните данни в паметта и на диска.
  • LeoFS Manager — следи работата на възлите LeoFS Gateway и LeoFS Storage, изпълнява мониторинг на състоянието на възлите и проверява контрольни суми. Гарантира целостта на данните и висока наличност на хранилището.

В тази публикация ще инсталираме LeoFS с помощта на ansible-playbook, ще тестваме S3 и NFS.

Ако опитате да инсталирате LeoFS, използвайки официалните playbook-и, вероятно ще получите различни грешки: 1,2. В тази публикация ще напиша какво да направите, за да избегнете тези грешки.

Където ще стартирате ansible-playbook, е необходимо да инсталирате netcat.

Пример за инвентаризация

Пример за инвентаризация (в репозитория 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

Подготовка на сървърите

Изключване на Selinux. Надявам се, че общността ще създаде политики за Selinux за 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

Инсталиране netcat и redhat-lsb-core. netcat нужен за leofs-adm, redhat-lsb-core нужен за определяне на версията на ОС тук..

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

Създаване на потребителя leofs и добавяне на него в групата wheel

    - 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

Инсталиране на Erlang

    - name: Remote erlang-20.3.8.23-1.el7.x86_64.rpm инсталирай с 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

Цялата версия на поправените ansible playbook може да бъде намерена тук: https://github.com/patsevanton/leofs_ansible

Инсталиране, конфигуриране, стартиране

Следващото се изпълнява, както е написано в https://github.com/leo-project/leofs_ansible без 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

Проверяваме статуса на клъстера на Primary LeoManager

leofs-adm status

Primary и Secondary могат да бъдат видяни в логовете на ansible-playbook

Инсталация на разпределено отказоустойчиво хранилище с обекти LeoFS, съвместимо с клиенти, използващи S3, NFS

Инсталация на разпределено отказоустойчиво хранилище с обекти LeoFS, съвместимо с клиенти, използващи S3, NFS

Изходът ще изглежда приблизително така

 [Системна конфигурация]
-----------------------------------+----------
 Артикул                           | Стойност    
-----------------------------------+----------
 Основен/Ниво на консистентност
-----------------------------------+----------
                  версия на системата | 1.4.3
                       ид на клъстер | leofs_1
                            ид на DC | dc_1
                   Общо реплики     | 2
          брой на успешни R      | 1
          брой на успешни W      | 1
          брой на успешни D      | 1
 брой на реплики с осведомяване по рафтове | 0
                        размер на обръча | 2^128
-----------------------------------+----------
 Настройки за многократно DC реплициране
-----------------------------------+----------
 [mdcr] макс. брой присъединими DC | 2
 [mdcr] общо реплики на DC       | 1
 [mdcr] брой на успешни R        | 1
 [mdcr] брой на успешни W        | 1
 [mdcr] брой на успешни D        | 1
-----------------------------------+----------
 Мениджър на RING хеш
-----------------------------------+----------
                 текущ хеш на обръча | a0314afb
                предишен хеш на обръча | a0314afb
-----------------------------------+----------

 [Състояние на Нода(и)]
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
 тип  |         нода        |    състояние  | ид на рафт |  текущ обръч    |   предишен обръч  |          актуализирано в         
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
  S    | S0@172.26.9.179      | работа        |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.181      | работа        |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.182      | работа        |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | S0@172.26.9.183      | прикачен     |         |                |                | 2019-12-05 10:33:58 +0000
  G    | G0@172.26.9.180      | работа        |         | a0314afb       | a0314afb       | 2019-12-05 10:33:49 +0000
  G    | G0@172.26.9.184      | работа        |         | a0314afb       | a0314afb       | 2019-12-05 10:33:49 +0000
-------+----------------------+--------------+---------+----------------+----------------+----------------------------

Създаваме потребител

Създаваме потребител leofs:

leofs-adm create-user leofs leofs

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

Списък на потребителите:

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

Създаваме Bucket

Създаден bucket

leofs-adm add-bucket leofs 9c2615f32e81e6a1caf5
OK

Списък на 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

Настройка s3cmd

В полето Име на HTTP Прокси сървър указваме IP адреса на Gateway сървъра

s3cmd --configure 

Въведете нови стойности или приемете подразбиращите се в скоби с Enter.
Обърнете се към ръководството на потребителя за подробно описание на всички опции.

Достъп до ключ и Тайна ключ са вашите идентификатори за Amazon S3. Оставете ги празни, за да използвате променливите на средата.
Достъп Ключ [9c2615f32e81e6a1caf5]: 
Тайната Ключ [8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb]: 
Подразбиращ Регион [САЩ]: 

Използвайте "s3.amazonaws.com" за S3 крайна точка и не я променяйте на целевия Amazon S3.
S3 крайна точка [s3.amazonaws.com]: 

Използвайте "%(bucket)s.s3.amazonaws.com" за целевия Amazon S3. Променливите "%(bucket)s" и "%(location)s" могат да бъдат използвани
ако целевата S3 система поддържа DNS базирани кошници.
Шаблон за достъп до кошница в стил DNS + име на хост: порт [%(bucket)s.s3.amazonaws.com]: leofs

Паролата за шифроване се използва за защита на вашите файлове от четене
от неразрешени лица по време на пренос към S3
Парола за шифроване: 
Път до GPG програмата [\/usr\/bin\/gpg]: 

Когато използвате защитен HTTPS протокол, всичката комуникация с Amazon S3
сървъри е защитена от подслушване на трети лица. Този метод е
по-бавен от обикновения HTTP и може да бъде проксиран само с Python 2.7 или по-нови
Използвайте HTTPS протокол [Не]: 

На някои мрежи, целият интернет достъп трябва да преминава през HTTP прокси.
Опитайте да го зададете тук, ако не можете да се свържете с S3 директно.
Име на HTTP Прокси сървър [172.26.9.180]: 
Порт на HTTP Прокси сървър [8080]: 

Новите настройки:
  Достъп Ключ: 9c2615f32e81e6a1caf5
  Тайна Ключ: 8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb
  Подразбиращ Регион: САЩ
  S3 крайна точка: s3.amazonaws.com
  Шаблон за достъп до кошница в стил DNS + име на хост: порт: leofs
  Парола за шифроване: 
  Път до GPG програмата: /usr/bin/gpg
  Използвайте HTTPS протокол: Лъжа
  Име на HTTP Прокси сървър: 172.26.9.180
  Порт на HTTP Прокси сървър: 8080

Тест за достъп с предоставените идентификационни данни? [Y/n] Y
Моля, изчакайте, опитвайки се да изброите всички кошници...
Успех. Вашият достъпен ключ и тайната ключ работиха добре :-)

Сега проверяваме дали шифроването работи...
Не е настроено. Не се тревожете.

Запазете настройки? [y/N] y
Конфигурацията е запазена в '\/home\/user\/.s3cfg'

Ако получите грешка ERROR: S3 грешка: 403 (AccessDenied): Достъп отказан:

s3cmd put test.py s3:\/\/leofs\/
upload: 'test.py' -> 's3:\/\/leofs\/test.py'  [1 от 1]
 382 от 382   100% за   0s     3.40 kB\/s  готово
ERROR: S3 грешка: 403 (AccessDenied): Достъп отказан

Тогава трябва да поправите signature_v2 в конфигурацията на s3cmd на True. Подробности в това issue.

Ако signature_v2 е False, ще получите такава грешка:

ВНИМАНИЕ: Повторно се опитвам да изпълня провалена заявка: \/?delimiter= (аргумент 2 на getaddrinfo() трябва да бъде цяло число или низ)
ВНИМАНИЕ: Изчаквам 3 секунди...
ВНИМАНИЕ: Повторно се опитвам да изпълня провалена заявка: \/?delimiter= (аргумент 2 на getaddrinfo() трябва да бъде цяло число или низ)
ВНИМАНИЕ: Изчаквам 6 секунди...
ГРЕШКА: Тестът не успя: Заявката не успя за: \/?delimiter=

Тестиране на качване

Създаваме файл от 1ГБ

fallocate -l 1GB 1gb

Качваме го в Leofs

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

Статистика

leofs-adm du за 1 възел:

leofs-adm du S0@172.26.9.179
 активно число на обектите: 156
  общо число на обектите: 156
   активно размер на обектите: 602954495
    обща размер на обектите: 602954495
     коефициент на активно размер: 100.0%
    последно начало на компресиране: ____-__-__ __:__:__
      последно край на компресиране: ____-__-__ __:__:__

Виждаме, че изходът не е много информативен.

Нека видим къде е разположен този файл.
leofs-adm whereis leofs\/1gb

leofs-adm къде е 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

Активираме NFS

Активираме NFS на сървър Leo Gateway 172.26.9.184.

На сървъра и клиента инсталираме nfs-utils

sudo yum install nfs-utils

Според инструкциите коригираме конфигурационния файл /usr/local/leofs/current/leo_gateway/etc/leo_gateway.conf

protocol = nfs

На сървъра 172.26.9.184 стартираме rpcbind и leofs-gateway

sudo service rpcbind start
sudo service leofs-gateway restart

На сървъра, където е стартиран leo_manager, създаваме bucket за NFS и генерираме ключ за свързване към NFS

leofs-adm add-bucket test 05236
leofs-adm gen-nfs-mnt-key test 05236 ip-адрес-nfs-клиента

Свързване с NFS

sudo mkdir /mnt/leofs
## за Linux - "sudo mount -t nfs -o nolock :// "
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

Преглед на дисковото пространство чрез NFS клиент

Дисковото пространство, като се има предвид, че всяка нода storage има диск 40ГБ (3 ноди работят, 1 нода е прикачена):

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

Инсталиране на LeoFS с 6 storage ноди.

Инвентаризация (без 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

Изход leofs-adm status

Изход leofs-adm status

 [Системна конфигурация]
-----------------------------------+----------
 Артикул                             | Стойност    
-----------------------------------+----------
 Основен/Ниво на консистентност
-----------------------------------+----------
                    версия на системата | 1.4.3
                        идентификатор на клъстера | leofs_1
                             идентификатор на DC | dc_1
                    Общо реплики | 2
          брой на успешни операции R | 1
          брой на успешни операции W | 1
          брой на успешни операции D | 1
 брой на реплики със свикване на рафта | 0
                         размер на ринга | 2^128
-----------------------------------+----------
 Настройки за многократна репликация на DC
-----------------------------------+----------
 [mdcr] максимален брой на присъединени DC | 2
 [mdcr] общо реплики на DC    | 1
 [mdcr] брой на успешни операции R   | 1
 [mdcr] брой на успешни операции W   | 1
 [mdcr] брой на успешни операции D   | 1
-----------------------------------+----------
 Мениджър на хеширане на RING
-----------------------------------+----------
                 текущ хеш на ринга | d8ff465e
                предишен хеш на ринга | d8ff465e
-----------------------------------+----------

 [Състояние на Нода(ите)]
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
 тип  |         нод         |    състояние     | идентификатор на рафта |  текущ ринг  |   предишен ринг    |          обновено на         
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
  S    | S0@172.26.9.178      | работещ      |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  S    | S0@172.26.9.179      | работещ      |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  S    | S0@172.26.9.181      | работещ      |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:30 +0000
  S    | S0@172.26.9.182      | работещ      |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  S    | S0@172.26.9.183      | работещ      |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  S    | S0@172.26.9.185      | работещ      |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  G    | G0@172.26.9.180      | работещ      |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:31 +0000
  G    | G0@172.26.9.184      | работещ      |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:31 +0000
-------+----------------------+--------------+---------+----------------+----------------+----------------------------

Дисковото пространство, като се има предвид, че всяка нода за съхранение има диск от 40ГБ (6 ноди работят):

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

Ако се използват 5 ноди за съхранение

[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

Логове

Логовете са в директорийте /usr/local/leofs/current/*/log

Телеграм канал: SDS и Клъстерни FS

Източник: habr.com

Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри 🔥 Купете надежден хостинг за сайтове със защита от DDoS, VPS и VDS сървъри | ProHoster