Instalacja rozproszonego odpornego na awarie magazynu obiektów LeoFS, zgodnego z klientami używającymi S3, NFS

Zgodnie z Opennet: LeoFS — rozproszona odporna na awarie magazyn obiektów LeoFS, zgodna z klientami korzystającymi z API Amazon S3 oraz REST-API, a także wspierająca tryb działania jako serwer NFS. Posiada optymalizacje do przechowywania zarówno małych, jak i bardzo dużych obiektów, wbudowany mechanizm buforowania oraz możliwość replikacji magazynów między centrami danych. Wśród celów projektu podkreśla się dążenie do osiągnięcia niezawodności na poziomie 99.9999999% dzięki nadmiarowemu replikowaniu duplikatów i eliminacji pojedynczego punktu awarii. Kod projektu jest napisany w języku Erlang.

LeoFS składa się z trzech komponentów:

  • LeoFS Storage — obsługuje operacje dodawania, pobierania i usuwania obiektów i metadanych, odpowiada za wykonanie replikacji, przywracania i tworzenia kolejek żądań od klientów.
  • LeoFS Gateway — obsługuje żądania HTTP i przekierowuje odpowiedzi do klientów przy użyciu REST-API lub S3-API, zapewnia buforowanie najczęściej używanych danych w pamięci i na dysku.
  • LeoFS Manager — monitoruje pracę węzłów LeoFS Gateway i LeoFS Storage, prowadzi monitoring stanu węzłów i sprawdza sumy kontrolne. Gwarantuje integralność danych i wysoką dostępność magazynu.

W tym poście zainstalujemy LeoFS za pomocą ansible-playbook, przetestujemy S3, NFS.

Jeśli spróbujesz zainstalować LeoFS korzystając z oficjalnych playbooków, napotkasz różne błędy: 1,2. W tym poście opiszę, co należy zrobić, aby tych błędów uniknąć.

Gdziekolwiek będziesz uruchamiać ansible-playbook, musisz zainstalować netcat.

Przykład inventory

