S3, NFS ашигладаг үйлчлүүлэгчидтэй нийцтэй, тархсан гэмтэлд тэсвэртэй LeoFS объектын санах ойг суурилуулах

Дагуу Нээлттэй сүлжээ: LeoFS — тархсан гэмтэлд тэсвэртэй объект хадгалах LeoFS, Amazon S3 API болон REST-API ашигладаг үйлчлүүлэгчидтэй нийцтэй, мөн NFS серверийн горимыг дэмждэг. Жижиг, маш том объектуудыг хоёуланг нь хадгалах оновчлолууд байдаг, суурилуулсан кэш механизм байдаг бөгөөд мэдээллийн төвүүдийн хооронд хадгалалтыг хуулбарлах боломжтой. Төслийн зорилтууд нь давхардсан хуулбарыг дахин давтах замаар 99.9999999% найдвартай байдалд хүрэх, нэг алдаа дутагдлыг арилгах явдал юм. Төслийн кодыг Эрлан хэл дээр бичсэн.

LeoFS нь гурван бүрэлдэхүүн хэсгээс бүрдэнэ.

  • LeoFS хадгалах сан — объект, мета өгөгдлийг нэмэх, сэргээх, устгах үйлдлүүдийг гүйцэтгэдэг, хуулбарлах, сэргээх, үйлчлүүлэгчийн хүсэлтийг дараалалд оруулах үүрэгтэй.
  • LeoFS гарц — HTTP хүсэлтүүдэд үйлчилж, REST-API эсвэл S3-API ашиглан үйлчлүүлэгчид хариултыг дахин чиглүүлж, санах ой болон дискэн дэх хамгийн хэрэгцээтэй өгөгдлийг кэшлэх боломжийг олгодог.
  • LeoFS менежер — LeoFS Gateway болон LeoFS Storage зангилааны ажиллагааг хянаж, зангилааны төлөвийг хянаж, шалгах нийлбэрийг шалгана. Өгөгдлийн бүрэн бүтэн байдал, өндөр хадгалалтын хүртээмжийг баталгаажуулдаг.

Энэ нийтлэлд бид Leofs-ийг ansible-playbook ашиглан суулгаж, S3, NFS-г тестлэх болно.

Хэрэв та албан ёсны тоглоомын номыг ашиглан LeoFS суулгахыг оролдвол янз бүрийн алдаа гарах болно. 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 [email protected]
172.26.9.181 [email protected]
172.26.9.182 [email protected]
172.26.9.183 [email protected]

[leo_gateway]
172.26.9.180 [email protected]
172.26.9.184 [email protected]

[leofs_nodes:children]
leo_manager_0
leo_manager_1
leo_gateway
leo_storage

Серверийн бэлтгэл

Selinux-г идэвхгүй болгож байна. Олон нийт LeoFS-д зориулсан Selinux бодлогыг бий болгоно гэж найдаж байна.

    - 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 үүсгэж, дугуйны бүлэгт нэмэх

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

Залруулсан Ansible тоглоомын бүрэн хувилбарыг эндээс олж болно: 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

Анхан шатны болон хоёрдогчийг ansible-playbook логуудаас харж болно

S3, NFS ашигладаг үйлчлүүлэгчидтэй нийцтэй, тархсан гэмтэлд тэсвэртэй LeoFS объектын санах ойг суурилуулах

S3, NFS ашигладаг үйлчлүүлэгчидтэй нийцтэй, тархсан гэмтэлд тэсвэртэй LeoFS объектын санах ойг суурилуулах

Гаралт нь нэг иймэрхүү байх болно

 [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    | [email protected]      | running      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | [email protected]      | running      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | [email protected]      | running      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:47 +0000
  S    | [email protected]      | attached     |         |                |                | 2019-12-05 10:33:58 +0000
  G    | [email protected]      | running      |         | a0314afb       | a0314afb       | 2019-12-05 10:33:49 +0000
  G    | [email protected]      | running      |         | 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

Хувин үүсгэх

Хувин хийсэн

leofs-adm add-bucket leofs 9c2615f32e81e6a1caf5
OK

Хувин жагсаалт:

 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 Proxy server name Gateway серверийн IP-г зааж өгнө үү

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'

Хэрэв та алдаа гарвал ERROR: S3 алдаа: 403 (Access Denied): Хандалтыг хориглосон:

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

Дараа нь та s3cmd тохиргооны signature_v2-г Үнэн болгож өөрчлөх хэрэгтэй. Үүнд дэлгэрэнгүй асуудал.

Хэрэв signature_v2 худал бол дараах алдаа гарна:

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

Ачааллын туршилт

1 ГБ файл үүсгэ

fallocate -l 1GB 1gb

Үүнийг Leofs-д байршуулна уу

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

Статистик

leofs-adm du 1 зангилаа:

leofs-adm du [email protected]
 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: ____-__-__ __:__:__

Дүгнэлт нь мэдээлэл сайтай биш гэдгийг бид харж байна.

Энэ файл хаана байгааг харцгаая.
leofs-adm whereis leofs/1gb

leofs-adm whereis leofs/1gb
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
 del?  |         node         |             ring address             |    size    |   checksum   |  has children  |  total chunks  |     clock      |             when            
-------+----------------------+--------------------------------------+------------+--------------+----------------+----------------+----------------+----------------------------
       | [email protected]      | 657a9f3a3db822a7f1f5050925b26270     |    976563K |   a4634eea55 | true           |             64 | 598f2aa976a4f  | 2019-12-05 10:48:15 +0000
       | [email protected]      | 657a9f3a3db822a7f1f5050925b26270     |    976563K |   a4634eea55 | true           |             64 | 598f2aa976a4f  | 2019-12-05 10:48:15 +0000

NFS-г идэвхжүүл

Бид Leo Gateway 172.26.9.184 сервер дээр NFS-г идэвхжүүлдэг.

Сервер болон клиент дээр 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 ажиллаж байгаа сервер дээр NFS-д зориулсан хувин үүсгэж, NFS-д холбогдох түлхүүр үүсгэнэ үү.

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

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

NFS клиентээр дамжуулан дискний зайг харах

Хадгалах цэг бүр 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

6 хадгалах зангилаа бүхий LeoFS суурилуулах.

Бараа материал (барилгачингүй):

# 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 [email protected]
172.26.9.179 [email protected]
172.26.9.181 [email protected]
172.26.9.182 [email protected]
172.26.9.183 [email protected]
172.26.9.185 [email protected]

[leo_gateway]
172.26.9.180 [email protected]
172.26.9.184 [email protected]

[leofs_nodes:children]
leo_manager_0
leo_manager_1
leo_gateway
leo_storage

Гаралтын leofs-adm статус

Гаралтын 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    | [email protected]      | running      |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  S    | [email protected]      | running      |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  S    | [email protected]      | running      |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:30 +0000
  S    | [email protected]      | running      |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  S    | [email protected]      | running      |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  S    | [email protected]      | running      |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:29 +0000
  G    | [email protected]      | running      |         | d8ff465e       | d8ff465e       | 2019-12-06 05:18:31 +0000
  G    | [email protected]      | running      |         | 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 [email protected]
172.26.9.179 [email protected]
172.26.9.181 [email protected]
172.26.9.182 [email protected]
172.26.9.183 [email protected]

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

Бүртгэл

Бүртгэлүүд нь лавлах хэсэгт байрладаг /usr/local/leofs/current/*/log

Телеграм суваг: SDS болон Cluster FS

Эх сурвалж: www.habr.com

сэтгэгдэл нэмэх