Translate

середу, 15 липня 2015 р.

GlusterFS: setup and configuration

GlusterFS — розподілена файлова система, що дозволяє організувати роботу розподіленого на кілька вузлів сховища, розгорнутого поверх штатних файлових систем POSIX, таких як Ext4, XFS і Btrfs, з використанням механізму FUSE (файлова система у просторі користувача). GlusterFS надає засоби автоматичного відновлення після збоїв і забезпечує практично необмежену масштабованість, завдяки відсутності прив'язки до централізованого серверу мета-даних (використовуються розподілені хеш-таблиці).

Цю файлову систему застосовують у хмарних обчисленнях, службах потокового медіа та у мережах постачання даних. (c) Wikipedia

Ключові особливості GlusterFS:

* Еластичність - томи зберігання даних абстраговані від заліза, на якому фізично знаходяться і можуть бути як-завгодно збільшені/зменшені/переміщені в межах фізичних систем.
* Відсутність окремого сервера метаданих - на відміну від інших розподілених файлових систем (наприклад, Lustre), GlusterFS не використовує окремого сервера для метаданих. Таким чином у неї відсутня єдина точка відмови.
* Масштабованість - досить просто збільшити або зменшити розмір файлової системи, без даунтайму. Може маштабуватись як у продуктивності так і обсягу даних.
* Висока доступність - у випадку правильного проектування тому, випадання окремого серверу не призведе до простою системи. Звісно, рівень доступності залежить від кількості реплікацій.
* Гнучкість - GlusterFS працює в просторі користувача (FUSE), тому не потрібно патчити ядро, додавати до нього модулі і т.д. Проте з іншої сторони, файлові системи в ядрі працюють швидше.
* Гео-реплікація - GlusterFS дозволяє синхронізувати всю систему збереження даних між різними датацентрами чи географічними місцями.

Налаштування GlusterFS достатньо просте. Конфігурацію будемо проводити на 3 віртуальних машинах: 2 сервера та 1 клієнт. До клієнта буде примонтований розділ GlusterFS, котрий буде попередньо створений на серверах.

192.168.1.51    server1
192.168.1.52    server2
192.168.1.53    client

За відсутності локального DNS-серверу, вищезгадані адреси слід додати до /etc/hosts кожної віртуальної машини:

# vim /etc/hosts
127.0.0.1       localhost
192.168.1.51    server1
192.168.1.52    server2
192.168.1.53    client

Розбиратись із роботою GlusterFS будемо на останній стабільній версії. На щастя, для Ubuntu є вже зібрані пакети. Тому додаємо офіційний ppa-репозиторій проекту і виконуємо перераховані дії на кожному із серверів server1 та server2:

# apt-get install python-software-properties
# add-apt-repository ppa:gluster/glusterfs-3.7
# apt-get update
# apt-get install glusterfs-server -у

Перевіряємо версію:

root@server1:/mnt# glusterfs -V
glusterfs 3.7.2 built on Jun 19 2015 16:33:23
Repository revision: git://git.gluster.com/glusterfs.git
Copyright (c) 2006-2013 Red Hat, Inc. <http://www.redhat.com/>
GlusterFS comes with ABSOLUTELY NO WARRANTY.
It is licensed to you under your choice of the GNU Lesser
General Public License, version 3 or any later version (LGPLv3
or later), or the GNU General Public License, version 2 (GPLv2),
in all cases as published by the Free Software Foundation.

Надалі краще за все заборонити автоматичне оновлення пакету glusterfs-server, особливо якщо ви не ризиковий хлопчина.

Створюємо кластер:

root@server1:~# gluster peer probe server2
peer probe: success.

Відповідно буде створений кластер із 2 довірених серверів в пулі: server2 та server1, на якому власне і запускалась команда. Конфігураційні файли пулу знаходяться на обох серверах.
Перевіряємо статус новоствореного кластеру на кожному із серверів:

root@server1:~# gluster peer status
Number of Peers: 1

Hostname: server2
Uuid: e8a3e6f9-ebbb-4fed-9154-31fe0692fd7a
State: Peer in Cluster (Connected)

root@server2:~# gluster peer status
Number of Peers: 1

Hostname: 192.168.1.51
Uuid: 727ede23-b953-42c7-bcce-83d51f14cc89
State: Peer in Cluster (Connected)

