Общее хранилище на NFS + GlusterFS: кластер для small-office
Меня зовут Семёнов Евгений Сергеевич, директор АйТи Фреш. За 15+ лет я собирал общие хранилища на всём, что двигалось: от древних FreeNAS и Windows Storage Spaces до StarWind vSAN и Ceph. Но когда нужна разумная отказоустойчивость без цены СХД Dell EMC и без сложности Ceph — я почти всегда беру GlusterFS. Трёхнодовый кластер с репликацией, экспорт через NFS-Ganesha или Samba, и вы получаете Enterprise-класс хранилища за деньги трёх обычных серверов.
Когда именно нужен GlusterFS
Сразу оговорюсь: не каждой компании нужен кластер. Если у вас пять пользователей и один файловый сервер — хватает обычной Samba с резервным копированием. GlusterFS имеет смысл в четырёх сценариях:
- Виртуализация с живой миграцией. Общий том под Hyper-V/Proxmox/oVirt, чтобы гипервизор А мог перетянуть виртуалку на гипервизор Б.
- Кластер веб-серверов. Nginx/Apache на трёх нодах, общий контент и пользовательские загрузки.
- Бэкап и медиа-архивы. Холодное хранение десятков ТБ с репликацией для защиты от потери железа.
- Корпоративные общие папки 24/7. Когда простой файл-сервера на полдня — это потерянные деньги.
В моей практике самый распространённый сценарий — первый. Клиенты хотят VMware-подобную живую миграцию, но без лицензий vSAN. GlusterFS + NFS отдаёт такое поведение на open-source стеке.
Архитектура и требования к железу
Минимальный продакшн — три ноды в одном дата-центре или в двух близкорасположенных. Каждая нода — обычный 1U/2U сервер, без специального hardware. Я рекомендую:
| Компонент | Для офиса 50 РМ | Для виртуализации |
|---|---|---|
| CPU | Xeon Silver 8 cores | Xeon Platinum 8280 / EPYC 7443 |
| RAM | 32 ГБ | 128–256 ГБ |
| Диски под bricks | 2× 4 ТБ SATA SSD | 4× 3.84 ТБ NVMe |
| Система | 2× 240 ГБ SSD RAID1 | 2× 480 ГБ NVMe RAID1 |
| Сеть клиентов | 2× 1 Гбит LACP | 2× 10 Гбит или 25 Гбит |
| Сеть репликации | 2× 10 Гбит LACP | 2× 40 Гбит Mellanox |
Сетевое разделение критично: я ни разу не ставил Gluster без отдельной сети репликации. Когда клиенты заливают большие файлы, трафик репликации не конкурирует с клиентским.
Базовая подготовка нод
Три сервера: gfs01, gfs02, gfs03. Ubuntu 22.04 LTS на системном RAID1, отдельные NVMe под bricks. Форматируем brick-диски в XFS — Gluster оптимизирован именно под него:
# На каждой ноде
mkfs.xfs -i size=512 /dev/nvme1n1
mkdir -p /data/brick1
echo '/dev/nvme1n1 /data/brick1 xfs defaults,noatime 0 0' >> /etc/fstab
mount -a
mkdir /data/brick1/gv0
Правим /etc/hosts, чтобы не зависеть от DNS:
10.10.10.11 gfs01
10.10.10.12 gfs02
10.10.10.13 gfs03
Ставим пакет Gluster из официального PPA:
add-apt-repository ppa:gluster/glusterfs-11
apt update && apt install -y glusterfs-server
systemctl enable --now glusterd
Сборка trusted pool и создание тома
С первой ноды подтягиваем остальные в пул:
gluster peer probe gfs02
gluster peer probe gfs03
gluster peer status
Создаём replicated volume с репликой 3 (хранение одной и той же копии на каждой ноде):
gluster volume create gv0 replica 3 \
gfs01:/data/brick1/gv0 \
gfs02:/data/brick1/gv0 \
gfs03:/data/brick1/gv0
gluster volume start gv0
gluster volume info gv0
Включаем обязательные опции, которые я всегда ставлю на продакшн:
gluster volume set gv0 performance.cache-size 2GB
gluster volume set gv0 performance.write-behind-window-size 4MB
gluster volume set gv0 performance.io-thread-count 32
gluster volume set gv0 network.ping-timeout 10
gluster volume set gv0 cluster.quorum-type auto
gluster volume set gv0 cluster.server-quorum-type server
gluster volume set gv0 cluster.favorite-child-policy mtime
Экспорт через NFS-Ganesha
Gluster умеет отдавать тома нативным клиентом (FUSE), но Windows и большинство готовых appliance не могут монтировать Gluster. Поэтому ставим NFS-Ganesha — userspace NFS-сервер с прямой интеграцией в Gluster:
apt install -y nfs-ganesha nfs-ganesha-gluster
Конфиг /etc/ganesha/ganesha.conf:
EXPORT {
Export_Id = 1;
Path = "/gv0";
Pseudo = "/gv0";
Access_Type = RW;
Squash = No_root_squash;
Disable_ACL = FALSE;
Protocols = "3","4";
Transports = "TCP";
SecType = "sys";
FSAL {
Name = GLUSTER;
Hostname = "localhost";
Volume = "gv0";
}
}
NFS_CORE_PARAM {
MNT_Port = 20048;
NLM_Port = 32803;
}
Запускаем на всех трёх нодах:
systemctl enable --now nfs-ganesha
showmount -e localhost
Подключение клиентов
У нас на практике три типа клиентов:
Linux с нативным Gluster-клиентом — самый быстрый вариант. Клиент сам подключается ко всем нодам и читает с ближайшей:
apt install -y glusterfs-client
mount -t glusterfs gfs01:/gv0 /mnt/shared
# fstab
gfs01:/gv0 /mnt/shared glusterfs defaults,_netdev,backup-volfile-servers=gfs02:gfs03 0 0
Linux/гипервизоры через NFS:
mount -t nfs4 -o vers=4.1 10.10.10.11:/gv0 /mnt/storage
Windows Server с установленным Services for NFS:
Install-WindowsFeature NFS-Client -IncludeManagementTools
New-PSDrive -Name "S" -PSProvider "FileSystem" -Root "\\10.10.10.11\gv0" -Persist
Реальный кейс: кластер под Proxmox в юридической фирме
В апреле 2025 меня позвали в юридическую фирму в Москва-Сити. Штат 38 человек, требование — две виртуалки (AD + 1С) должны переживать физический отказ любой из нод без потери данных и с простоем не более 3 минут. Бюджет — не VMware уровня.
Собрали трёхнодовый кластер Proxmox, каждая нода — Dell R650 с Xeon Platinum 8280, 128 ГБ RAM, 4× 3.84 ТБ NVMe. Отдельная сеть репликации 40 Гбит на Mellanox ConnectX-5, клиентская сеть 2× 10 Гбит LACP. На тех же нодах — GlusterFS replica 3 с томом gv0 на 6 ТБ полезной. Proxmox смонтировал его по NFS-Ganesha как shared storage для VM.
Тестировали отказ: выключил ноду gfs02 — виртуалки продолжили работать на двух оставшихся, живая миграция прошла за 45 секунд. Вернул ноду — self-heal догнал данные за 12 минут (на 4 ТБ изменений). Клиент получил SLA 99,9%, стоимость железа 720 000 руб. на три ноды, проект внедрения — 180 000 руб.
Self-heal, мониторинг и обслуживание
Gluster сам отслеживает несогласованность реплик и чинит их. Но за процессом надо следить:
# Проверка состояния
gluster volume heal gv0 info
gluster volume heal gv0 info split-brain
gluster volume status gv0
# Принудительный heal
gluster volume heal gv0 full
На мониторинг я ставлю Prometheus с gluster_exporter и Grafana. Ключевые метрики: число файлов в heal pending, latency операций, свободное место на bricks, состояние peers. Алерты — на split-brain, более 50 файлов в heal pending в течение 15 минут, падение ноды.
Раз в квартал — учения: плановое выключение одной ноды, проверка что self-heal срабатывает. Никогда не полагайтесь на то, что «оно само работает» — проверяйте.
Типичные грабли
- Split-brain при двух нодах. Без третьей ноды или arbiter-брика вы периодически будете получать «разошедшиеся» файлы. Всегда replica 3 или replica 2 + arbiter.
- Маленькие файлы на HDD. GlusterFS на шпинделях и миллионах мелких файлов даёт адски низкий IOPS. SSD обязательны для любых рабочих нагрузок кроме холодного архива.
- Параметры по умолчанию. Без performance.cache-size и io-thread-count — хранилище работает в 3–5 раз медленнее своего потенциала.
- Один NFS-Ganesha без HA. Клиент примонтирован к gfs01 — gfs01 упал, клиент отвалился. Нужен VIP (keepalived) или ctdb перед Ganesha.
- Забытый firewall. Порт 24007/tcp, 24008/tcp, 49152-49251/tcp между нодами — иначе peers теряются.
Соберём отказоустойчивое хранилище под ваш офис
Я лично проектирую кластеры GlusterFS для компаний от 30 рабочих мест. Подберу железо, настрою ноды, репликацию, NFS-Ganesha, мониторинг и бэкап. Срок — от 7 рабочих дней.
Телефон: +7 903 729-62-41
Telegram: @ITfresh_Boss
Семёнов Евгений Сергеевич, директор АйТи Фреш
FAQ — частые вопросы
- Зачем GlusterFS, если есть обычный NFS-сервер?
- Обычный NFS живёт на одной машине — сервер упал, сервисы встали. GlusterFS реплицирует данные между нодами, и при падении одной ноды остальные продолжают отдавать файлы. Это полноценная отказоустойчивость без дорогих СХД.
- Сколько нод минимум?
- Для replicated volume минимум две, но кворум собирается только с тремя — поэтому продакшен всегда начинается с трёх нод. Можно использовать третью как arbiter (только метаданные), если экономить на дисках.
- Какую сеть использовать под репликацию?
- Минимум 10 Гбит/с между нодами на выделенных портах. Я всегда разделяю сеть клиентов и сеть репликации. На серьёзных кластерах ставим 40G Mellanox — даёт запас под рост.
- Как клиенты Windows подключаются?
- Через NFS-Ganesha, который отдаёт тома Gluster по протоколу NFSv4. Windows Server с ролью Client for NFS монтирует шару командой mount. Для полноценной интеграции лучше SMB через ctdb-Samba.
- Производительность просаживается из-за репликации?
- На запись да — пишет во все реплики синхронно. На SSD NVMe разница 15–25% по сравнению с локальным диском. Чтение масштабируется: клиент читает с ближайшей ноды.