Настройка отказоустойчивого кластера GlusterFS (Replica + Arbiter)

Автор George, Май 13, 2026, 08:17

« назад - далее »

George

данной инструкции рассматривается создание отказоустойчивого хранилища для директории /var/www с защитой от ситуации Split-Brain.
Наша архитектура (3 ноды):
Node 1 (Web1): 10.10.1.42 — Хранение реальных данных
Node 2 (Web2): 10.10.1.41 — Хранение реальных данных
Node 3 (ISPConfig): 10.10.1.43 — Arbiter (хранит только метаданные для кворума, диск может быть маленьким: 5–10 ГБ).
ШАГ 1. Подготовка LVM на нодахВыполняется на всех нодах, где выделен отдельный диск (например, /dev/sdb).
1.1. Создаем Physical Volume (PV):
Код: bash
pvcreate /dev/sdb
1.2. Создаем Volume Group (VG):
Код: bash
vgcreate vg_gluster /dev/sdb
1.3. Создаем Logical Volume (LV) на всю доступную емкость:
Код: bash
lvcreate -l 100%FREE -n lv_gluster vg_gluster
ШАГ 2. Форматирование и монтированиеВыполняется на всех нодах. GlusterFS рекомендует использовать файловую систему XFS.
2.1. Форматируем созданный том:
Код: bash
mkfs.xfs /dev/vg_gluster/lv_gluster
2.2. Создаем точку монтирования:
Код: bash
mkdir -p /data/gluster
2.3. Добавляем запись в /etc/fstab для автозапуска при загрузке (одной командой):
Код: bash
echo "/dev/vg_gluster/lv_gluster /data/gluster xfs defaults,noatime 0 0" | sudo tee -a /etc/fstab
2.4. Монтируем диск:
Код: bash
systemctl daemon-reload
mount -a
Проверяем
Код: bash
lsblk
ШАГ 3. Создание кирпича (Brick) — Важный нюанс!Выполняется на всех нодах.
ВНИМАНИЕ: Никогда не делайте корневую папку монтирования (/data/gluster) самим бриком. Запишите данные строго в подпапку.
3.1. Создаем подпапку под кирпич:
Код: bash
mkdir -p /data/gluster/brick1
3.2. Выставляем корректные права:
Код: bash
chown -R root:root /data/gluster
chmod -R 755 /data/gluster
ШАГ 4. Установка GlusterFSВыполняется на всех трех нодах.
Код: bash
apt update && apt install -y glusterfs-server
systemctl enable --now glusterd
ШАГ 5. Объединение нод в доверенный пул (Cluster)Выполняется строго только на первой ноде (10.10.1.42).
5.1. Добавляем вторую и третью ноды в кластер:
Код: bash
gluster peer probe 10.10.1.41
gluster peer probe 10.10.1.43
5.2. Проверяем статус подключения (статус должен быть Peer in Cluster (Connected)):
Код: bash
gluster peer status

ШАГ 6. Создание тома с типом ArbiterВыполняется на первой ноде (10.10.1.42).
ПРАВИЛО ОЧЕРЕДНОСТИ:

В схеме replica 3 arbiter 1 арбитром автоматически становится ПОСЛЕДНИЙ указанный в команде brick. Проверьте правильность IP-адресов перед запуском!
6.1. Создаем том webdata:
Код: bash
gluster volume create webdata replica 3 arbiter 1 10.10.1.42:/data/gluster/brick1 10.10.1.41:/data/gluster/brick1 10.10.1.43:/data/gluster/brick1 force
6.2. Обязательно проверяем, что третья нода определилась именно как арбитр:
Код: bash
gluster volume info
В выводе вы должны увидеть отметку: Brick3: 10.10.1.43:/data/gluster/brick1 (arbiter)
6.3. Запускаем созданный том:
Код: bash
gluster volume start webdata
6.4. Проверяем рабочий статус тома:
Код: bash
gluster volume status

ШАГ 7. Монтирование тома на Web-ноды
Выполняется только на Web-нодах (10.10.1.42 и 10.10.1.41). На ISPConfig (ноде-арбитре) монтировать не нужно.
7.1. Создаем целевую директорию для сайтов:
Код: bash
mkdir -p /var/www
7.2. Монтируем сетевую файловую систему GlusterFS:
Код: bash
mount -t glusterfs 10.10.1.42:/webdata /var/www
7.3. Прописываем автоматическое монтирование после старта сети в /etc/fstab:
Код: bash
echo "10.10.1.42:/webdata /var/www glusterfs defaults,_netdev,backupvolfile-server=10.10.1.41:10.10.1.43 0 0" | sudo tee -a /etc/fstab