Конфігураційні файли пірів знаходяться за такою адресою:

root@server2:/etc/glusterfs# ls /var/lib/glusterd/peers/
727ede23-b953-42c7-bcce-83d51f14cc89

Тепер підключимось до клієнту та встановимо модуль для монтування GlusterFS:

root@client:~# apt-get install python-software-properties
root@client:~# add-apt-repository ppa:gluster/glusterfs-3.7
root@client:~# apt-get update
root@client:~# apt-get install glusterfs-client

Все ок, поки за планом.

GlusterFS підтримує 9 типів розподілу контенту об'єднаного в том (volume):

* Distributed (розподілений тип)
* Replicated (повторюваний)
* Striped (розділений по частинах)
* Distributed Striped (розподілений та розділений по частинах)
* Distributed Replicated (розподілений і реплікований)
* Distributed Striped Replicated
* Striped Replicated
* Dispersed
* Distributed Dispersed

В цій статті роглянемо перші 6 типів, про всі інші можна прочитати тут.

GlusterFS краще не використовувати для надання доступу до багатьох дрібних файлів між веб-серверами (наприклад, html-темплейти чи php-скрипти), особливо якщо програма (сайт і т.п.) відсилає багато API запитів для доступу до цих файлів.

Distributed том


Отже, перший тип тому - distributed. Файли будуть писатись послідовно на кожен сервер (brick) в томі:



Створимо його наступною командою:

root@server1:~# gluster volume create distributed transport tcp server1:/mnt/dist1 server2:/mnt/dist2 force
volume create: distributed: success: please start the volume to access data

Для створення distributed тому було використано 2 сервера із директоріями /mnt/dist1 та /mnt/dist2 на кожному із них.

Команду створення можна запускати на будь-якій ноді попередньо створеного кластеру. Директорії /mnt/dist{1,2} будуть створені автоматично, якщо попередньо були відсутніми.
Стартуємо том:

root@server1:~# gluster volume start distributed
volume start: distributed: success

В результаті з'явиться процес цього тому:

# ps aux | grep distributed
root      1039  0.0  5.9 778524 29936 ?        Ssl  12:21   0:01 /usr/sbin/glusterfsd -s server1 --volfile-id distributed.server1.mnt-dist1 -p /var/lib/glusterd/vols/distributed/run/server1-mnt-dist1.pid -S /var/run/gluster/6683627e216f18eafa609b61c8105b82.socket --brick-name /mnt/dist1 -l /var/log/glusterfs/bricks/mnt-dist1.log --xlator-option *-posix.glusterd-uuid=727ede23-b953-42c7-bcce-83d51f14cc89 --brick-port 49163 --xlator-option distributed-server.listen-port=49163

Наразі підключимось до client1 і спробуємо підмонтувати том:

root@client:~# mkdir /mnt/distrib
root@client:~# mount.glusterfs server1:/distributed /mnt/distrib/

root@client:~# df -hT
Filesystem           Type            Size  Used Avail Use% Mounted on
/dev/sda1            ext4             18G  1.9G   15G  12% /
none                 tmpfs           4.0K     0  4.0K   0% /sys/fs/cgroup
udev                 devtmpfs        235M  4.0K  235M   1% /dev
tmpfs                tmpfs            49M  408K   49M   1% /run
none                 tmpfs           5.0M     0  5.0M   0% /run/lock
none                 tmpfs           245M     0  245M   0% /run/shm
none                 tmpfs           100M     0  100M   0% /run/user
server1:/distributed fuse.glusterfs   35G  3.7G   29G  12% /mnt/distrib

Побачимо, як на практиці будуть розподілені файли по серверам. Запустимо генерацію 10 файлів в точці монтування:

root@client1:~# seq 1 10 | while read line; do echo "This is File${line}" > /mnt/distrib/file${line};done

На серверах тому можна побачити ці дерикторії:

root@server1:/mnt# ls -l /mnt/dist1
total 40
drwxr-xr-x  4 root root 4096 Jul  7 17:31 .
drwxr-xr-x  9 root root 4096 Jul  7 17:17 ..
-rw-r--r--  2 root root   15 Jul  7 17:31 file10
-rw-r--r--  2 root root   14 Jul  7 17:31 file3
-rw-r--r--  2 root root   14 Jul  7 17:31 file4
-rw-r--r--  2 root root   14 Jul  7 17:31 file7
-rw-r--r--  2 root root   14 Jul  7 17:31 file9

