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 для борьбы со спамом. Узнайте, как обрабатываются ваши данные комментариев.