Pull to refresh

Тестируем распределение контента в GlusterFS

Reading time 11 min
Views 40K
Нашел несколько статей на хабре о базовой установке и настройке GlusterFS, но не нашел ничего о типах распределения контента, которые он поддерживает и с которыми я долго игрался. О чем и пойдет речь в данной статье.
image

GlusterFS — это очень удобная и простая в использовании и настройке распределённая файловая система, которая работает в пользовательском пространстве используя FUSE технологию, т.е. работает поверх основной файловой системы. Для установки и настройки будем использовать ОС Ubuntu 12.04.

Будем настраивать кластер из двух серверов и монтировать (тестить) на одном клиенте. Имеем следующие настройки:
IP
Hostname
Short name
192.168.1.100 server1.example.com server1
192.168.1.101 server2.example.com server2
192.168.1.102 client1.example.com client1


1. Общие настройки


Сначала, для удобства, добавим все адреса в хосты на каждой машине.
root@server1:~# cat /etc/hosts
127.0.0.1       localhost
192.168.1.100   server1.example.com     server1
192.168.1.101   server2.example.com     server2
192.168.1.102   client1.example.com     client1

root@server2:~# cat /etc/hosts
127.0.0.1       localhost
192.168.1.100   server1.example.com     server1
192.168.1.101   server2.example.com     server2
192.168.1.102   client1.example.com     client1

root@client1:~# cat /etc/hosts
127.0.0.1       localhost
192.168.1.100   server1.example.com     server1
192.168.1.101   server2.example.com     server2
192.168.1.102   client1.example.com     client1


Если используется firewall, нужно открыть TCP порты 111, 24007-24050 на всех машинах, которые выступают в роле серверов (двух, в нашем случаи).

2. Настройка серверной части (кластера)


На всех серверах нужно установить gluster-server. На данный момент самая свежая версия – 3.5.2. Установку будем делать из ppa репозиториев.
root@server1:~#apt-get install python-software-properties
root@server1:~#add-apt-repository ppa:semiosis/ubuntu-glusterfs-3.5
root@server1:~#apt-get update
root@server1:~#apt-get install glusterfs-server -у

root@server2:~#apt-get install python-software-properties
root@server2:~#add-apt-repository ppa:semiosis/ubuntu-glusterfs-3.5
root@server2:~#apt-get update
root@server2:~# apt-get install glusterfs-server -у

Теперь подключаемся на один из серверов и создаем кластер.
root@server1:~# gluster peer probe server2.example.com
Probe successful


Проверим статус:
root@server1:~# gluster peer status
Number of Peers: 1

Hostname: server2.example.com
Uuid: 0f3aa4f4-f9dd-4cd2-a7a5-126606fbab33
State: Peer in Cluster (Connected) 


Как видим, server2 был добавлен в кластер и его статус – Connected. Так же можно убедиться, что на втором сервере все ок.
root@server2:~# gluster peer status
Number of Peers: 1

Hostname: 192.168.1.100
Uuid: ae4e6766-787f-4d0c-8b96-8fc9523ef346
State: Peer in Cluster (Connected) 


GlusterFS поддерживает 5 типов распределения контента объединённого в volume:
  • Distributed (распределённый)
  • Replicated (реплицируемый)
  • Striped (разделенный по частям)
  • Distributed Striped (распределённый и разделенный по частям)
  • Distributed Replicated (распределённый и реплицируемый)


Сначала настроим отдельно каждый тип распределения контента и потом смонтируем все 5 volum-ов на клиенте для тестов.

2.1 Настройка distributed volume


При данной настройке данные будут распределяться в случайном порядке между каждой папкой, которая входив в volume.
Создадим на первом сервере паки dist1, dist2, на втором – dist3, dist4.
root@server1:~# mkdir /mnt/dist{1,2}
root@server2:~# mkdir /mnt/dist{3,4}

Теперь можно создать и стартануть volume.
root@server1:~# gluster volume create distributed transport tcp server1:/mnt/dist1 server1:/mnt/dist2 server2:/mnt/dist3 server2:/mnt/dist4 force        
Creation of volume distributed has been successful. Please start the volume to access data.
root@server1:~# gluster volume start distributed
Starting volume distributed has been successful


2.2 Настройка replicated volume