ШАГ 8. Тюнинг производительности для Web-окруженияВыполняется на первой ноде для оптимизации работы с мелкими файлами скриптов.
Код: bash
gluster volume set webdata performance.cache-size 256MB
gluster volume set webdata performance.write-behind on
gluster volume set webdata network.ping-timeout 5

ШАГ 9. Проверка репликации (Тест)На Node 1 создаем тестовый файл:
Код: bash
echo "GlusterFS Cluster Works" > /var/www/test.txt
На Node 2 проверяем его наличие и содержимое:
Код: bash
cat /var/www/test.txt
Если текст отобразился — ваш отказоустойчивый кластер настроен правильно!

🛠 Возможные проблемы и их решениеОшибка:
Код: bash
Host 10.10.1.41 is not in 'Peer in Cluster' state
Причина:
Вы пытаетесь создать Volume до того, как ноды успешно установили связь друг с другом.
Решение: См. ШАГ 5.
Проверьте вывод
Код: bash
gluster peer status
.
Если соединение отсутствует, убедитесь, что порты GlusterFS (24007, 49152 и далее) не заблокированы брандмауэром (ufw/iptables).
Ошибка:
Перепутали порядок нод при создании Volume (арбитром стала не та нода).
Решение: Пересоздайте том заново, выполнив команды:
Код: bash
gluster volume stop webdatagluster volume delete webdata
После чего повторите ШАГ 6 с правильным порядком IP-адресов.
  •  

George

📊 Статус кластера и нод (Peers)

Посмотреть состояние подключений других нод к текущему серверу:
Код: bash
gluster peer status
Вывести список всех серверов, входящих в доверенный пул (включая локальный):
Код: bash
gluster pool list
Удалить ноду из кластера (перед этим на ней нужно остановить все брики):
Код: bash
gluster peer detach [IP_или_ИМЯ_НОДЫ]

📂 Управление томами (Volumes)
Вывести список имен всех созданных томов:
Код: bash
gluster volume list
Показать подробную конфигурацию тома (тип репликации, список кирпичей, опции):
Код: bash
gluster volume info [ИМЯ_ТОМА]
Показать текущий статус тома (онлайн ли кирпичи, PID процессов, порты):
Код: bash
gluster volume status [ИМЯ_ТОМА]
Остановить работу тома (необходимо перед удалением тома):
Код: bash
gluster volume stop [ИМЯ_ТОМА]
Полностью удалить том из системы (данные на дисках при этом не стираются автоматически):
Код: bash
gluster volume delete [ИМЯ_ТОМА]

🧱 Управление кирпичами (Bricks / "Дисками")
Посмотреть детальную информацию по дискам конкретного тома (размер, свободное место, inode):
Код: bash
gluster volume status [ИМЯ_ТОМА] detail
Заменить вышедший из строя или старый кирпич на новый без остановки кластера:
Код: bash
gluster volume replace-brick [ИМЯ_ТОМА] [СТАРЫЙ_IP:/путь] [НОВЫЙ_IP:/путь] commit force
Очистить расширенные атрибуты (xattrs) на директории кирпича, если вы принудительно пересоздаете заваленный том на старом месте:
Код: bash
setfattr -x trusted.glusterfs.volume-id /data/gluster/brick1setfattr -x trusted.gfid /data/gluster/brick1rm -rf /data/gluster/brick1/.glusterfs

📈 Мониторинг и диагностика (Профайлинг)Включить сбор статистики производительности для конкретного тома:
Код: bash
gluster volume profile [ИМЯ_ТОМА] start
Посмотреть текущую статистику (количество операций ввода-вывода, latency, чтение/запись):
Код: bash
gluster volume profile [ИМЯ_ТОМА] info
Остановить сбор статистики:
Код: bash
gluster volume profile [ИМЯ_ТОМА] stop
Посмотреть информацию о заблокированных файлах (полезно при зависании процессов):
Код: bash
gluster volume statedump [ИМЯ_ТОМА]
Файл дампа сохранится в директорию /var/run/gluster/ или /var/log/glusterfs/

