Хранилище · 6 min read · Jan 10, 2026

Высокодоступное хранилище с GlusterFS 3.2.x на Debian Wheezy - Автоматическая репликация файлов (зеркало) между двумя серверами хранения

Этот учебник показывает, как настроить высокодоступное хранилище с двумя серверами хранения (Debian Wheezy), использующими GlusterFS. Каждый сервер хранения будет зеркалом другого сервера хранения, и файлы будут автоматически реплицироваться между обоими серверами хранения. Клиентская система (также Debian Wheezy) сможет получить доступ к хранилищу так, как если бы это была локальная файловая система. GlusterFS - это кластерная файловая система, способная масштабироваться до нескольких пета-байт. Она агрегирует различные хранилищные кирпичи через Infiniband RDMA или TCP/IP соединение в одну большую параллельную сетевую файловую систему. Хранилищные кирпичи могут быть сделаны из любого стандартного оборудования, такого как серверы x86_64 с SATA-II RAID и Infiniband HBA.

Я не даю никаких гарантий, что это будет работать для вас!

1 Предварительная заметка

В этом учебнике я использую три системы, два сервера и клиент:

  • server1.example.com: IP-адрес 192.168.0.100 (сервер)
  • server2.example.com: IP-адрес 192.168.0.101 (сервер)
  • client1.example.com: IP-адрес 192.168.0.102 (клиент)

Все три системы должны иметь возможность разрешать имена хостов других систем. Если это невозможно сделать через DNS, вам следует отредактировать файл /etc/hosts, чтобы он выглядел следующим образом на всех трех системах:

vi /etc/hosts

| 127.0.0.1 localhost.localdomain localhost 192.168.0.100 server1.example.com server1 192.168.0.101 server2.example.com server2 192.168.0.102 client1.example.com client1 # Следующие строки желательны для хостов, поддерживающих IPv6 ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters ff02::3 ip6-allhosts |

(Также возможно использовать IP-адреса вместо имен хостов в следующей настройке. Если вы предпочитаете использовать IP-адреса, вам не нужно беспокоиться о том, могут ли имена хостов быть разрешены или нет.)

2 Настройка серверов GlusterFS

server1.example.com/server2.example.com:

GlusterFS доступен в виде пакета для Debian Wheezy, поэтому мы можем установить его следующим образом:

apt-get install glusterfs-server

Команда

glusterfsd --version

должна теперь показать версию GlusterFS, которую вы только что установили (в данном случае 3.2.7):

root@server1:~# glusterfsd --version  
glusterfs 3.2.7 built on Nov 12 2012 19:30:08  
Repository revision: git://git.gluster.com/glusterfs.git  
Copyright (c) 2006-2011 Gluster Inc.   
GlusterFS comes with ABSOLUTELY NO WARRANTY.  
You may redistribute copies of GlusterFS under the terms of the GNU General Public License.  
root@server1:~#

Если вы используете брандмауэр, убедитесь, что TCP порты 111, 24007, 24008, 24009-(24009 + количество кирпичей во всех томах) открыты на server1.example.com и server2.example.com.

Далее мы должны добавить server2.example.com в доверенный пул хранения (обратите внимание, что я выполняю все команды конфигурации GlusterFS с server1.example.com, но вы также можете выполнять их с server2.example.com, потому что конфигурация реплицируется между узлами GlusterFS - просто убедитесь, что вы используете правильные имена хостов или IP-адреса):

server1.example.com:

На server1.example.com выполните

gluster peer probe server2.example.com
root@server1:~# gluster peer probe server2.example.com  
Probe successful  
root@server1:~#

Статус доверенного пула хранения теперь должен быть похож на это:

gluster peer status
root@server1:~# gluster peer status  
Number of Peers: 1
Hostname: server2.example.com  
Uuid: d19cb707-7b23-4d11-8e9c-183cd0a18d96  
State: Peer in Cluster (Connected)  
root@server1:~#

Далее мы создаем общий ресурс с именем testvol с двумя репликами (обратите внимание, что количество реплик равно количеству серверов в данном случае, потому что мы хотим настроить зеркалирование) на server1.example.com и server2.example.com в каталоге /data (он будет создан, если не существует):

gluster volume create testvol replica 2 transport tcp server1.example.com:/data server2.example.com:/data
root@server1:~# gluster volume create testvol replica 2 transport tcp server1.example.com:/data server2.example.com:/data  
Creation of volume testvol has been successful. Please start the volume to access data.  
root@server1:~#