При данной настройке данные будут зеркально (как RAID1) копироваться между каждой папкой (сервером), которая входив в volume. Разумеется, количество папок(серверов) входящих в volume должно быть кратно реплике(replica).
Создадим на первом сервере паки repl1, repl2, на втором – repl3, repl4.
root@server1:~# mkdir /mnt/repl{1,2}
root@server2:~# mkdir /mnt/repl{3,4}


Теперь можно создать и стартануть volume.
root@server1:~# gluster volume create replicated replica 4 transport tcp server1:/mnt/repl1 server2:/mnt/repl3 server1:/mnt/repl2 server2:/mnt/repl4 force                   
Multiple bricks of a replicate volume are present on the same server. This setup is not optimal.
Do you still want to continue creating the volume?  (y/n) y
volume create: replicated: success: please start the volume to access data
root@server1:~# gluster volume start replicated
volume start: replicated: success 


В данном случаи все файлы будут реплицироваться на все 4 папки. Т.е. во всех папках будет находиться один и тот же контент.

2.3 Настройка striped volume


При данной настройке файлы будут разбиваться на части и каждый кусок будет храниться в каждой из папок которая входит в volume. Такой тип распределения контента подходит для хранение емкостных данных с очень большим размером (видеоконтент в хорошем качестве, к примеру). Разумеется, количество папок входящих в volume должно быть эквивалентно значению stripe. Т.е. если у нас 5 серверов, то файл будет разбиваться на 5 частей и каждый его кусочек будет храниться на всех 5 серверах.
Создадим на первом сервере паки strip1, strip2, на втором – strip3, strip4.
root@server1:~# mkdir /mnt/strip{1,2}
root@server2:~# mkdir /mnt/strip{3,4}


Теперь можно создать и стартануть volume.
root@server1:~# gluster volume create striped stripe 4 transport tcp server1:/mnt/strip1 server1:/mnt/strip2 server2:/mnt/strip3 server2:/mnt/strip4 force                   
Creation of volume striped has been successful. Please start the volume to access data.
root@server1:~# gluster volume start striped
Starting volume striped has been successful 


В данном случаи на каждом из 4-х серверов(папок) будет находиться по одному кусочку залитого файла.

2.4 Настройка distributed striped volume


При данной настройке файлы будут разбиваться на части и куски файлов будут распределяться по папкам и храниться в одной из них. Разумеется, количество папок входящих в volume должно быть кратно значению stripe. Т.е. если у нас 8 серверов и значение stripe равно 4, то файлы будут разбиваться на 4 части и храниться или на первых 4-х серверах или на следующей 4-ке серверов. Так же само, если у нас 4 сервера и stripe равно 2, то файлы будут разбиваться на 2 части и храниться на первых 2-х или на следующих 2-х серверах.
Создадим на первом сервере паки dist-strip1, dist-strip2, на втором – dist-strip3, dist-strip4.
root@server1:~# mkdir /mnt/dist-strip{1,2}
root@server2:~# mkdir /mnt/dist-strip{3,4}


Теперь можно создать и стартануть volume. При этом, очередность серверов играет очень большую роль: части файлов будут храниться на первой паре серверов (при stripe=2), или на первой четверке серверов (при stripe=4), а распределяться контент будет между первой и второй парой или четверкой и т.п.
root@server1:~# 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
Creation of volume distributed-striped has been successful. Please start the volume to access data.
root@server1:~# gluster volume start distributed-striped
Starting volume distributed-striped has been successful 


2.5 Настройка distributed replicated volume


При данной настройке данные будут распределяться в случайном порядке между папками и каждая папка имеет свою зеркальную копию. Разумеется, количество папок входящих в volume должно быть кратно значению replica. Т.е. если у нас 4 сервера и значение replica равно 2, то файлы будут распределяться по 2-м серверам в произвольном порядке, а 2 оставшихся сервера будут хранить идентичную копию контента первых двух. Если у нас 8 серверов и replica равно 4, то у нас будет одно зеркало из 4-х серверов.
Создадим на первом сервере паки dist-repl1, dist-repl2, на втором – dist-repl3, dist-repl4.
root@server1:~# mkdir /mnt/dist-repl{1,2}
root@server2:~# mkdir /mnt/dist-repl{3,4}