root@server2:/mnt# ls -l /mnt/dist
total 40
drwxr-xr-x  4 root root 4096 Jul  7 17:31 .
drwxr-xr-x  9 root root 4096 Jul  7 17:17 ..
-rw-r--r--  2 root root   14 Jul  7 17:31 file1
-rw-r--r--  2 root root   14 Jul  7 17:31 file2
-rw-r--r--  2 root root   14 Jul  7 17:31 file5
-rw-r--r--  2 root root   14 Jul  7 17:31 file6
-rw-r--r--  2 root root   14 Jul  7 17:31 file8

Тобто виходить, що файли рівномірно розділились по нодам кластеру: по 5 на кожну ноду. Тож при падінні одного із серверів лише частина файлів будуть доступними.

Replicated том


Наступний тип організації тому - replicated. У цьому випадку на кожному сервері тому будуть зберігатись аналогічні дані. Щось схоже на RAID1.


Replicated том створюється наступним чином:

root@server1:~# gluster volume create replicated replica 2 transport tcp server1:/mnt/repl1 server2:/mnt/repl2 force

root@server1:~# gluster volume start replicated
volume start: replicated: success

Кількість серверів в томі має відповідати к-ті рівнів репліки, інакше, можна отримати Distributed Replicated том.

Нічого незвичайного при монтуванні:

root@client:~# mkdir /mnt/replica
root@client:~# mount.glusterfs server1:/replicated /mnt/replica/

root@client:~# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              18G  1.9G   15G  12% /
none                  4.0K     0  4.0K   0% /sys/fs/cgroup
udev                  235M  4.0K  235M   1% /dev
tmpfs                  49M  412K   49M   1% /run
none                  5.0M     0  5.0M   0% /run/lock
none                  245M     0  245M   0% /run/shm
none                  100M     0  100M   0% /run/user
server1:/replicated    18G  1.9G   15G  12% /mnt/replica

Розмір розділу в 2 рази менший за попередній тип тому, адже дані на кожному із серверів однакові.

Проведемо аналогічне тестування - запишемо в точку монтування /mnt/replica/ на клієні 10 файлів:

root@client1:~# seq 1 10 | while read line; do echo "This is File${line}" > /mnt/replica/file${line};done

Та подивимось за розподілом файлів на репліках:

root@server1:/mnt/repl1# ls -la
total 100
drwxr-xr-x  4 root root 4096 Jul  7 17:48 .
drwxr-xr-x  9 root root 4096 Jul  7 17:17 ..
-rw-r--r--  2 root root   14 Jul  7 17:48 file1
-rw-r--r--  2 root root   15 Jul  7 17:48 file10
-rw-r--r--  2 root root   14 Jul  7 17:48 file2
-rw-r--r--  2 root root   14 Jul  7 17:48 file3
-rw-r--r--  2 root root   14 Jul  7 17:48 file4
-rw-r--r--  2 root root   14 Jul  7 17:48 file5
-rw-r--r--  2 root root   14 Jul  7 17:48 file6
-rw-r--r--  2 root root   14 Jul  7 17:48 file7
-rw-r--r--  2 root root   14 Jul  7 17:48 file8
-rw-r--r--  2 root root   14 Jul  7 17:48 file9

root@server2:/mnt/repl2# ls -la
total 100
drwxr-xr-x  4 root root 4096 Jul  7 17:48 .
drwxr-xr-x  9 root root 4096 Jul  7 17:17 ..
-rw-r--r--  2 root root   14 Jul  7 17:48 file1
-rw-r--r--  2 root root   15 Jul  7 17:48 file10
-rw-r--r--  2 root root   14 Jul  7 17:48 file2
-rw-r--r--  2 root root   14 Jul  7 17:48 file3
-rw-r--r--  2 root root   14 Jul  7 17:48 file4
-rw-r--r--  2 root root   14 Jul  7 17:48 file5
-rw-r--r--  2 root root   14 Jul  7 17:48 file6
-rw-r--r--  2 root root   14 Jul  7 17:48 file7
-rw-r--r--  2 root root   14 Jul  7 17:48 file8
-rw-r--r--  2 root root   14 Jul  7 17:48 file9

Як бачимо, файли на кожному із серверів ідентичні.