Przykład inventory (w repozytorium 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

Przygotowanie serwerów

Wyłączenie Selinux. Mam nadzieję, że społeczność stworzy polityki Selinux dla 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

Instalacja netcat i redhat-lsb-core. netcat potrzebny do leofs-adm, redhat-lsb-core potrzebny do określenia wersji systemu operacyjnego tutaj.

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

Tworzenie użytkownika leofs i dodanie go do grupy 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

Instalacja Erlang

    - name: Zdalna instalacja erlang-20.3.8.23-1.el7.x86_64.rpm za pomocą 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

Pełną wersję poprawionego ansible playbooka można znaleźć tutaj: https://github.com/patsevanton/leofs_ansible

Instalacja, konfiguracja, uruchomienie

Następnie postępuj zgodnie z instrukcjami zawartymi w https://github.com/leo-project/leofs_ansible bez 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

Sprawdzamy stan klastra w Primary LeoManager

leofs-adm status

Primary i Secondary można zobaczyć w logach ansible-playbook

Instalacja rozproszonego odpornego na awarie magazynu obiektów LeoFS, zgodnego z klientami używającymi S3, NFS

Instalacja rozproszonego odpornego na awarie magazynu obiektów LeoFS, zgodnego z klientami używającymi S3, NFS

Wyjście będzie wyglądać mniej więcej tak

 [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
-------+----------------------+--------------+---------+----------------+----------------+----------------------------

Tworzymy użytkownika

Tworzymy użytkownika leofs:

leofs-adm create-user leofs leofs

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

Lista użytkowników:

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

Tworzymy Bucket

Utworzono bucket

leofs-adm add-bucket leofs 9c2615f32e81e6a1caf5
OK

Lista bucketów:

 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

Konfiguracja s3cmd

W polu Nazwa serwera proxy HTTP wskazujemy adres IP serwera Gateway

s3cmd --configure 

Wprowadź nowe wartości lub zaakceptuj domyślne w nawiasach, naciskając Enter.
Zapoznaj się z podręcznikiem użytkownika, aby uzyskać szczegółowy opis wszystkich opcji.

Klucz dostępu i klucz tajny są Twoimi identyfikatorami dla Amazon S3. Pozostaw puste, aby korzystać ze zmiennych środowiskowych.
Klucz dostępu [9c2615f32e81e6a1caf5]: 
Klucz tajny [8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb]: 
Domyślny region [US]: 

Użyj "s3.amazonaws.com" jako punktu końcowego S3 i nie modyfikuj go dla docelowego Amazon S3.
Punkt końcowy S3 [s3.amazonaws.com]: 

Użyj "%(bucket)s.s3.amazonaws.com" dla docelowego Amazon S3. Zmienne "%(bucket)s" i "%(location)s" mogą być używane,
jeśli docelowy system S3 wspiera koszyki oparte na dns.
Szablon koszyka + hostname:port w stylu DNS do uzyskania dostępu do koszyka [%(bucket)s.s3.amazonaws.com]: leofs

Hasło szyfrowania jest używane do ochrony Twoich plików przed odczytem
przez osoby nieuprawnione podczas transferu do S3
Hasło szyfrowania: 
Ścieżka do programu GPG [\/usr\/bin\/gpg]: 

Kiedy używasz zabezpieczonego protokołu HTTPS, cała komunikacja z serwerami Amazon S3
jest chroniona przed podsłuchiwaniem przez osoby trzecie. Ta metoda jest
wolniejsza niż zwykły HTTP i może być przekierowywana tylko w Pythonie 2.7 lub nowszym.
Użyj protokołu HTTPS [Nie]: 

Na niektórych sieciach cały dostęp do internetu musi odbywać się przez serwer proxy HTTP.
Spróbuj ustawić to tutaj, jeśli nie możesz połączyć się bezpośrednio z S3.
Nazwa serwera proxy HTTP [172.26.9.180]: 
Port serwera proxy HTTP [8080]: 

Nowe ustawienia:
  Klucz dostępu: 9c2615f32e81e6a1caf5
  Klucz tajny: 8aaaa35c1ad78a2cbfa1a6cd49ba8aaeb3ba39eb
  Domyślny region: US
  Punkt końcowy S3: s3.amazonaws.com
  Szablon koszyka + hostname:port w stylu DNS do uzyskania dostępu do koszyka: leofs
  Hasło szyfrowania: 
  Ścieżka do programu GPG: \/usr\/bin\/gpg
  Użyj protokołu HTTPS: Fałsz
  Nazwa serwera proxy HTTP: 172.26.9.180
  Port serwera proxy HTTP: 8080

Czy przetestować dostęp z podanymi danymi uwierzytelniającymi? [Y\/n] Y
Proszę czekać, próbując wylistować wszystkie koszyki...
Sukces. Twój klucz dostępu i klucz tajny działają poprawnie :-)

Teraz weryfikuję, czy szyfrowanie działa...
Nie skonfigurowano. Nie martw się.

Zapisz ustawienia? [y\/N] y
Konfiguracja zapisana w '\/home\/user\/.s3cfg'

Jeśli pojawia się błąd ERROR: S3 błąd: 403 (AccessDenied): Odrzucono dostęp:

s3cmd put test.py s3:\/\/leofs\/
upload: 'test.py' -> 's3:\/\/leofs\/test.py'  [1 z 1]
 382 z 382   100% w    0s     3.40 kB\/s  zakończone
ERROR: S3 błąd: 403 (AccessDenied): Odrzucono dostęp

Należy poprawić konfigurację s3cmd, ustawiając signature_v2 na True. Szczegóły w tym issue.

Jeśli signature_v2 będzie False, pojawi się taki błąd:

OSTRZEŻENIE: Ponowne próby nieudanej prośby: \/?delimiter= (argument 2 getaddrinfo() musi być liczbą całkowitą lub ciągiem)
OSTRZEŻENIE: Czekam 3 sek...
OSTRZEŻENIE: Ponowne próby nieudanej prośby: \/?delimiter= (argument 2 getaddrinfo() musi być liczbą całkowitą lub ciągiem)
OSTRZEŻENIE: Czekam 6 sek...
BŁĄD: Test nie powiódł się: Prośba nie powiodła się dla: \/?delimiter=

Testowanie uploadu

Tworzymy plik 1GB

fallocate -l 1GB 1gb

Ładujemy go do Leofs

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

Statystyka

leofs-adm du dla 1 węzła:

leofs-adm du S0@172.26.9.179
 aktywna liczba obiektów: 156
  łączna liczba obiektów: 156
   aktywna wielkość obiektów: 602954495
    łączna wielkość obiektów: 602954495
     wskaźnik aktywnej wielkości: 100.0%
    ostatni start kompresji: ____-__-__ __:__:__
      ostatni koniec kompresji: ____-__-__ __:__:__

Widzimy, że wynik nie jest zbyt informatywny.

Zobaczmy, gdzie znajduje się ten plik.
leofs-adm whereis leofs\/1gb

leofs-adm gdzie jest leofs/1gb
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
 del?  |         węzeł        |             adres pierścienia            |    rozmiar    |   suma kontrolna   |  ma dzieci  |  całkowita liczba chunków  |     zegar      |             kiedy            
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
       | S0@172.26.9.181      | 657a9f3a3db822a7f1f5050925b26270     |    976563K |   a4634eea55 | prawda         |             64 | 598f2aa976a4f  | 2019-12-05 10:48:15 +0000
       | S0@172.26.9.182      | 657a9f3a3db822a7f1f5050925b26270     |    976563K |   a4634eea55 | prawda         |             64 | 598f2aa976a4f  | 2019-12-05 10:48:15 +0000

Aktywujemy NFS

Aktywujemy NFS na serwerze Leo Gateway 172.26.9.184.

Na serwerze i kliencie zainstalujemy nfs-utils

sudo yum install nfs-utils

Zgodnie z instrukcją poprawimy plik konfiguracyjny /usr/local/leofs/current/leo_gateway/etc/leo_gateway.conf

protocol = nfs

Na serwerze 172.26.9.184 uruchomimy rpcbind i leofs-gateway

sudo service rpcbind start
sudo service leofs-gateway restart

Na serwerze, gdzie uruchomiony jest leo_manager, stworzymy bucket dla NFS oraz wygenerujemy klucz do połączenia z NFS

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

Połączenie z NFS

sudo mkdir /mnt/leofs
## dla Linux - "sudo mount -t nfs -o nolock ://  "
sudo mount -t nfs -o nolock adres-ip-serwera-nfs-gdzie-masz-zainstalowany-gateway:/bucket/access_key_id/klucz-uzyskany-z-gen-nfs-mnt-key /mnt/leofs
sudo mount -t nfs -o nolock 172.26.9.184:/test/05236/bb5034f0c740148a346ed663ca0cf5157efb439f /mnt/leofs

Przeglądanie przestrzeni dyskowej przez klienta NFS

Przestrzeń dyskowa z uwzględnieniem, że każdy węzeł storage ma dysk 40GB (3 węzły działające, 1 węzeł podłączony):

df -hP
System plików                                                         Rozmiar  Używane  Dostępne  Użycie%  Zamontowane na
172.26.9.184:/test/05236/e7298032e78749149dd83a1e366afb328811c95b   60G  3.6G   57G   6% /mnt/leofs

Instalacja LeoFS z 6 węzłami storage.

Inwentarz (bez buildera):

# 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

Wynik leofs-adm status

Wynik 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
-------+----------------------+--------------+---------+----------------+----------------+----------------------------

Przestrzeń dyskowa zakładając, że każdy węzeł storage ma dysk 40GB (6 węzłów w trybie running):

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

Jeśli używane są 5 węzłów 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.183

df -hP
172.26.9.184:/test/05236/e7298032e78749149dd83a1e366afb328811c95b  100G  3.0G   97G   3% /mnt/leofs

Logi

Logi znajdują się w katalogach /usr/local/leofs/current/*/log

Kanał Telegram: SDS i klastry FS

Źródło: habr.com

Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS 🔥 Kup solidny hosting stron z ochroną przed DDoS, serwery VPS VDS | ProHoster