Теперь можно создать и стартануть volume. При этом, очередность серверов играет очень большую роль: первая пара(четверка) серверов записана последовательно составляет одну реплику. Т.е. если у нас 8 серверов и replica равна 4, то первые 4 сервера будут иметь один одинаковый контент, а вторая четверка будет иметь другой одинаковый контент, и т.п.

root@server1:~# 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    
Creation of volume distributed-replicated has been successful. Please start the volume to access data.
root@server1:~# gluster volume start distributed-replicated
Starting volume distributed-replicated has been successful 


Теперь проверим какие volum-ы мы создали.
root@server1:~# gluster volume info
 
Volume Name: distributed
Type: Distribute
Volume ID: 01622619-fd93-4ee1-85ad-ca8cf1d85f7e
Status: Started
Number of Bricks: 4
Transport-type: tcp
Bricks:
Brick1: server1:/mnt/dist1
Brick2: server1:/mnt/dist2
Brick3: server2:/mnt/dist3
Brick4: server2:/mnt/dist4
 
Volume Name: replicated
Type: Replicate
Volume ID: 67afcb89-7e5d-4a02-b4ac-0c2de7cd97be
Status: Started
Number of Bricks: 1 x 4 = 4
Transport-type: tcp
Bricks:
Brick1: server1:/mnt/repl1
Brick2: server2:/mnt/repl3
Brick3: server1:/mnt/repl2
Brick4: server2:/mnt/repl4
 
Volume Name: striped
Type: Stripe
Volume ID: e9ef42bf-8265-4973-85de-4cafd2a68fec
Status: Started
Number of Bricks: 1 x 4 = 4
Transport-type: tcp
Bricks:
Brick1: server1:/mnt/strip1
Brick2: server1:/mnt/strip2
Brick3: server2:/mnt/strip3
Brick4: server2:/mnt/strip4
 
Volume Name: distributed-striped
Type: Distributed-Stripe
Volume ID: aa70dd67-3ca9-48cb-865b-b10f8ca1ccad
Status: Started
Number of Bricks: 2 x 2 = 4
Transport-type: tcp
Bricks:
Brick1: server1:/mnt/dist-strip1
Brick2: server2:/mnt/dist-strip3
Brick3: server1:/mnt/dist-strip2
Brick4: server2:/mnt/dist-strip4
 
Volume Name: distributed-replicated
Type: Distributed-Replicate
Volume ID: 59a819c4-6e84-4c49-9e90-23daa59d12ee
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 


Как видим, у нас 5 volum-ов с различным типом распределения контента. Можно переходить к клиентской части.

3. Настройка клиентской части


На всех клиентах нужно установить gluster-client из ppa репозиториев.
root@client1:~#apt-get install python-software-properties
root@client1:~#add-apt-repository ppa:semiosis/ubuntu-glusterfs-3.5
root@client1:~#apt-get update
root@client1:~#apt-get install glusterfs-client 


Далее всего лишь нужно смонтировать сетевую папку по имени созданного volum-a. При этом IP или доменное имя сервера роли не играет, т.е. если у нас 10 серверов добавлены в один кластер, то на клиенте можно монтировать шару используя любой из 10-ти IP, имя volum-a остается тем же.

3.1 Монтирование и тест distributed volume


Подключаемся к клиенту, создаем папку для нового диска и монтируем distributed volume.
root@client1:~# mkdir /mnt/distrib 
root@client1:~# mount.glusterfs server1:/distributed /mnt/distrib/
root@client1:~# df -h
Filesystem            Size  Used Avail Use% Mounted on
/dev/sda1             7.3G  1.5G  5.5G  21% /
udev                  236M  4.0K  236M   1% /dev
tmpfs                  49M  280K   49M   1% /run
none                  5.0M     0  5.0M   0% /run/lock
none                  245M     0  245M   0% /run/shm
server1:/distributed   30G  6.3G   22G  23% /mnt/distrib


Как видим, у нас успешно смонтировался новый сетевой диск размером 30Гб(суммарный размер дисков всех серверов входящих в volume). Теперь создадим десяток файлов.
root@client1:~# seq 1 10 | while read line; do echo "This is File${line}" > /mnt/distrib/file${line};done
root@client1:~# ls /mnt/distrib/ 
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9


Смотрим как распределился контент по серверам.
root@server1:~# ls /mnt/dist[0-9]/
/mnt/dist1/:
file10  file3  file4  file9