Stripped том


В Stripped томі дані будуть записуватись блоками на кожен із серверів що входить в том:


Тобто на відміну від Distributed тому, файли на серверах будуть зберігатись шматками. При падінні одного із серверів дані не будуть доступними.

Створюємо том із двох серверів - server1 та server2:

root@server1:~# gluster volume create striped stripe 2 transport tcp server1:/mnt/strip1 server2:/mnt/strip2 force
root@server1:~# gluster volume start striped

Значення stripe має бути рівним кількості серверів. Примонтуємо том на клієнті:

root@client:/mnt# mkdir /mnt/strip
root@client:/mnt# mount.glusterfs server1:/striped /mnt/strip/

Розмір диску складається із суми розмірів кожного диску сервера в кластері:

root@client:/mnt# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1              18G  1.9G   15G  12% /
none                  4.0K     0  4.0K   0% /sys/fs/cgroup
udev                  235M  4.0K  235M   1% /dev
tmpfs                  49M  416K   49M   1% /run
none                  5.0M     0  5.0M   0% /run/lock
none                  245M     0  245M   0% /run/shm
none                  100M     0  100M   0% /run/user
server1:/striped       35G  3.7G   29G  12% /mnt/strip

Запишемо 300 МБ в точку монтування в /mnt/strip:

root@client:/mnt# dd if=/dev/urandom of=test2.bin bs=30M count=10
10+0 records in
10+0 records out
314572800 bytes (315 MB) copied, 21.1203 s, 14.9 MB/s

root@client:/mnt# dd if=/dev/urandom of=test1.bin bs=30M count=10
10+0 records in
10+0 records out
314572800 bytes (315 MB) copied, 21.0664 s, 14.9 MB/s

root@client:/mnt# cp test* /mnt/strip/

root@client:/mnt# ls -lh /mnt/strip/
total 600M
-rw-r--r-- 1 root root 300M Jul  7 17:55 test1.bin
-rw-r--r-- 1 root root 300M Jul  7 17:55 test2.bin

На кожен сервер із тому буде записано лише по 150 МБ кожного файлу:

root@server1:/mnt/strip1# ls -lh
total 301M
-rw-r--r-- 2 root root 150M Jul  7 17:55 test1.bin
-rw-r--r-- 2 root root 150M Jul  7 17:55 test2.bin

root@server2:/mnt/strip2# ls -lh
total 301M
-rw-r--r-- 2 root root 150M Jul  7 17:55 test1.bin
-rw-r--r-- 2 root root 150M Jul  7 17:55 test2.bin

Distributed Striped том


Distributed Striped том - це комбінація Distributed та Striped томів.


Кожен з файлів записується частинами на кожен сервер (brick) і таких груп двоє. Тобто є дві Striped групи, котрі між собою в distributed режимі.

Виглядатиме команда на створення такого тому буде так:

root@server1:/mnt# gluster volume create distributed-striped stripe 2 transport tcp server1:/mnt/dist-strip1 server2:/mnt/dist-strip3 server1:/mnt/dist-strip2 server2:/mnt/dist-strip4 force
volume create: distributed-striped: success: please start the volume to access data

root@server1:/mnt# gluster volume start distributed-striped
volume start: distributed-striped: success

Щоправда, в ідеалі, кожна директорія (brick) має лежати на окремому сервері чи хоча б окремому фізичному диску. Приклад приведено лише для навчальних цілей.

Порядок перерахування серверів, при створенні тому, важливий: в першій та другій директорії будуть зберігатись перша частина файлів (при stripe=2) і, відповідно, третій та четвертий - друга частина файлів.

З монтуванням все стандартно, нічого нового:

root@client:/mnt# mkdir /mnt/distrib-strip
root@client:/mnt# mount.glusterfs server1:/distributed-striped /mnt/distrib-strip/

Як і в попрередніх прикладах спробуємо розібратись як розподіляються файли по директоріях з яких було створено Distributed Striped том.
Для цього скопіюємо два файли в точку монтування на client-машині:

root@client:/mnt# cp test* /mnt/distrib-strip/

root@client:/mnt/distrib-strip# ls -lh
total 600M
-rw-r--r-- 1 root root 300M Jul  7 18:10 test1.bin
-rw-r--r-- 1 root root 300M Jul  7 18:10 test2.bin

