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. Файли будуть писатись послідовно на кожен сервер (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. У цьому випадку на кожному сервері тому будуть зберігатись аналогічні дані. Щось схоже на 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 томі дані будуть записуватись блоками на кожен із серверів що входить в том:
Тобто на відміну від 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 томів.
Кожен з файлів записується частинами на кожен сервер (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 організацій томів. Щось на зразок 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/
Цю файлову систему застосовують у хмарних обчисленнях, службах потокового медіа та у мережах постачання даних. (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/
Немає коментарів:
Дописати коментар