/mnt/dist2/:
file7

root@server2:~# ls /mnt/dist[0-9]/
/mnt/dist3/:
file1  file2

/mnt/dist4/:
file5  file6  file8


Как видим, файлы раскидало по всем четырем папкам, какие входили в distributed volume.

3.2 Монтирование и тест replicated volume


Подключаемся к клиенту, создаем папку для нового диска и монтируем replicated volume.
root@client1:~# mkdir /mnt/replica
root@client1:~# mount.glusterfs server1:/replicated /mnt/replica/
root@client1:~# df -h
Filesystem           Size  Used Avail Use% Mounted on
/dev/sda1            7.3G  1.5G  5.5G  21% /
udev                 131M  4.0K  131M   1% /dev
tmpfs                 28M  280K   28M   1% /run
none                 5.0M     0  5.0M   0% /run/lock
none                 140M     0  140M   0% /run/shm
server1:/replicated  7.3G  1.9G  5.1G  28% /mnt/replica 


Как видим, у нас успешно смонтировался новый сетевой диск размером 7.3Гб(суммарный размер дисков всех серверов входящих в volume разделенный на число реплик). Теперь создадим десяток файлов.
root@client1:~# seq 1 10 | while read line; do echo "This is File${line}" > /mnt/replica/file${line};done
root@client1:~# ls /mnt/replica/ 
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9


Смотрим как распределился контент по серверам.
root@server1:~# ls /mnt/repl*
/mnt/repl1:
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9

/mnt/repl2:
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9 

root@server2:~# ls /mnt/repl*
/mnt/repl3:
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9

/mnt/repl4:
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9


Как видим, файлы зеркально скопировались в каждую папку, которая входили в replicated volume.

3.3 Монтирование и тест striped volume


Подключаемся к клиенту, создаем папку для нового диска и монтируем striped volume.
root@client1:~# mkdir /mnt/strip
root@client1:~# mount.glusterfs server1:/striped /mnt/strip/
root@client1:~# df -h
Filesystem        Size  Used Avail Use% Mounted on
/dev/sda1         7.3G  1.5G  5.5G  21% /
udev              131M  4.0K  131M   1% /dev
tmpfs              28M  280K   28M   1% /run
none              5.0M     0  5.0M   0% /run/lock
none              140M     0  140M   0% /run/shm
server1:/striped   30G  6.3G   22G  23% /mnt/strip 


Как видим, у нас успешно смонтировался новый сетевой диск размером 30Гб(суммарный размер дисков всех серверов входящих в volume). Теперь создадим пару больших файлов и скопируем в папку.
root@client1:~# dd if=/dev/urandom of=test2.bin bs=30M count=10
root@client1:~# dd if=/dev/urandom of=test1.bin bs=30M count=10
root@client1:~# cp test* /mnt/strip/
root@client1:~# ls -lh /mnt/strip/
total 601M
-rw-r--r-- 1 root root 300M Mar  2 14:13 test1.bin
-rw-r--r-- 1 root root 300M Mar  2 14:13 test2.bin


Как видно, у нас в папке лежит 2 файла размером 300Мб. Теперь посмотрим как распределился контент по серверам.
root@server1:~# ls -lh /mnt/strip*
/mnt/strip1:
total 151M
-rw-r--r-- 2 root root  75M Mar  2 14:13 test1.bin
-rw-r--r-- 2 root root  75M Mar  2 14:13 test2.bin

/mnt/strip2:
total 151M
-rw-r--r-- 2 root root  75M Mar  2 14:13 test1.bin
-rw-r--r-- 2 root root  75M Mar  2 14:13 test2.bin 


root@server2:~# ls -lh /mnt/strip*
/mnt/strip3:
total 151M
-rw-r--r-- 2 root root  75M Mar  2 14:13 test1.bin
-rw-r--r-- 2 root root  75M Mar  2 14:13 test2.bin

/mnt/strip4:
total 151M
-rw-r--r-- 2 root root  75M Mar  2 14:13 test1.bin
-rw-r--r-- 2 root root  75M Mar  2 14:13 test2.bin



Как видим, файлы были разбиты на равные части по 75Мб и разбросаны по всем четырем папкам, какие входили в striped volume.

3.4 Монтирование и тест distributed striped volume