🪵 Логи системыGlusterFS пишет детальные логи для каждого компонента отдельно. Найти их можно в системной директории:
Главный лог демона управления (ошибки подключения нод, создание томов):
Код: bash
tail -f /var/log/glusterfs/glusterd.log
Лог конкретного кирпича (замените путь на ваш, точки заменяются дефисами):
Код: bash
tail -f /var/log/glusterfs/bricks/data-gluster-brick1.log
Лог клиента на стороне монтирования (ошибки со стороны Web-нод):
Код: bash
tail -f /var/log/glusterfs/var-www.log

⚙️ Сброс настроек (Если всё сломалось)
Команда для принудительного снятия опций тюнинга и возврата к стандартным значениям:
Код: bash
gluster volume reset [ИМЯ_ТОМА] [НАЗВАНИЕ_ОПЦИИ]
  •  

George

Автоматическое восстановление данных (Self-Heal)
в GlusterFSВ реплицируемых томах (включая схемы с Arbiter) GlusterFS умеет автоматически восстанавливать согласованность данных. Если одна из нод уходила в офлайн (перезагрузка, сбой сети), а затем вернулась, механизм Self-Heal Daemon (shd) обнаружит разницу в метаданных и синхронизирует файлы.
ШАГ 1. Проверка статуса автоматического лечения
Выполняется на любой рабочей ноде.
По умолчанию в современных версиях GlusterFS функция лечения включена. Проверить её состояние можно командой:
Код: bash
gluster volume info webdata

В выводе найдите строку cluster.self-heal-daemon. Она должна иметь значение on или enable.
Если по какой-то причине демон выключен, включите его принудительно:
Код: bash
gluster volume set webdata cluster.self-heal-daemon on

ШАГ 2. Мониторинг процесса восстановленияЧтобы узнать, есть ли прямо сейчас файлы, ожидающие синхронизации (очередь на лечение), выполните:[
code]gluster volume heal webdata info[/code]

Интерпретация вывода:Если для каждого кирпича (Brick) написано Number of entries: 0 — все данные полностью синхронны, кластер здоров.Если число больше нуля — эти файлы прямо сейчас находятся в очереди на копирование.Посмотреть список файлов, которые заблокированы из-за критического рассинхрона (Split-Brain):

Код: bash
gluster volume heal webdata info split-brain

ШАГ 3. Ручной запуск лечения (Если нужно срочно)GlusterFS проверяет файлы при обращении к ним (клиентский self-heal) или по таймеру демона. Если вы только что включили упавшую ноду и хотите немедленно запустить полную проверку и синхронизацию всего тома, выполните:[
code]gluster volume heal webdata[/code]
Чтобы проверить состояние запущенного вручную процесса:
Код: bash
gluster volume heal webdata info healed
ШАГ 4. Тюнинг производительности леченияВыполняется на первой ноде.
Если на серверах хранятся миллионы мелких файлов (что часто бывает в /var/www у CMS вроде WordPress или Bitrix), стандартная скорость проверки может замедлять дисковую систему, либо наоборот — лечить слишком медленно.Регулировка количества потоков лечения (по умолчанию 1).
Увеличение ускорит синхронизацию, но поднимет нагрузку на CPU и диски:
Код: bash
gluster volume set webdata cluster.healer-count 4
Включение ускоренного сканирования мелких файлов:
Код: bash
gluster volume set webdata performance. those-readdir-ahead on

🚨 Что делать, если файл попал в Split-Brain?Если две ноды одновременно записывали данные в один файл, пока связь между ними была разорвана, арбитр может не справиться, и файл заблокируется (ошибка ввода-вывода при попытке открыть).
Самый простой и безопасный способ решить это — сказать GlusterFS, какая из нод (выбираем по IP) содержит правильную/свежую версию файла, чтобы затереть устаревшую на другой ноде:
Код: bash
gluster volume heal webdata split-brain favorite-child-replica 10.10.1.42 /test.txt
Где 10.10.1.42 — IP ноды с актуальными данными, а /test.txt — путь к проблемному файлу относительно корня тома.
  •  

🡱 🡳

Отметьте интересные вам фрагменты текста и они станут доступны по уникальной ссылке в адресной строке браузера.