Glusterfs – распределенная файловая система.

Введение

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

Один комментарий к “Glusterfs – распределенная файловая система.

  1. Привет. Ты забыл “gluster volume start site1” после “gluster volume create…”.

Добавить комментарий

Ваш адрес email не будет опубликован.

 

Этот сайт использует Akismet для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.