Според : — разпределено отказоустойчиво хранилище на обекти , съвместимо с клиенти, които използват API Amazon S3 и REST-API, както и поддържащо режим на работа в роля на NFS-сървър. Има оптимизации за съхранение както на малки, така и на много големи обекти, присъства вграден механизъм за кеширане, възможна е репликация на хранилищата между дата центровете. Сред целите на проекта е постигането на надеждност от 99.9999999% чрез излишно репликиране на дубликати и изключване на единична точка на отказ. Кодът на проекта е написан на езика Erlang.
LeoFS се състои от три компонента:
- — обслужва операции по добавяне, извличане и изтриване на обекти и метаданни, отговаря за изпълнението на репликацията, възстановяването и формирането на опашка от клиентски заявки.
- — обслужва HTTP заявки и пренасочва отговорите към клиентите, използвайки REST-API или S3-API, осигурява кеширане на най-търсените данни в паметта и на диска.
- — следи работата на възлите LeoFS Gateway и LeoFS Storage, води мониторинг на състоянието на възлите и проверява контролни суми. Гарантира целостта на данните и висока наличност на хранилището.
В този пост ще инсталираме Leofs с помощта на ansible-playbook, ще тестваме S3, NFS.
Ако се опитате да инсталирате LeoFS, използвайки официалните playbook-и, ще срещнете различни грешки: ,. В този пост ще опиша какво трябва да направите, за да избегнете тези грешки.
Там, където ще стартирате ansible-playbook, е необходимо да инсталирате netcat.
Пример за inventory
Пример за inventory (в репозитория 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: Създаване на потребител leofs
group:
name: leofs
state: present
- name: Позволете на групата 'wheel' да има sudo без парола
lineinfile:
dest: /etc/sudoers
state: present
regexp: '^%wheel'
line: '%wheel ALL=(ALL) NOPASSWD: ALL'
validate: 'visudo -cf %s'
- name: Добавяне на потребителя 'leofs' в групата 'wheel'
user:
name: leofs
groups: wheel
append: yesИнсталация на Erlang
- name: Инсталиране на 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-и може да бъде намерена тук:
Инсталация, конфигуриране, стартиране
След това изпълняваме, както е описано в без 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 statusPrimary и Secondary могат да бъдат видени в логовете на ansible-playbook


Изходът ще изглежда приблизително така
[Системна конфигурация]
-----------------------------------+----------
Артикул | Стойност
-----------------------------------+----------
Основен/Консистентен ниво
-----------------------------------+----------
версия на системата | 1.4.3
идентификационен номер на клъстера | leofs_1
идентификационен номер на DC | dc_1
Общо реплики | 2
брой успехи на R | 1
брой успехи на W | 1
брой успехи на D | 1
брой реплики с осведоменост за рафтове | 0
размер на пръстена | 2^128
-----------------------------------+----------
Настройки за репликация на Multi DC
-----------------------------------+----------
[mdcr] макс. брой на присъединими DC | 2
[mdcr] общо реплики на DC | 1
[mdcr] брой успехи на R | 1
[mdcr] брой успехи на W | 1
[mdcr] брой успехи на D | 1
-----------------------------------+----------
Мениджър RING хеш
-----------------------------------+----------
текущ пръстен-хеш | a0314afb
предишен пръстен-хеш | a0314afb
-----------------------------------+----------
[Състояние на възела(ите)]
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
тип | възел | състояние | rack id | текущ пръстен | предишен пръстен | обновено в
-------+----------------------+--------------+---------+----------------+----------------+----------------------------
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.
Препратете към потребителския наръчник за подробно описание на всички опции.
Access key и Secret key са вашите идентификатори за Amazon S3. Оставете ги празни за използване на променливите в околната среда.
Access Key [9c2615f32e81e6a1caf5]:
Secret Key [8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb]:
Default Region [US]:
Използвайте "s3.amazonaws.com" за S3 Endpoint и не го променяйте за целта Amazon S3.
S3 Endpoint [s3.amazonaws.com]:
Използвайте "%(bucket)s.s3.amazonaws.com" за целта Amazon S3. "%(bucket)s" и "%(location)s" променливи могат да бъдат използвани, ако целевата S3 система поддържа базирани на DNS buckets.
DNS-стил bucket+hostname:port шаблон за достъп до bucket [%(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]:
Нови настройки:
Access Key: 9c2615f32e81e6a1caf5
Secret Key: 8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb
Default Region: US
S3 Endpoint: s3.amazonaws.com
DNS-стил bucket+hostname:port шаблон за достъп до bucket: leofs
Парола за криптиране:
Път до GPG програма: \/usr\/bin\/gpg
Използвайте HTTPS протокол: False
Име на HTTP прокси сървър: 172.26.9.180
Порт на HTTP прокси сървър: 8080
Тест на достъпа с предоставените идентификационни данни? [Y\/n] Y
Моля, изчакайте, опитваме да изброим всички bucket-и...
Успех. Вашият Access key и Secret key работят добре :-)
Сега проверяваме дали криптирането работи...
Не е конфигурирано. Не се притеснявайте.
Да запазим настройките? [y\/N] y
Конфигурацията е запазена в '\/home\/user\/.s3cfg'Ако получавате грешка ERROR: S3 error: 403 (AccessDenied): Достъп отказан:
s3cmd put test.py s3:\/\/leofs\/\nupload: 'test.py' -> 's3:\/\/leofs\/test.py' [1 от 1]
382 от 382 100% в 0s 3.40 kB\/s готов
ERROR: S3 error: 403 (AccessDenied): Достъп отказанТогава трябва в конфигурацията на s3cmd да промените signature_v2 на True. Подробности в това .
Ако 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
user 0m7.855s
sys 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 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Активираме 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
[System Confiuration]
-----------------------------------+----------
Item | Value
-----------------------------------+----------
Основен/Ниво на консистентност
-----------------------------------+----------
системна версия | 1.4.3
идентификатор на клъстера | leofs_1
идентификатор на DC | dc_1
Общо реплики | 2
брой на успехи на R | 1
брой на успехи на W | 1
брой на успехи на D | 1
брой на реплики с разпознаване на рафтове | 0
размер на пръстена | 2^128
-----------------------------------+----------
Настройки за репликация в Multi DC
-----------------------------------+----------
[mdcr] максимален брой на свързани DCs | 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
-------+----------------------+--------------+---------+----------------+----------------+----------------------------Дисково пространство, имайки предвид, че всяка нода storage има диск от 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 ноди storage
[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.183df -hP
172.26.9.184:/test/05236/e7298032e78749149dd83a1e366afb328811c95b 100G 3.0G 97G 3% /mnt/leofsЛогове
Логовете се намират в директориите /usr/local/leofs/current/*/log
Телеграм канал:
Източник: habr.com
