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

Нашел несколько статей на хабре о базовой установке и настройке GlusterFS, но не нашел ничего о типах распределения контента, которые он поддерживает и с которыми я долго игрался. О чем и пойдет речь в данной статье.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 Сначала, для удобства, добавим все адреса в хосты на каждой машине. 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 на всех машинах, которые выступают в роле серверов (двух, в нашем случаи).

На всех серверах нужно установить 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×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×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×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×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-ов с различным типом распределения контента. Можно переходить к клиентской части.

На всех клиентах нужно установить 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 хорошо себя показывает в локальных сетях при базовой настройке, если переходить к распределённых по странам датацентрах, то нужно проводить тюнинг настроек как на стороне сервера, так и при монтирование на клиенте, о чем пойдет речь в следующей статье.

© Habrahabr.ru