Запустите том:

gluster volume start testvol

Возможно, что вышеуказанная команда сообщит вам, что действие не было успешным:

root@server1:~# gluster volume start testvol  
Starting volume testvol has been unsuccessful  
root@server1:~#

В этом случае вам следует проверить вывод…

server1.example.com/server2.example.com:

netstat -tap | grep glusterfsd

на обоих серверах.

Если вы получите вывод, похожий на этот…

root@server1:~# netstat -tap | grep glusterfsd  
tcp        0      0 *:24009                 *:*                     LISTEN      1548/glusterfsd  
tcp        0      0 localhost.localdom:1019 localhost.localdo:24007 ESTABLISHED 1548/glusterfsd  
root@server1:~#

… все в порядке, но если вы не получите никакого вывода…

root@server2:~# netstat -tap | grep glusterfsd  
root@server2:~#

… перезапустите демон GlusterFS на соответствующем сервере (server2.example.com в данном случае):

server2.example.com:

/etc/init.d/glusterfs-server restart

Затем проверьте вывод…

netstat -tap | grep glusterfsd

… снова на этом сервере - он теперь должен выглядеть так:

root@server2:~# netstat -tap | grep glusterfsd  
tcp        0      0 *:24010                 *:*                     LISTEN      1458/glusterfsd  
tcp        0      0 localhost.localdom:1021 localhost.localdo:24007 ESTABLISHED 1458/glusterfsd  
root@server2:~#

Теперь вернемся к server1.example.com:

server1.example.com:

Вы можете проверить статус тома с помощью команды

gluster volume info
root@server1:~# gluster volume info
Volume Name: testvol  
Type: Replicate  
Status: Started  
Number of Bricks: 2  
Transport-type: tcp  
Bricks:  
Brick1: server1.example.com:/data  
Brick2: server2.example.com:/data  
root@server1:~#

По умолчанию все клиенты могут подключаться к тому. Если вы хотите предоставить доступ только client1.example.com (= 192.168.0.102), выполните:

gluster volume set testvol auth.allow 192.168.0.102

Обратите внимание, что возможно использовать подстановочные знаки для IP-адресов (например, 192.168.*) и что вы можете указать несколько IP-адресов, разделенных запятой (например, 192.168.0.102,192.168.0.103).

Информация о томе теперь должна показывать обновленный статус:

gluster volume info
root@server1:~# gluster volume info
Volume Name: testvol  
Type: Replicate  
Status: Started  
Number of Bricks: 2  
Transport-type: tcp  
Bricks:  
Brick1: server1.example.com:/data  
Brick2: server2.example.com:/data  
Options Reconfigured:  
auth.allow: 192.168.0.102  
root@server1:~#

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

client1.example.com:

На клиенте мы можем установить клиент GlusterFS следующим образом:

apt-get install glusterfs-client

Затем создаем следующий каталог:

mkdir /mnt/glusterfs

Вот и все! Теперь мы можем смонтировать файловую систему GlusterFS в /mnt/glusterfs с помощью следующей команды:

mount.glusterfs server1.example.com:/testvol /mnt/glusterfs

(Вместо server1.example.com вы также можете использовать server2.example.com в вышеуказанной команде!)

Теперь вы должны увидеть новую общую папку в выводах…

mount
root@client1:~# mount  
sysfs on /sys type sysfs (rw,nosuid,nodev,noexec,relatime)  
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)  
odev on /dev type devtmpfs (rw,relatime,size=10240k,nr_inodes=126813,mode=755)  
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000)  
tmpfs on /run type tmpfs (rw,nosuid,noexec,relatime,size=102704k,mode=755)  
/dev/mapper/server1-root on / type ext4 (rw,relatime,errors=remount-ro,user_xattr,barrier=1,data=ordered)  
tmpfs on /run/lock type tmpfs (rw,nosuid,nodev,noexec,relatime,size=5120k)  
tmpfs on /run/shm type tmpfs (rw,nosuid,nodev,noexec,relatime,size=205400k)  
/dev/sda1 on /boot type ext2 (rw,relatime,errors=continue)  
rpc_pipefs on /var/lib/nfs/rpc_pipefs type rpc_pipefs (rw,relatime)  
server1.example.com:/testvol on /mnt/glusterfs type fuse.glusterfs (rw,relatime,user_id=0,group_id=0,default_permissions,allow_other,max_read=131072)  
fusectl on /sys/fs/fuse/connections type fusectl (rw,relatime)  
root@client1:~#