І перевіримо що в директоріях на server1, server2:

root@server2:/mnt# ls -lh dist-strip*
dist-strip3:
total 151M
-rw-r--r-- 2 root root 150M Jul  7 18:10 test1.bin

dist-strip4:
total 151M
-rw-r--r-- 2 root root 150M Jul  7 18:10 test2.bin

root@server1:/mnt# ls -lh dist-strip*
dist-strip1:
total 151M
-rw-r--r-- 2 root root 150M Jul  7 18:10 test1.bin

dist-strip2:
total 151M
-rw-r--r-- 2 root root 150M Jul  7 18:10 test2.bin

Отже файли були поділені навпіл і розміщені в кожній директорії.

Distributed Replicated


Останній тип організації тому про який піде мова - Distributed Replicated. Це відповідно суміш Distributed та Replicated організацій томів. Щось на зразок RAID10.


Тобто дві групи серверів (директорій/дисків) знаходиться в режимі Replicated, які в свою чергу в режимі Distributed.

root@server1:/mnt# gluster volume create distributed-replicated replica 2 transport tcp server1:/mnt/dist-repl1 server2:/mnt/dist-repl3 server1:/mnt/dist-repl2 server2:/mnt/dist-repl4 force
volume create: distributed-replicated: success: please start the volume to access data

root@server1:/mnt# gluster volume start distributed-replicated
volume start: distributed-replicated: success

Порядок директорій в команді створення тому теж має значення. Знову ж, пари директорій у моєму випадку знаходяться на одному хості, для продакшену так робити не слід.

Примонтуємо том до клієнту та перевіримо логіку запису даних на практиці:

root@client1:~# mkdir /mnt/distrib-repl
root@client1:~# mount.glusterfs server1:/distributed-replicated /mnt/distrib-repl/

root@client:/mnt# df -h
Filesystem                       Size  Used Avail Use% Mounted on
/dev/sda1                         18G  2.5G   14G  15% /
none                             4.0K     0  4.0K   0% /sys/fs/cgroup
udev                             235M  4.0K  235M   1% /dev
tmpfs                             49M  416K   49M   1% /run
none                             5.0M     0  5.0M   0% /run/lock
none                             245M     0  245M   0% /run/shm
none                             100M     0  100M   0% /run/user
server1:/distributed-replicated   35G  4.9G   28G  15% /mnt/distrib-repl

root@server1:/mnt# ls /mnt/dist-repl*
/mnt/dist-repl1:
file10  file3  file4  file7  file9

/mnt/dist-repl2:
file1  file2  file5  file6  file8
root@server1:/mnt#

root@server2:/mnt/dist2# ls /mnt/dist-repl*
/mnt/dist-repl3:
file10  file3  file4  file7  file9

/mnt/dist-repl4:
file1  file2  file5  file6  file8
root@server2:/mnt/dist2#

Виходить, що групи директорій (dist-repl1, dist-repl2) та (dist-repl3, dist-repl4) між собою в режимі реплікації, а dist-repl1 та dist-repl2 чи dist-repl3 та dist-repl4 - між собою в режимі розподілу данних.

Переглянути інформацію про існуючі томи можна наступним чином:

root@server2:/mnt# gluster volume info

Volume Name: distributed
Type: Distribute
Volume ID: 71e94050-c3f9-4682-a4fc-52363e472346
Status: Started
Number of Bricks: 2
Transport-type: tcp
Bricks:
Brick1: server1:/mnt/dist1
Brick2: server2:/mnt/dist2
Options Reconfigured:
performance.readdir-ahead: on
...
Volume Name: distributed-replicated
Type: Distributed-Replicate
Volume ID: a738f952-0bb2-41b3-975d-bc94a396e83f
Status: Started
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: server1:/mnt/dist-repl1
Brick2: server2:/mnt/dist-repl3
Brick3: server1:/mnt/dist-repl2
Brick4: server2:/mnt/dist-repl4
Options Reconfigured:
performance.readdir-ahead: on

Тот можна побачити і тип створеного тому і диски/сервери, що входять в його склад
Статус роботи томів (доступність складових дисків, використання мережевих портів і т.п.) можна побачити, виконавши команду нижче:

