Хранилище · 9 min read · Nov 29, 2025

Хранилище с высокой доступностью с GlusterFS на CentOS 7 - Зеркало между двумя серверами хранения

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

nano /etc/hosts
127.0.0.1   localhost localhost.localdomain localhost4 localhost4.localdomain4
192.168.0.100   server1.example.com     server1
192.168.0.101   server2.example.com     server2
192.168.0.102   client1.example.com     client1

::1         localhost localhost.localdomain localhost6 localhost6.localdomain6

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

2 Включение дополнительных репозиториев

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

Сначала мы импортируем GPG-ключи для программного обеспечения:

rpm --import /etc/pki/rpm-gpg/RPM-GPG-KEY*

Затем мы включаем репозиторий EPEL 7 на наших системах CentOS:

yum -y install epel-release
yum -y install yum-priorities

Отредактируйте /etc/yum.repos.d/epel.repo…

nano /etc/yum.repos.d/epel.repo

… и добавьте строку priority=10 в секцию [epel]:

[epel]
name=Extra Packages for Enterprise Linux 7 - $basearch
#baseurl=http://download.fedoraproject.org/pub/epel/7/$basearch
mirrorlist=https://mirrors.fedoraproject.org/metalink?repo=epel-7&arch=$basearch
failovermethod=priority
enabled=1
priority=10
gpgcheck=1
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-EPEL-7
[...]

Затем мы обновляем наши существующие пакеты на системе:

yum -y update

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

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

GlusterFS доступен в репозитории специальной группы интересов хранения CentOS. Установите репозиторий с помощью этой команды:

yum -y install centos-release-gluster

Затем установите сервер GlusterFS следующим образом:

yum -y install glusterfs-server

Создайте ссылки на запуск системы для демона Gluster и запустите его:

systemctl enable glusterd.service  
systemctl start glusterd.service

Команда

glusterfsd --version

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

[root@server1 ~]# glusterfsd --version  
glusterfs 3.7.12 built on Jun 24 2016 14:11:19  
Repository revision: git://git.gluster.com/glusterfs.git  
Copyright (c) 2006-2013 Red Hat, Inc.   
GlusterFS comes with ABSOLUTELY NO WARRANTY.  
It is licensed to you under your choice of the GNU Lesser  
General Public License, version 3 or any later version (LGPLv3  
or later), or the GNU General Public License, version 2 (GPLv2),  
in all cases as published by the Free Software Foundation.

Если вы используете брандмауэр, убедитесь, что 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  
peer probe: success.

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

gluster peer status
[root@server1 ~]# gluster peer status
Number of Peers: 1
Hostname: server2.example.com  
Uuid: 582e10da-aa1b-40b8-908c-213f16f57fe5  
State: Peer in Cluster (Connected)

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

gluster volume create testvol replica 2 transport tcp server1.example.com:/data server2.example.com:/data force
[root@server1 ~]# gluster volume create testvol replica 2 transport tcp server1.example.com:/data server2.example.com:/data force  
volume create: testvol: success: please start the volume to access data  
[root@server1 ~]#

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

gluster volume start testvol

Результат должен быть:

[root@server1 ~]# gluster volume start testvol  
volume start: testvol: success  
[root@server1 ~]#

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

