Введение
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…”.