Введение
GlusterFS — это распределенная файловая система с открытым исходным кодом и возможностью расширения до нескольких петабайт, способная обслуживать тысячи клиентов. GlusterFS кластеризирует хранилища данных через Infiniband RDMA или TCP/IP соединение, объединяет ресурсы дисков и памяти и позволяет управлять данными в едином пользовательском пространстве. GlusterFS основан на возможности наращивания объемов доступного для пользователя пространства, позволяя получить отличных показателей производительности для различных нагрузок.
GlusterFS умеет несколько режимов распределения данных в кластере:
распределенный (distributed)
 реплицируемый (replicated)
 по частям (striped)
 распределённый по частям (distributed striped)
 распределенный и реплицируемый (distributed replicated)
 распределенный по частям и реплицируемый (distributed striped replicated)
 реплицируемый по частям (striped replicated)
 дисперсный (dispersed)
 распределенный дисперсный (distributed dispersed)
 Я буду использовать реплецируемый.
Предварительная настройка – открываем порты:
Открываем порты:
 Firewall
 Для работы glusterfs необходимо открыть следующие порты на 1 сервере(для 2 го сервера):
/sbin/iptables -I INPUT -m state --state NEW -m tcp -p tcp -s 10.4.1.152/32 --dport 111 -j ACCEPT; iptables -I INPUT -m state --state NEW -m udp -p udp -s 10.4.1.152/32 --dport 111 -j ACCEPT; /sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 10.4.1.152/32 --dport 24007:24019 -j ACCEPT; /sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 10.4.1.152/23 --dport 49152 -j ACCEPT; iptables-save > /etc/iptables/rules.v4
на 2 сервере(для 1 го сервера):
/sbin/iptables -I INPUT -m state --state NEW -m tcp -p tcp -s 10.4.1.151/32 --dport 111 -j ACCEPT; iptables -I INPUT -m state --state NEW -m udp -p udp -s 10.4.1.151/32 --dport 111 -j ACCEPT; /sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 10.4.1.151/32 --dport 24007:24019 -j ACCEPT; /sbin/iptables -A INPUT -m state --state NEW -m tcp -p tcp -s 10.4.1.151/32 --dport 49152 -j ACCEPT; iptables-save > /etc/iptables/rules.v4
Приведем hosts на web1
127.0.0.1 localhost 127.0.1.1 web1.domain.local web 10.4.1.152 web2.domain.local web2
Приведем hosts на web2
127.0.0.1 localhost 127.0.1.1 web2.domain.local web2 10.4.1.151 web1.domain.local web1
Установка Glusterfs
Ставим gluster-fs. Подробная инструкция здесь.
apt-get install glusterfs-server -y
Настройка gluster fs для соединения 2 серверов в кластер.
На первом сервере web1
sudo mkdir -p /gluster/site1 gluster peer probe web2 sudo gluster volume create site1 replica 2 transport tcp web1:/gluster/site1 web2:/gluster/site1 force
На 2 сервере(клиенте)
sudo mkdir -p /storage-pool/site1
sudo mount -t glusterfs web2:/site1 /storage-pool/site1
НА 1 сервере
sudo mount -t glusterfs web1:/site1 /storage-pool/site1
Всё синхронизация началась.
Настройка безопасности
Для того чтобы с нашим хранилищем могли работать только наши сервера надо:
sudo gluster volume set site1 auth.allow 10.4.1.151,10.4.1.152Автоматическое монтирование glusterfs в Debian
Теперь добавим нашу директорию в автозагрузку через script и fstab(это особенность дебиан), так как mount /etc/init.d/mountnfs стартует быстрее чем /etc/init.d/gluster-server.
На 1 сервере
sudo touch /etc/init.d/mountglusterfs.sh
nano /etc/init.d/mountglusterfs.sh
Вставляем туда этот код(взял с git’a)
#! /bin/bash
### BEGIN INIT INFO
# Provides:          mountglusterfs
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Mount glusterfs drives
# Description:       When system services rely on glusterfs drives
#                    than those services' LSB scripts should have certainty
#                    that glusterfs based drives are up and running.
### END INIT INFO
. /lib/init/vars.sh
. /lib/init/mount-functions.sh
. /lib/lsb/init-functions
do_wait_sync_mount() {
	GLUSTER_DEVS=()
	GLUSTER_MTPTS=()
	GLUSTER_OPTS=()
	# Read through fstab line by line. If it is glusterfs and _netdev, set the
	# flag for mounting glusterfs file systems.
	for file in "$(eval ls $(fstab_files))"; do
		if [ -f "$file" ]; then
			while read DEV MTPT FSTYPE OPTS REST; do
				F_OPT=0
				F_FSTYPE=0
				case "$OPTS" in
				*_netdev*)
					F_OPT=1
					;;
				esac
				case "$FSTYPE" in
				glusterfs)
					F_FSTYPE=1
					;;
				esac
				if [ "$F_OPT" -eq "1" -a "$F_FSTYPE" -eq "1" ]; then
					GLUSTER_DEVS+=($DEV)
					GLUSTER_MTPTS+=($MTPT)
					GLUSTER_OPTS+=($OPTS)
				fi
			done < "$file"
		fi
	done
	# Wait for each path, the timeout is for all of them as that's
	# really the maximum time we have to wait anyway
	TIMEOUT=900
	for ((i = 0; i <= ${#GLUSTER_DEVS[@]}-1; i++)); do log_action_begin_msg "Mounting ${GLUSTER_DEVS[$i]} at " \ "${GLUSTER_MTPTS[$i]}" while ! mountpoint -q ${GLUSTER_MTPTS[$i]}; do sleep 0.1 mount -t glusterfs -o ${GLUSTER_OPTS[$i]} ${GLUSTER_DEVS[$i]} ${GLUSTER_MTPTS[$i]} TIMEOUT=$(( $TIMEOUT - 1 )) if [ $TIMEOUT -le 0 ]; then log_action_end_msg 1 break fi done if [ $TIMEOUT -gt 0 ]; then log_action_end_msg 0 fi done } case "$1" in start) do_wait_sync_mount;; restart|reload|force-reload) echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
    stop)
        ;;
    *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac
: exit 0Делаем исполняемым
chmod u+x /etc/init.d/mountglusterfs.sh
Добавляем в автозапуск
update-rc.d mountglusterfs.sh defaults
Добавляем строку монтирования в fstab
nano /etc/fstab
Вставляем строку
web1:/site1 /storage-pool/site1 glusterfs defaults,_netdev 0 0
Перезапускаемся.
 Проверяем:
df -h
Видим:
Файловая система Размер Использовано Дост Использовано% Cмонтировано в /dev/vda1 7,4G 1,6G 5,5G 23% / udev 10M 0 10M 0% /dev tmpfs 99M 4,5M 95M 5% /run tmpfs 248M 0 248M 0% /dev/shm tmpfs 5,0M 0 5,0M 0% /run/lock tmpfs 248M 0 248M 0% /sys/fs/cgroup web1:/site1 7,4G 1,6G 5,5G 23% /storage-pool/site1
На 2 сервере
sudo touch /etc/init.d/mountglusterfs.sh
nano /etc/init.d/mountglusterfs.sh
Вставляем туда этот код(взял с git’a)
#! /bin/bash
### BEGIN INIT INFO
# Provides:          mountglusterfs
# Required-Start:    $local_fs $network
# Required-Stop:     $local_fs $network
# Default-Start:     2 3 4 5
# Default-Stop:      0 1 6
# Short-Description: Mount glusterfs drives
# Description:       When system services rely on glusterfs drives
#                    than those services' LSB scripts should have certainty
#                    that glusterfs based drives are up and running.
### END INIT INFO
. /lib/init/vars.sh
. /lib/init/mount-functions.sh
. /lib/lsb/init-functions
do_wait_sync_mount() {
	GLUSTER_DEVS=()
	GLUSTER_MTPTS=()
	GLUSTER_OPTS=()
	# Read through fstab line by line. If it is glusterfs and _netdev, set the
	# flag for mounting glusterfs file systems.
	for file in "$(eval ls $(fstab_files))"; do
		if [ -f "$file" ]; then
			while read DEV MTPT FSTYPE OPTS REST; do
				F_OPT=0
				F_FSTYPE=0
				case "$OPTS" in
				*_netdev*)
					F_OPT=1
					;;
				esac
				case "$FSTYPE" in
				glusterfs)
					F_FSTYPE=1
					;;
				esac
				if [ "$F_OPT" -eq "1" -a "$F_FSTYPE" -eq "1" ]; then
					GLUSTER_DEVS+=($DEV)
					GLUSTER_MTPTS+=($MTPT)
					GLUSTER_OPTS+=($OPTS)
				fi
			done < "$file"
		fi
	done
	# Wait for each path, the timeout is for all of them as that's
	# really the maximum time we have to wait anyway
	TIMEOUT=900
	for ((i = 0; i <= ${#GLUSTER_DEVS[@]}-1; i++)); do log_action_begin_msg "Mounting ${GLUSTER_DEVS[$i]} at " \ "${GLUSTER_MTPTS[$i]}" while ! mountpoint -q ${GLUSTER_MTPTS[$i]}; do sleep 0.1 mount -t glusterfs -o ${GLUSTER_OPTS[$i]} ${GLUSTER_DEVS[$i]} ${GLUSTER_MTPTS[$i]} TIMEOUT=$(( $TIMEOUT - 1 )) if [ $TIMEOUT -le 0 ]; then log_action_end_msg 1 break fi done if [ $TIMEOUT -gt 0 ]; then log_action_end_msg 0 fi done } case "$1" in start) do_wait_sync_mount;; restart|reload|force-reload) echo "Error: argument '$1' not supported" >&2
        exit 3
        ;;
    stop)
        ;;
    *)
        echo "Usage: $0 start|stop" >&2
        exit 3
        ;;
esac
: exit 0Делаем исполняемым
chmod u+x /etc/init.d/mountglusterfs.sh
Добавляем в автозапуск
update-rc.d mountglusterfs.sh defaults
Добавляем строку монтирования в fstab
nano /etc/fstab
Вставляем строку
web2:/site1 /storage-pool/site1 glusterfs defaults,_netdev 0 0
Перезапускаемся
 Проверяем
df -h
Видим
Файловая система Размер Использовано Дост Использовано% Cмонтировано в /dev/vda1 7,4G 1,6G 5,5G 23% / udev 10M 0 10M 0% /dev tmpfs 99M 4,5M 95M 5% /run tmpfs 248M 0 248M 0% /dev/shm tmpfs 5,0M 0 5,0M 0% /run/lock tmpfs 248M 0 248M 0% /sys/fs/cgroup web1:/site1 7,4G 1,6G 5,5G 23% /storage-pool/site1
PROFIT! Мы настроили реплицируемую glusterfs
Привет. Ты забыл “gluster volume start site1” после “gluster volume create…”.