[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 0.0.0.0:49152 0.0.0.0:* LISTEN 22880/glusterfsd  
tcp 0 0 server1.example.c:49152 server2.example.c:49148 ESTABLISHED 22880/glusterfsd  
tcp 0 0 server1.example.c:49152 server1.example.c:49148 ESTABLISHED 22880/glusterfsd  
tcp 0 0 server1.example.c:49150 server1.example.c:24007 ESTABLISHED 22880/glusterfsd  
tcp 0 0 server1.example.c:49152 server2.example.c:49142 ESTABLISHED 22880/glusterfsd  
tcp 0 0 server1.example.c:49152 server1.example.c:49149 ESTABLISHED 22880/glusterfsd  
[root@server1 ~]#

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

[root@server2 ~]# netstat -tap | grep glusterfsd  
[root@server2 ~]#

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

server2.example.com:

systemctl restart glusterd.service

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

netstat -tap | grep glusterfsd

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

[root@server2 ~]# netstat -tap | grep glusterfsd  
tcp 0 0 0.0.0.0:49152 0.0.0.0:* LISTEN 10971/glusterfsd  
tcp 0 0 server2.example.c:49152 server1.example.c:49140 ESTABLISHED 10971/glusterfsd  
tcp 0 0 server2.example.c:49152 server2.example.c:49149 ESTABLISHED 10971/glusterfsd  
tcp 0 0 server2.example.c:49152 server2.example.c:49143 ESTABLISHED 10971/glusterfsd  
tcp 0 0 server2.example.c:49152 server1.example.c:49142 ESTABLISHED 10971/glusterfsd  
tcp 0 0 server2.example.c:49150 server2.example.c:24007 ESTABLISHED 10971/glusterfsd  
[root@server2 ~]#

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

server1.example.com:

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

gluster volume info

[root@server1 ~]# gluster volume info

Volume Name: testvol  
Type: Replicate  
Volume ID: e1f825ca-c9d9-4eeb-b6c5-d62c4aa02376  
Status: Started  
Number of Bricks: 1 x 2 = 2  
Transport-type: tcp  
Bricks:  
Brick1: server1.example.com:/data  
Brick2: server2.example.com:/data  
Options Reconfigured:  
performance.readdir-ahead: on  
[root@server1 ~]#

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

gluster volume set testvol auth.allow 192.168.1.102

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

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

gluster volume info
[root@server1 ~]# gluster volume info
Volume Name: testvol  
Type: Replicate  
Volume ID: e1f825ca-c9d9-4eeb-b6c5-d62c4aa02376  
Status: Started  
Number of Bricks: 1 x 2 = 2  
Transport-type: tcp  
Bricks:  
Brick1: server1.example.com:/data  
Brick2: server2.example.com:/data  
Options Reconfigured:  
auth.allow: 192.168.1.102  
performance.readdir-ahead: on  
[root@server1 ~]#

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

client1.example.com:

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

yum -y 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,seclabel)  
proc on /proc type proc (rw,nosuid,nodev,noexec,relatime)  
devtmpfs on /dev type devtmpfs (rw,nosuid,seclabel,size=930336k,nr_inodes=232584,mode=755)  
securityfs on /sys/kernel/security type securityfs (rw,nosuid,nodev,noexec,relatime)  
tmpfs on /dev/shm type tmpfs (rw,nosuid,nodev,seclabel)  
devpts on /dev/pts type devpts (rw,nosuid,noexec,relatime,seclabel,gid=5,mode=620,ptmxmode=000)  
tmpfs on /run type tmpfs (rw,nosuid,nodev,seclabel,mode=755)  
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,seclabel,mode=755)  
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)  
pstore on /sys/fs/pstore type pstore (rw,nosuid,nodev,noexec,relatime)  
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)  
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)  
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)  
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)  
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)  
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)  
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)  
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)  
cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls)  
configfs on /sys/kernel/config type configfs (rw,relatime)  
/dev/mapper/centos-root on / type xfs (rw,relatime,seclabel,attr2,inode64,noquota)  
selinuxfs on /sys/fs/selinux type selinuxfs (rw,relatime)  
systemd-1 on /proc/sys/fs/binfmt_misc type autofs (rw,relatime,fd=34,pgrp=1,timeout=300,minproto=5,maxproto=5,direct)  
debugfs on /sys/kernel/debug type debugfs (rw,relatime)  
mqueue on /dev/mqueue type mqueue (rw,relatime,seclabel)  
hugetlbfs on /dev/hugepages type hugetlbfs (rw,relatime,seclabel)  
/dev/sda1 on /boot type xfs (rw,relatime,seclabel,attr2,inode64,noquota)  
tmpfs on /run/user/0 type tmpfs (rw,nosuid,nodev,relatime,seclabel,size=188060k,mode=700)  
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  
/dev/mapper/centos-root 28G 1.3G 27G 5% /  
devtmpfs 909M 0 909M 0% /dev  
tmpfs 919M 0 919M 0% /dev/shm  
tmpfs 919M 8.6M 910M 1% /run  
tmpfs 919M 0 919M 0% /sys/fs/cgroup  
/dev/sda1 497M 192M 306M 39% /boot  
tmpfs 184M 0 184M 0% /run/user/0  
server1.example.com:/testvol 28G 12G 17G 41% /mnt/glusterfs  
[root@client1 ~]#

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

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

nano /etc/rc.local
[...]  
/usr/sbin/mount.glusterfs server1.example.com:/testvol /mnt/glusterfs

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

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

reboot

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

df -h

… и…

mount

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

Теперь давайте создадим несколько тестовых файлов в общей папке 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--. 2 root root 0 Jul 1 2016 test1  
-rw-r--r--. 2 root root 0 Jul 1 2016 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

Команды могут занять некоторое время для выполнения, так как Glusterfs переключается на server2, когда он больше не может достучаться до server1. Мы можем увидеть здесь отказоустойчивость системы, так как мы все еще можем работать с нашей общей папкой хранения, когда server1 отключен. Изменения должны быть видны в каталоге /data на server2.example.com:

server2.example.com:

ls -l /data
[root@server2 ~]# ls -l /data  
total 8  
-rw-r--r--. 2 root root 0 Jul 1 15:17 test1  
-rw-r--r--. 2 root root 0 Jul 1 15:19 test3  
-rw-r--r--. 2 root root 0 Jul 1 15:19 test4

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

server1.example.com:

ls -l /data
[root@server1 ~]# ls -l /data  
total 8  
-rw-r--r--. 2 root root 0 Jul 1 15:17 test1  
-rw-r--r--. 2 root root 0 Jul 1 15:19 test2  
[root@server1 ~]#

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

client1.example.com:

ls -l /mnt/glusterfs/
[root@client1 ~]# ls -l /data  
total 8  
-rw-r--r--. 2 root root 0 Jul 1 15:17 test1  
-rw-r--r--. 2 root root 0 Jul 1 15:19 test3  
-rw-r--r--. 2 root root 0 Jul 1 15:19 test4  
[root@server1 ~]#

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

server1.example.com:

ls -l /data
[root@server1 ~]# ls -l /data  
total 8  
-rw-r--r--. 2 root root 0 Jul 1 15:17 test1  
-rw-r--r--. 2 root root 0 Jul 1 15:19 test3  
-rw-r--r--. 2 root root 0 Jul 1 15:19 test4  
[root@server1 ~]#

6 Ссылки

Share: X/Twitter LinkedIn

Get new posts in your inbox

No spam. Unsubscribe anytime.