Установка и настройка GlusterFS

glusterРешил написать еще об одной сетевой файловой системе – glusterFS. Это очень удобная и простая в использовании и настройке распределённая файловая система, которая работает в пользовательском пространстве используя FUSE технологию, т.е. работает поверх основной файловой системы. Для установки и настройки будем использовать ОС Ubuntu 12.04.
Будем настраивать кластер из двух серверов и монтировать на одном клиенте. Имеем следующие credentials:

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. Общее настройки(prerequirements)

Для удобства, добавим все адреса в хосты на каждой машине.

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:gluster/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:gluster/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:

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

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

При данной настройке данные будут распределяться в случайном порядке между каждой папкой, которая входив в volume.

distributed

Создадим на первом сервере паки 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).

replicated

Создадим на первом сервере паки 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 серверах.

striped

Создадим на первом сервере паки 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-х серверах.

distributed-striped

Создадим на первом сервере паки 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-х серверов.

distributed-replicated

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

Автор: admin, 2 марта 2015
Рубрики: Linux
Метки: ,
10 комментариев к сообщению: “Установка и настройка GlusterFS”
  1. depeche:

    Спасибо за статью.

    >> Создадим на первом сервере паки dist1, dist2, на втором – dist3, dist4.

    Это я так понимаю чисто для премера, так как физический диск на серверах один, да и серверов всего 2. А блока паков почему-то по 2 на сервер. Верно?

    • Да, я об этом написал в «Заключении»:
      >> В реальных условиях каждая папка должна быть отдельно смонтированным диском (не рутовой файловой системой).

  2. replica watches:

    Good information, you shared such a interesting points.

  3. У вас написано:
    файловая система, которая работает в пользовательском пространстве используя FUSE технологию, т.е. работает поверх основной файловой системы

    Но fuse не про файловые системы, от слова совсем. А статья отличная, спасибо!

  4. harga sprei:

    Great beat ! I would like to apprentice while you amend your website, how could i subscribe for a blog website?

    The account helped me a applicable deal. I have been tiny bit acquainted
    of this your broadcast offered vivid transparent concept

  5. sewa avanza di bali:

    Hello my friend! I want to say that this article is amazing,
    nice written and include approximately all
    vital infos. I would like to look more posts like this.

Написать комментарий

Последние статьи

Яндекс.Метрика
?>