… и…

df -h
root@client1:~# df -h  
Filesystem                    Size  Used Avail Use% Mounted on  
rootfs                         29G  1.2G   26G   5% /  
udev                           10M     0   10M   0% /dev  
tmpfs                         101M  240K  101M   1% /run  
/dev/mapper/server1-root       29G  1.2G   26G   5% /  
tmpfs                         5.0M     0  5.0M   0% /run/lock  
tmpfs                         201M     0  201M   0% /run/shm  
/dev/sda1                     228M   18M  199M   9% /boot  
server1.example.com:/testvol   29G  1.2G   26G   5% /mnt/glusterfs  
root@client1:~#

Вместо того чтобы монтировать общую папку GlusterFS вручную на клиенте, вы можете изменить /etc/fstab, чтобы общая папка монтировалась автоматически при загрузке клиента.

Откройте /etc/fstab и добавьте следующую строку:

vi /etc/fstab

| [...] server1.example.com:/testvol /mnt/glusterfs glusterfs defaults,_netdev 0 0 |

(Снова, вместо server1.example.com вы также можете использовать server2.example.com!)

Чтобы проверить, работает ли ваш измененный /etc/fstab, перезагрузите клиент:

reboot

После перезагрузки вы должны найти общую папку в выводах…

df -h

… и…

mount

4 Тестирование

Теперь давайте создадим несколько тестовых файлов на общей папке GlusterFS:

client1.example.com:

touch /mnt/glusterfs/test1  
touch /mnt/glusterfs/test2

Теперь давайте проверим каталог /data на server1.example.com и server2.example.com. Файлы test1 и test2 должны присутствовать на каждом узле:

server1.example.com/server2.example.com:

ls -l /data
root@server1:~# ls -l /data  
total 0  
-rw-r--r-- 1 root root 0 Sep 30 17:53 test1  
-rw-r--r-- 1 root root 0 Sep 30 17:53 test2  
root@server1:~#

Теперь мы выключаем server1.example.com и добавляем/удаляем некоторые файлы на общей папке GlusterFS на client1.example.com.

server1.example.com:

shutdown -h now

client1.example.com:

touch /mnt/glusterfs/test3  
touch /mnt/glusterfs/test4  
rm -f /mnt/glusterfs/test2

Изменения должны быть видны в каталоге /data на server2.example.com:

server2.example.com:

ls -l /data
root@server2:~# ls -l /data  
total 8  
-rw-r--r-- 1 root root 0 Sep 30 17:53 test1  
-rw-r--r-- 1 root root 0 Sep 30 17:54 test3  
-rw-r--r-- 1 root root 0 Sep 30 17:54 test4  
root@server2:~#

Давайте снова загрузим server1.example.com и посмотрим на каталог /data:

server1.example.com:

ls -l /data
root@server1:~# ls -l /data  
total 0  
-rw-r--r-- 1 root root 0 Sep 30 17:53 test1  
-rw-r--r-- 1 root root 0 Sep 30 17:53 test2  
root@server1:~#

Как вы видите, server1.example.com не заметил изменений, которые произошли, пока он был выключен. Это легко исправить, все, что нам нужно сделать, это вызвать команду чтения на общей папке GlusterFS на client1.example.com, например:

client1.example.com:

ls -l /mnt/glusterfs/
root@client1:~# ls -l /mnt/glusterfs/  
total 8  
-rw-r--r-- 1 root root 0 Sep 30 17:53 test1  
-rw-r--r-- 1 root root 0 Sep 30 17:54 test3  
-rw-r--r-- 1 root root 0 Sep 30 17:54 test4  
root@client1:~#

Теперь посмотрите на каталог /data на server1.example.com снова, и вы должны увидеть, что изменения были реплицированы на этот узел:

server1.example.com:

ls -l /data
root@server1:~# ls -l /data  
total 0  
-rw-r--r-- 1 root root 0 Sep 30 17:53 test1  
-rw-r--r-- 1 root root 0 Sep 30 17:54 test3  
-rw-r--r-- 1 root root 0 Sep 30 17:54 test4  
root@server1:~#

5 Ссылки

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.