root@server1:~# gluster volume status
Status of volume: distributed
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick server1:/mnt/dist1                    49163     0          Y       1039
Brick server2:/mnt/dist2                    49163     0          Y       1056
NFS Server on localhost                     2049      0          Y       1024
NFS Server on server2                       2049      0          Y       1016

Task Status of Volume distributed
------------------------------------------------------------------------------
There are no active volume tasks

Status of volume: distributed-replicated
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick server1:/mnt/dist-repl1               49161     0          Y       1034
Brick server2:/mnt/dist-repl3               49161     0          Y       1046
Brick server1:/mnt/dist-repl2               49162     0          Y       1044
Brick server2:/mnt/dist-repl4               49162     0          Y       1051
NFS Server on localhost                     2049      0          Y       1024
Self-heal Daemon on localhost               N/A       N/A        N       N/A
NFS Server on server2                       2049      0          Y       1016
Self-heal Daemon on server2                 N/A       N/A        N       N/A
...

З виводу команди можна здогадатись, що GlusterFS-том також можна примонтувати як NFS-шару, яка, подейкують, працює навіть дещо з вищою швидкістю. Проте в такому разі необхідно продумати логіку перемикання на робочий сервер у разі, якщо саме цей примонтований диск відпаде (failover). У випадку ж fuse-монтування GlusterFS (саме класичний варіант монтування і приведений у статті) про останнє попіклується сам Gluster-кластер.

Для більш детальної інформації необхідно попередньо запустити профілювання:

root@server1:~# sudo gluster volume profile distributed start
Starting volume profile on distributed has been successful

root@server1:~# sudo gluster volume profile distributed info
Brick: server1:/mnt/dist1
-------------------------
Cumulative Stats:

    Duration: 23711 seconds
   Data Read: 0 bytes
Data Written: 0 bytes

Interval 0 Stats:

    Duration: 23711 seconds
   Data Read: 0 bytes
Data Written: 0 bytes

Brick: server2:/mnt/dist2
-------------------------
Cumulative Stats:
   Block Size:                  8b+               32768b+              131072b+
 No. of Reads:                    0                     4                 15624
No. of Writes:                   10                     3                 11718

 %-latency   Avg-latency   Min-Latency   Max-Latency   No. of calls         Fop
 ---------   -----------   -----------   -----------   ------------        ----
      0.00       0.00 us       0.00 us       0.00 us              1      FORGET
      0.00       0.00 us       0.00 us       0.00 us             13     RELEASE
      0.00       0.00 us       0.00 us       0.00 us             22  RELEASEDIR

    Duration: 33715 seconds
   Data Read: 2048000000 bytes
Data Written: 1536000140 bytes

Interval 0 Stats:
   Block Size:                  8b+               32768b+              131072b+
 No. of Reads:                    0                     4                 15624
No. of Writes:                   10                     3                 11718

 %-latency   Avg-latency   Min-Latency   Max-Latency   No. of calls         Fop
 ---------   -----------   -----------   -----------   ------------        ----
      0.00       0.00 us       0.00 us       0.00 us              1      FORGET
      0.00       0.00 us       0.00 us       0.00 us             13     RELEASE
      0.00       0.00 us       0.00 us       0.00 us             22  RELEASEDIR

    Duration: 33715 seconds
   Data Read: 2048000000 bytes
Data Written: 1536000140 bytes

Іноді необхідно видалити існуючі диски і це можна зробити, виконавши наступне.
Спочатку відмонтовуємо його від клієнту:

root@client1:~# umount /mnt/distrib

Зупиняємо необхідний Volume:

root@server1:/mnt# gluster volume stop distributed
Stopping volume will make its data inaccessible. Do you want to continue? (y/n) y
volume stop: distributed: success

Тепер його можна видалити:

root@server1:/mnt# gluster volume delete distributed
Deleting volume will erase all information about the volume. Do you want to continue? (y/n) y
volume delete: distributed: success

Мабуть слід також згадати як можна змінити дефолтні налаштування GlusterFS. Для цього необхідно редагувати наступний конфігураційний файл:

root@server2:/# vim /etc/glusterfs/glusterd.vol
volume management
    type mgmt/glusterd
    option working-directory /var/lib/glusterd
    option transport-type socket,rdma
    option transport.socket.keepalive-time 10
    option transport.socket.keepalive-interval 2
    option transport.socket.read-fail-log off
    option ping-timeout 30
#   option base-port 49152
end-volume

