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

Хранилище с высокой доступностью с GlusterFS 3.0.x на Debian Squeeze - Автоматическая репликация файлов между двумя серверами хранения

Этот учебник показывает, как настроить хранилище с высокой доступностью с двумя серверами хранения (Debian Squeeze), которые используют GlusterFS. Каждый сервер хранения будет зеркалом другого сервера хранения, и файлы будут автоматически реплицироваться между обоими серверами хранения. Клиентская система (также Debian Squeeze) сможет получить доступ к хранилищу так, как если бы это была локальная файловая система. 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 Squeeze, поэтому мы можем установить его следующим образом:

apt-get install glusterfs-server

Команда

glusterfs --version

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

root@server1:~# glusterfs --version  
glusterfs 3.0.5 built on Jul 13 2010 16:44:21  
Repository revision: v3.0.5  
Copyright (c) 2006-2009 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:~#

Затем мы создаем несколько каталогов:

mkdir /data/  
mkdir /data/export  
mkdir /data/export-ns

Теперь мы создаем файл конфигурации сервера GlusterFS /etc/glusterfs/glusterfsd.vol (сначала мы создаем резервную копию оригинального файла /etc/glusterfs/glusterfsd.vol), который определяет, какой каталог будет экспортирован (/data/export) и какой клиент может подключаться (192.168.0.102 = client1.example.com):

cp /etc/glusterfs/glusterfsd.vol /etc/glusterfs/glusterfsd.vol_orig  
cat /dev/null > /etc/glusterfs/glusterfsd.vol  
vi /etc/glusterfs/glusterfsd.vol

| volume posix type storage/posix option directory /data/export end-volume volume locks type features/locks subvolumes posix end-volume volume brick type performance/io-threads option thread-count 8 subvolumes locks end-volume volume server type protocol/server option transport-type tcp option auth.addr.brick.allow 192.168.0.102 subvolumes brick end-volume |

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

После этого мы запускаем сервер GlusterFS:

/etc/init.d/glusterfs-server start

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

client1.example.com:

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

apt-get install glusterfs-client

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

mkdir /mnt/glusterfs

Затем мы создаем файл /etc/glusterfs/glusterfs.vol (сначала мы создаем резервную копию оригинального файла /etc/glusterfs/glusterfs.vol):

cp /etc/glusterfs/glusterfs.vol /etc/glusterfs/glusterfs.vol_orig  
cat /dev/null > /etc/glusterfs/glusterfs.vol  
vi /etc/glusterfs/glusterfs.vol

| volume remote1 type protocol/client option transport-type tcp option remote-host server1.example.com option remote-subvolume brick end-volume volume remote2 type protocol/client option transport-type tcp option remote-host server2.example.com option remote-subvolume brick end-volume volume replicate type cluster/replicate subvolumes remote1 remote2 end-volume volume writebehind type performance/write-behind option window-size 1MB subvolumes replicate end-volume volume cache type performance/io-cache option cache-size 512MB subvolumes writebehind end-volume |

Убедитесь, что вы используете правильные имена хостов серверов или IP-адреса в строках option remote-host!

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

glusterfs -f /etc/glusterfs/glusterfs.vol /mnt/glusterfs

или

mount -t glusterfs /etc/glusterfs/glusterfs.vol /mnt/glusterfs

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

mount
root@client1:~# mount  
/dev/sda1 on / type ext3 (rw,errors=remount-ro)  
tmpfs on /lib/init/rw type tmpfs (rw,nosuid,mode=0755)  
proc on /proc type proc (rw,noexec,nosuid,nodev)  
sysfs on /sys type sysfs (rw,noexec,nosuid,nodev)  
udev on /dev type tmpfs (rw,mode=0755)  
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev)  
devpts on /dev/pts type devpts (rw,noexec,nosuid,gid=5,mode=620)  
fusectl on /sys/fs/fuse/connections type fusectl (rw)  
/etc/glusterfs/glusterfs.vol on /mnt/glusterfs type fuse.glusterfs (rw,allow_other,default_permissions,max_read=131072)  
root@client1:~#

… и…

df -h
root@client1:~# df -h  
Filesystem            Size  Used Avail Use% Mounted on  
/dev/sda1             29G  778M   27G   3% /  
tmpfs                 249M     0  249M   0% /lib/init/rw  
udev                  244M  100K  244M   1% /dev  
tmpfs                 249M     0  249M   0% /dev/shm  
/etc/glusterfs/glusterfs.vol  
                     18G  848M   16G   5% /mnt/glusterfs  
root@client1:~#

( server1.example.com и server2.example.com каждый имеют 18 ГБ пространства для файловой системы GlusterFS, но поскольку данные зеркалируются, клиент не видит 36 ГБ (2 x 18 ГБ), а только 18 ГБ.)

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

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

vi /etc/fstab

| [...] /etc/glusterfs/glusterfs.vol /mnt/glusterfs glusterfs defaults,_netdev 0 0 |

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

reboot

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

df -h

… и…

mount

Если изменение /etc/fstab не помогло, отмените изменения в /etc/fstab и добавьте эту строку в /etc/rc.local вместо этого (перед строкой exit 0):

vi /etc/rc.local

| [...] /bin/mount -t glusterfs /etc/glusterfs/glusterfs.vol /mnt/glusterfs [...] |

Это гарантирует, что общая папка будет смонтирована после того, как сеть будет запущена.

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

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

client1.example.com:

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

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

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

ls -l /data/export
root@server1:~# ls -l /data/export  
total 0  
-rw-r--r-- 1 root root 0 2012-03-29 14:51 test1  
-rw-r--r-- 1 root root 0 2012-03-29 14:51 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/export на server2.example.com:

server2.example.com:

ls -l /data/export
root@server2:~# ls -l /data/export  
total 0  
-rw-r--r-- 1 root root 0 2012-03-29 14:51 test1  
-rw-r--r-- 1 root root 0 2012-03-29 14:52 test3  
-rw-r--r-- 1 root root 0 2012-03-29 14:52 test4  
root@server2:~#

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

server1.example.com:

ls -l /data/export
root@server1:~# ls -l /data/export  
total 0  
-rw-r--r-- 1 root root 0 2012-03-29 14:51 test1  
-rw-r--r-- 1 root root 0 2012-03-29 14:51 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 2012-03-29 14:51 test1  
-rw-r--r-- 1 root root 0 2012-03-29 14:52 test3  
-rw-r--r-- 1 root root 0 2012-03-29 14:52 test4  
root@client1:~#

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

server1.example.com:

ls -l /data/export
root@server1:~# ls -l /data/export  
total 8  
-rw-r--r-- 1 root root 0 2012-03-29 14:51 test1  
-rw-r--r-- 1 root root 0 2012-03-29 14:52 test3  
-rw-r--r-- 1 root root 0 2012-03-29 14:52 test4  
root@server1:~#

5 Ссылки

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.