Настраиваем распределенную файловую систему GlusterFS на трехузловом кластере под управлением Linux

В этом руководстве мы рассмотрим настройку распределенной файловой системы GlusterFS на кластере, состоящем из трех узлов. Кластерные файловые системы часто используются в отказоустойчивых системах для обеспечения общего хранилища файлов.

Мы не рекомендуем использовать кластерные системы в задачах, где предполагается интенсивная запись данных, требующая высоких показателей IOPS и прогнозируемую задержку IO. Однако, для задач, в которых операции чтения значительно преобладают над операциями записи и нет требований к ультранизкой задержке IO, кластерные файловые системы вполне могут использоваться.

Настройка разрешения имен для приватной сети

В рамках настройки будем полагать, что все узлы соединены доверенной приватной сетью, в которой они доступны по доменными именам:

  • server1.private 10.0.0.1/24
  • server2.private 10.0.0.2/24
  • server3.private 10.0.0.3/24

Убедитесь, что серверы находятся в разных доменах отказа, чтобы не столкнуться с ситуацией, когда авария затронет сразу две или больше машин.

В ходе настройки будем предполагать, что используются серверы под управлением Debian 9, Ubuntu 16.04 или 18.04 или CentOS7.

Сначала на каждом сервере сформируем файл /etc/hosts, чтобы серверы «видели» друг друга по доменным именам:

cat | sudo tee -a /etc/hosts >/dev/null
10.0.0.1 server1.private
10.0.0.2 server2.private 
10.0.0.3 server3.private

Ctrl^D

После добавления этих строк убедитесь, что все серверы «видят» друг друга по доменным именам.

Файрвол, SELinux, AppArmor

Мы предполагаем, что для приватной сети весь трафик разрешен и не блокируется. AppArmor (Ubuntu, Debian), SELinux не накладывают ограничений или полностью отключены.

Установка NTPD

В кластерных системах очень важно, чтобы все серверы имели одинаковое время. Даже небольшой лаг времени может привести к проблемам. Для решения этой проблемы необходимо установить сервер NTPD на каждом из узлов.

Ubuntu, Debian Linux:

sudo apt-get update && sudo apt install -y openntpd

CentOS 7:

sudo yum install -y ntp
sudo systemctl start ntpd
sudo systemctl enable ntpd

Выбор фактора репликации

Мы будем выполнять установку GlusterFS на 3 узла и использовать фактор репликации равный трем. Это позволяет потерять любой из узлов и при этом не столкнуться с ситуацией «split-brain», которая характерна для хранения данных с фактором репликации равным 2, когда каждая копия может считать себя правильной и продолжать функционировать, накапливая рассогласования.

Задание пространства для файловой системы

В реальной настройке для хранения данных GlusterFS выделяют отдельные дисковые устройства, на которых создается файловая система и отдается целиком под управление GlusterFS. В нашем варианте мы будем считать, что файловая система доступна по пути /opt/gluster, вы можете смонтировать к этому каталогу свое устройство с файловой системой или использовать пространство корневой системы, как будем делать мы.

На каждом узле создадим каталог /opt/gluster-volume:

sudo mkdir /opt/gluster-volume

При выделении отдельного устройства для тома GlusterFS рекомендуется создать на нем файловую систему XFS

Установка и настройка GlusterFS

На каждом узле выполним установку GlusterFS и активируем сервер. На случай, если установочная информация устареет, вы можете обратиться к разделу оригинальной документации GlusterFS.

Debian Linux:

sudo apt install -y dirmngr

wget -O - http://download.gluster.org/pub/gluster/glusterfs/LATEST/rsa.pub | sudo apt-key add -

wget -O - https://download.gluster.org/pub/gluster/glusterfs/3.12/rsa.pub | sudo apt-key add -

DEBID=$(grep 'VERSION_ID=' /etc/os-release | cut -d '=' -f 2 | tr -d '"')
DEBVER=$(grep 'VERSION=' /etc/os-release | grep -Eo '[a-z]+')
DEBARCH=$(dpkg --print-architecture)

echo deb https://download.gluster.org/pub/gluster/glusterfs/LATEST/Debian/${DEBID}/${DEBARCH}/apt ${DEBVER} main | sudo tee /etc/apt/sources.list.d/gluster.list

sudo apt-get update

sudo apt -y --allow-unauthenticated install glusterfs-server glusterfs-common glusterfs-client

sudo systemctl enable glusterd

Ubuntu Linux 16.04, 18.04:

sudo apt-get install software-properties-common
sudo add-apt-repository -y ppa:gluster/glusterfs-6
sudo apt-get update
sudo apt-get install -y glusterfs-server
sudo systemctl enable glusterd

CentOS 7:

sudo yum install -y centos-release-gluster6
sudo yum install -y glusterfs-server
sudo systemctl enable glusterd
sudo systemctl start glusterd

Добавление узлов в пул

Для добавления узлов в пул узлов необходимо на любом из узлов выполнить команду:

sudo gluster peer probe  server1.private
sudo gluster peer probe  server2.private
sudo gluster peer probe  server3.private

Посмотреть добавленные в пул узлы можно командой:

sudo gluster pool list

UUID					Hostname       	State
d50ed443-3e63-4eb1-98e1-25b55899b00e	server2.private	Connected 
88477f16-75f0-4946-82bd-4725e4bcb292	server3.private	Connected 
ae3132f4-a8cf-433b-8746-e358e8f4d9b1	localhost      	Connected 

Создание тома хранения данных

Теперь, когда все серверы находятся в пуле, можно создать том для хранения данных. Поскольку в нашем примере том создается в корневой файловой системе, нам придется использовать аргумент force.

sudo gluster volume create gfs replica 3 server{1,2,3}.private:/opt/gluster-volume force

volume create: gfs: success: please start the volume to access data

Убедиться в том, что том создан можно с помощью команды:

sudo gluster volume list

gfs

Для активации тома его необходимо запустить:

sudo gluster volume start gfs

volume start: gfs: success

Теперь можно запросить состояние тома gfs:

sudo gluster volume status gfs

Status of volume: gfs
Gluster process                             TCP Port  RDMA Port  Online  Pid
------------------------------------------------------------------------------
Brick server1.private:/opt/gluster-volume   49152     0          Y       6741 
Brick server2.private:/opt/gluster-volume   49152     0          Y       6558 
Brick server3.private:/opt/gluster-volume   49152     0          Y       7504 
Self-heal Daemon on localhost               N/A       N/A        Y       6764 
Self-heal Daemon on server2.private         N/A       N/A        Y       6581 
Self-heal Daemon on server3.private         N/A       N/A        Y       7527 
 
Task Status of Volume gfs
------------------------------------------------------------------------------
There are no active volume tasks

Информация о томе:

sudo gluster volume info gfs
 
Volume Name: gfs
Type: Replicate
Volume ID: d1408265-bc67-4501-b255-efd165fba094
Status: Started
Snapshot Count: 0
Number of Bricks: 1 x 3 = 3
Transport-type: tcp
Bricks:
Brick1: server1.private:/opt/gluster-volume
Brick2: server2.private:/opt/gluster-volume
Brick3: server3.private:/opt/gluster-volume
Options Reconfigured:
transport.address-family: inet
nfs.disable: on
performance.client-io-threads: off

Настройка доступа к тому

Для настройки безопасности выполните следующие команды, которые позволяют получать доступ к тому только этим трем серверам, на которых установлен GlusterFS, если у вас есть другие клиенты, их необходим тоже добавить:

sudo gluster volume set gfs auth.allow 10.0.0.1,10.0.0.2,10.0.0.3

Монтирование тома

Проверим монтирование тома в ручном режиме, выполнив на каждом узле:

sudo mkdir /mnt/gluster
sudo mount.glusterfs localhost:/gfs /mnt/gluster

Проверим, что в файловую систему можно добавлять файлы и они становятся доступны на других узлах. Запустите эту команду на любом из узлов:

sudo dd if=/dev/zero of=/mnt/gluster/file bs=1M count=1

1+0 записей получено
1+0 записей отправлено
1048576 bytes (1,0 MB, 1,0 MiB) copied, 0,00641666 s, 163 MB/s

Проверьте на двух других узлах, что файл доступен:

ls -la /mnt/gluster

итого 1032
drwxr-xr-x 3 root root    4096 апр 18 10:38 .
drwxr-xr-x 3 root root    4096 апр 18 10:37 ..
-rw-r--r-- 1 root root 1048576 апр 18 10:38 file

Добавьте на каждом хосте запись в /etc/fstab для автоматического монтирования тома при запуске системы:

echo 'localhost:/gfs /mnt/gluster glusterfs defaults,_netdev,backupvolfile-server=localhost 0 0' | sudo tee -a /etc/fstab

Перезапустите каждый сервер поочередно для того, чтобы убедиться, что после старта сервер автоматически монтирует каталог /mnt/gluster:

df -h /mnt/gluster
Файл.система   Размер Использовано  Дост Использовано% Cмонтировано в
localhost:/gfs    20G         2,7G   16G           15% /mnt/gluster

Почему не Ceph

По сравнению с GlusterFS Ceph более сложна в настройке и более тяжеловесна (MON,OSD, MDS). Для распределенных файловых систем начального уровня, которые развертываются на малом количестве узлов GlusterFS выглядит более предпочтительной и легковесной.