Також опції кластеру можна редагувати командами. Так можна установити розмір кешу на читання:

# gluster volume set volume_name performance.cache-size 1GB

А так дозволити монтувати лише певним клієнтам чи групі клієнтів:

# gluster volume set volume_name auth.allow 10.1.1.*,10.5.5.1

Про більшість опцій можна почитати за посиланням http://www.gluster.org/community/documentation/index.php/Gluster_3.2:_Tuning_Volume_Options

Нарешті приведу зовсім базове тестування швидкості GlusterFS vs NFS vs Local disk:

Отже швидкість запису/читання на на локальний диск наступна:

# write
root@server1:/home/ubuntu/nfs-test# dd if=/dev/zero of=testfile bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 16.7577 s, 30.6 MB/s
root@server1:/home/ubuntu/nfs-test# dd if=/dev/zero of=testfile bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 18.3227 s, 27.9 MB/s
root@server1:/home/ubuntu/nfs-test# dd if=/dev/zero of=testfile bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 18.323 s, 27.9 MB/s

# read
root@server1:/home/ubuntu/nfs-test# dd if=testfile of=/dev/null bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 3.5359 s, 145 MB/s
root@server1:/home/ubuntu/nfs-test# dd if=testfile of=/dev/null bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 2.74104 s, 187 MB/s
root@server1:/home/ubuntu/nfs-test# dd if=testfile of=/dev/null bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 2.48031 s, 206 MB/s

Для кожного випадку будемо обирати розмір блоку рівним к-ті оперативній памяті, щоб зменшити вплив кешування.

Швидкість читання/запису для NFS-шари, що примонтована до віртуальної машини client:

# write
root@client:/mnt/nfs-test# dd if=/dev/zero of=testfile bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 16.9076 s, 30.3 MB/s
root@client:/mnt/nfs-test# dd if=/dev/zero of=testfile bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 19.0835 s, 26.8 MB/s
root@client:/mnt/nfs-test# dd if=/dev/zero of=testfile bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 17.7829 s, 28.8 MB/s

# read
root@client:/mnt/nfs-test# dd if=testfile of=/dev/null bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 9.80139 s, 52.2 MB/s
root@client:/mnt/nfs-test# dd if=testfile of=/dev/null bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 9.35204 s, 54.7 MB/s
root@client:/mnt/nfs-test# dd if=testfile of=/dev/null bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 9.44664 s, 54.2 MB/s

NFS-сервер знаходиться на server1.

Та швидкість дискового distributed-кластеру GlusterFS :

# write
root@client:/mnt/distrib# dd if=/dev/zero of=testfile bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 18.0225 s, 28.4 MB/s
root@client:/mnt/distrib# dd if=/dev/zero of=testfile bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 17.8103 s, 28.7 MB/s
root@client:/mnt/distrib# dd if=/dev/zero of=testfile bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 18.3527 s, 27.9 MB/s

# read
root@client:/mnt/distrib# dd if=testfile of=/dev/null bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 16.615 s, 30.8 MB/s
root@client:/mnt/distrib# dd if=testfile of=/dev/null bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 18.1493 s, 28.2 MB/s
root@client:/mnt/distrib# dd if=testfile of=/dev/null bs=512MB count=1
1+0 records in
1+0 records out
512000000 bytes (512 MB) copied, 16.4465 s, 31.1 MB/s

Отже в даному випадку швидкість GlusterFS на запис майже аналогічна швидкості NFS на запис, з читанням все достатньо гірше. Зрозуміло, що для швидкої роботи GlusterFS необхідні швидкі диски та хороша мережа (мінімум, гігабітний канал)

Посилання:
http://sysadm.pp.ua/linux/glusterfs-setup.html
http://www.admin-magazine.com/HPC/Articles/GlusterFS
https://www.howtoforge.com/how-to-install-glusterfs-with-a-replicated-volume-over-2-nodes-on-ubuntu-14.04
https://www.digitalocean.com/community/tutorials/how-to-create-a-redundant-storage-pool-using-glusterfs-on-ubuntu-servers
https://community.rackspace.com/general/f/34/t/6633
http://www.rackspace.com/knowledge_center/article/getting-started-with-glusterfs-considerations-and-installation
https://joejulian.name/blog/optimizing-web-performance-with-glusterfs/

Немає коментарів:

Дописати коментар