Подключаемся к клиенту, создаем папку для нового диска и монтируем distributed striped volume.
root@client1:~# mkdir /mnt/distrib-strip
root@client1:~# mount.glusterfs server1:/distributed-striped /mnt/distrib-strip/
root@client1:~# df -h
Filesystem                    Size  Used Avail Use% Mounted on
/dev/sda1                     7.3G  1.8G  5.2G  25% /
udev                          131M  4.0K  131M   1% /dev
tmpfs                          28M  280K   28M   1% /run
none                          5.0M     0  5.0M   0% /run/lock
none                          140M     0  140M   0% /run/shm
server1:/distributed-striped   30G  6.9G   21G  26% /mnt/distrib-strip 


Как видим, у нас успешно смонтировался новый сетевой диск размером 30Гб(суммарный размер дисков всех серверов входящих в volume). Теперь создадим пару больших файлов и скопируем в папку.
root@client1:~# dd if=/dev/urandom of=test2.bin bs=30M count=10
root@client1:~# dd if=/dev/urandom of=test1.bin bs=30M count=10
root@client1:~# cp test* /mnt/distrib-strip/
root@client1:~# ls -lh /mnt/distrib-strip/
total 600M
-rw-r--r-- 1 root root 300M Mar  2 14:35 test1.bin
-rw-r--r-- 1 root root 300M Mar  2 14:34 test2.bin 


Как видно, у нас в папке лежит 2 файла размером 300Мб. Теперь посмотрим как распределился контент по серверам.
root@server1:~# ls -lh /mnt/dist-strip*  
/mnt/dist-strip1:
total 151M
-rw-r--r-- 2 root root 150M Mar  2 14:35 test1.bin

/mnt/dist-strip2:
total 151M
-rw-r--r-- 2 root root 150M Mar  2 14:34 test2.bin

root@server2:~# ls -lh /mnt/dist-strip*  
/mnt/dist-strip3:
total 151M
-rw-r--r-- 2 root root 150M Mar  2 14:35 test1.bin

/mnt/dist-strip4:
total 151M
-rw-r--r-- 2 root root 150M Mar  2 14:34 test2.bin


Как видим, файлы были разбросаны по разным папкам и разбиты на равные части по 150Мб.

3.5 Монтирование и тест distributed replicated volume


Подключаемся к клиенту, создаем папку для нового диска и монтируем distributed replicated volume.
root@client1:~# mkdir /mnt/distrib-repl
root@client1:~# mount.glusterfs server1:/distributed-replicated /mnt/distrib-repl/
root@client1:~# df -h
Filesystem                       Size  Used Avail Use% Mounted on
/dev/sda1                        7.3G  1.8G  5.1G  27% /
udev                             131M  4.0K  131M   1% /dev
tmpfs                             28M  280K   28M   1% /run
none                             5.0M     0  5.0M   0% /run/lock
none                             140M     0  140M   0% /run/shm
server1:/distributed-replicated   15G  4.4G  9.5G  32% /mnt/distrib-repl 


Как видим, у нас успешно смонтировался новый сетевой диск размером 15Гб(суммарный размер дисков всех серверов входящих в volume разделенный на число реплик). Теперь создадим десяток файлов.
root@client1:~# seq 1 10 | while read line; do echo "This is File${line}" > /mnt/distrib-repl/file${line};done    
root@client1:~# ls /mnt/distrib-repl/
file1  file10  file2  file3  file4  file5  file6  file7  file8  file9 


Смотрим как распределился контент по серверам.
root@server1:~# ls /mnt/dist-repl*
/mnt/dist-repl1:
file10  file3  file4  file7  file9

/mnt/dist-repl2:
file1  file2  file5  file6  file8 

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

/mnt/dist-repl4:
file1  file2  file5  file6  file8



Как видим, первый сервер имеет такой же контент как и второй разбросанный по папкам.

4. Заключение


В реальных условиях каждая папка должна быть отдельно смонтированным диском (не рутовой файловой системой). Теперь вы знакомы с каждым типом распределения контента, который используется в glusterFS.

GlusterFS хорошо себя показывает в локальных сетях при базовой настройке, если переходить к распределённых по странам датацентрах, то нужно проводить тюнинг настроек как на стороне сервера, так и при монтирование на клиенте, о чем пойдет речь в следующей статье.
Tags:
Hubs:
+12
Comments 18
Comments Comments 18

Articles