Гластер работает в User Space и поверх существующих файловых систем, что в свою очередь добавляет определенные накладные расходы. Особенно в случае небольших файлов. Но, если от хранилища требуется в первую очередь отказоустойчивость и простота, GlusterFS идеально подойдет на данную роль. Для повышения производительности хранилища можно выстроить отдельную сеть с поддержкой InfiniBand RDMA, но это несколько усложнит всю систему.
GlusterFS представляет из себя службу glusterd, которая отдает клиентам указанное ему хранилище в качестве тома, синхронизирует хранилище между brick’ами (единица хранения GlusterFS - представляет из себя простой каталог).
В данной статье я хочу продемонстрировать простой деплой кластера, состоящий из трех нод, базовые настройки и управление кластером. Все это поможет в короткий срок ознакомится с данной технологией и решить можно ли будет использовать ее в Вашей производственной среде.
Подготовка виртуальных машин
Для начала нам понадобятся три сервера. Я буду использовать Ubuntu 20.04 Server. Каждая машина будет иметь на борту 1 ядро, 1024 МБ ОЗУ, 2 виртуальных SSD накопителя. Один на 10ГБ, будет использоваться исключительно под систему, второй на 20ГБ, будет целиком отдан под хранилище. Машины будут иметь следующие адреса и имена.
172.16.0.1 glstr-n1
172.16.0.2 glstr-n2
172.16.0.3 glstr-n3
Если нет возможности использовать DNS, будет достаточно сделать записи в файле /etc/hosts на каждом сервере:
sudo echo -e "172.16.0.1 glstr-n1 \n172.16.0.2 glstr-n2 \n172.16.0.3 glstr-n3" >> /etc/hosts
В качестве клиента будет выступать виртуальная машина glsrt-cl с IP адресом 172.16.0.254.
В нем также надо добавить строку в /etc/hosts.
Само собой, все эти и последующие действия надо выполнить на все трех нодах.
Подготовка хранилища
Далее следует подготовить хранилище. Я планирую сделать простое реплицируемое хранилище с одним экземпляром данных на одной ноде кластера. Это будет эквивалентно трехстороннему зеркальному рейду.
В первую очередь надо создать раздел на подготовленном хранилище (в моем случае, это /dev/sdb). Для этого я воспользуюсь утилитой gdisk.
sudo gdisk /dev/sdb
Далее выберу создание нового раздела (n) и отдам весь накопитель под этот раздел.
После чего можно сохранить настройку и выйти (w).
Теперь надо отформатировать этот раздел. В моем случае это будет файловая система XFS.
sudo mkfs.xfs /dev/sdb1
Создадим каталог /gluster, в который примонтируем данный раздел.
mkdir /gluster
Для монтирования сразу пропишем его в /etc/fstab.
sudo echo -e "/dev/sdb1 \t/gluster \txfs \tdefaults \t0 \t0" >> /etc/fstab
sudo mount -a
Утилитой df можно проверить что все прошло хорошо. В выводе должна присутствовать строчка.
/dev/sdb1 20G 0G 0G 0% /gluster
Подготовим сетевой экран, в нашем случае, в качестве сетевого экрана выступает UFW.
Сначала его надо включить.
sudo ufw enable
И добавить порт ssh, разрешив его только для нужного адреса. В моем случае, пусть будет так:
sudo ufw allow proto tcp from 172.16.0.100 to any port 22
Надо открыть порты для обмена информацией между glusterd:
sudo ufw allow proto tcp from 172.16.0.0/30 to any port 24007, 24008
sudo ufw allow proto udp from 172.16.0.0/30 to any port 111
И порты для клиента:
sudo ufw allow proto tcp from 172.16.0.254 to any port 24007, 24008, 49152, 49154, 49155
Установка GlusterFS
Теперь можно приступать к установке и настройке самой GlusterFS. Тут все предельно просто.
Обновляем пакеты.
sudo apt update
Ставим сервис.
sudo apt install -y glusterfs-server
Включаем службу.
sudo systemctl enable glusterd
Убедиться, что служба установлена и работает можно, выполнив, команду.
sudo systemctl glusterd status
Поле Active должно быть в состоянии active (running).
На этом установку можно считать законченной.
Настройка GlusterFS
Первым делом надо сделать так, чтобы сервера видели друг друга.
sudo gluster peer probe glstr-n1, glstr-n2, glstr-n3
Проверить, что все прошло успешно можно, выполнив команду:
sudo gluster peer statusВ выводе мы должны увидеть остальные ноды нашего кластера. Например:
Number of Peers: 2 Hostname: glstr-n2 Uuid: 8c945f19-6422-4a05-a000-6d6b9f76832a State: Peer in Cluster (Connected) Hostname: glstr-n3 Uuid: 7fd95426-db1b-49c7-a2b8-fcd0f9bb573a State: Peer in Cluster (Connected)
Далее создадим папку, которая будет служить нам brick'ом.
mkdir /gluster/brick0
Создадим том. Это можно выполнить один раз на любой из нод кластера.
gluster volume create gv replica 3 glstr-n1:/gluster/brick glstr-n2:/gluster/brick glstr-n3:/gluster/brick
Где gv это имя тома, replica – тип тома.
Запускаем том:
gluster volume start gv
На этом базовая настройка закончена.
Установка клиента GlusterFS
В данной статье, я буду рассматривать только подключение через glusterfs-client.
Заходим на машину glst-cl, которая будет выступать у нас в качестве клиента
Тут все так же предельно просто. Устанавливаем клиент:
sudo apt update
sudo apt install -y glusterfs-client
Создаем каталог.
mkdir /gluster-storage
Монтируем том стразу через /etc/fstab. Добавляем строку.
glstr-n1:gv /gluster-storage glusterfs defaults,_netdev,backupvolfile-server=glstr-n2:glstr-n3 0 0
Параметр: backupvolfile-server=glstr-n2:glstr-n3 – указывает на дополнительные ноды кластера.
Перечитываем fstab.
mount -a
На этом базовая настройка завершена.
Управление кластером
Перечислю несколько базовых команд для управления кластером. Запустить их можно с любого узла кластера.
sudo gluster help
sudo gluster volume help
Справка.
sudo gluster volume heal gv info
Покажет информацию о рассинхронизованых файлах на томе, если таковые есть.
sudo gluster volume info gv
Покажет информацию о томе.
sudo gluster volume heal gv0
Ручная синхронизация файлов.
Некоторые значимые параметры
Кластер имеет множество настроек. Посмотреть их можно командой:
sudo gluster volume get gv all
Переопределить параметры можно командой:
sudo gluster volume set gv [ИмяПараметра] [ЗначениеПараметра], например:
sudo gluster volume set gv performance.cache-size 256MB
Установит размер кэша кластера в 256 Мб.
cluster.favorite-child-policy
Политика автоматического восстановления после split-brain. Может принимать следующие значения:
- none: Значение по-умолчанию;
- size: Приоритет буду иметь файлы большего размера;
- ctime: Приоритет будут иметь файлы с более поздней датой изменения прав доступа или владельца;
- mtime: Приоритет будут иметь файлы с более поздней датой изменения;
- majority: выбирает файл с одинаковым mtime и размером более чем в половине количества brick в реплике.
performance.readdir-ahead и performance.parallel-readdir
Повышает производительность листинга каталогов.
Значения: on\off
Операции чтения небольших файлов
Производительность повышается за счет включения кэша на клиенте.
performance.cache-invalidation on
features.cache-invalidation on
performance.qr-cache-timeout 600 --> 10 min recommended setting
cache-invalidation-timeout 600 --> 10 min recommended setting
Заключение
В данной статье я попытался описать базовую установку и настройку отказоустойчивого хранилища GlusterFS. За рамками данной статьи осталось множество различных аспектов, таких как шифрование и аутентификация по открытому RSA ключу, распределенный (в рамках глобальной сети) кластер, отличные от репликации виды томов. Обо всем этом можно прочитать в документации https://docs.gluster.org/en/v3 или заказать у нас уже настроенный сервис.