Отказоустойчивый кластер
1. Как устроено
клиенты Windows: \\HOPEFS\Docs (DNS: HOPEFS → 10.0.0.50)
│
плавающий IP 10.0.0.50 (роль HOPEFS)
┌─────────────────┴─────────────────┐
┌─────┴─────┐ heartbeat HTTPS :7443 ┌─────┴─────┐
│ узел FS1 │◄──────────────────────►│ узел FS2 │
│ (владелец)│ репликация данных │ (резерв) │
└─────┬─────┘ └─────┬─────┘
│ голос кворума │
└──────────► свидетель ◄───────────┘
(hopedfs witness)
- Узлы — серверы HopeDFS с общей конфигурацией (шары, учётки, домен, роли).
- Роль файлового сервера — сетевое имя + плавающий IP + набор шар (аналог роли «Файловый сервер» в Failover Cluster Manager). В каждый момент роль работает на одном узле.
- Кворум — большинство голосов (узлы + свидетель). Узел без кворума снимает с себя роли и IP — так исключается split-brain (две копии роли одновременно).
- Координатор — живой узел с кворумом и наименьшим приоритетом: назначает владельцев ролей и применяет изменения конфигурации.
- Отказ: узел перестал отвечать дольше «таймаута отказа» (6 с по умолчанию) → после паузы изоляции роль поднимается на следующем узле (IP + gratuitous ARP), клиенты Windows переподключаются сами. Типичное время переключения — 8–12 с. Открытые на момент отказа файлы клиенту приходится открыть заново.
2. Хранение данных шар
| Режим | Когда использовать |
|---|---|
Общий том (shared) |
SAN (iSCSI/FC) с кластерной ФС, NFS 4.2, CephFS, GlusterFS — один и тот же путь смонтирован на всех узлах. Данные не копируются, переключение мгновенное. ФС должна поддерживать user xattr. |
Встроенная репликация (replicated) |
у каждого узла свой диск с тем же путём (например, /srv/data). Владелец роли ведёт журнал изменений; реплики забирают изменённые файлы вместе с NTFS-метаданными. Синхронный режим: закрытие файла клиентом ждёт подтверждения реплик (до 15 с) — без потери данных при отказе. Асинхронный — быстрее, при отказе возможна потеря последних секунд изменений. |
Локальная папка (local) |
без отказоустойчивости данных (одиночный сервер). |
После возвращения отказавшего узла он сверяет дерево с текущим владельцем и догоняет изменения;
файлы, изменённые на нём и потерявшие актуальность, сохраняются в <шара>/.hopedfs/conflicts.
3. Создание кластера из двух узлов со свидетелем
Пример: FS1 10.0.0.21, FS2 10.0.0.22, свидетель 10.0.0.29, роль HOPEFS с VIP 10.0.0.50/24.
- Лицензии: на FS1 и FS2 примените лицензию Enterprise (раздел «Лицензия», у каждого узла своя). Свидетелю лицензия не нужна.
- Установка (раздел 2 «Установки»): на FS1 и FS2 —
sudo bash install.sh, на свидетеле10.0.0.29—sudo MODE=witness bash install.sh. Для встроенной репликации создайте одинаковые пустые каталоги на FS1 и FS2:mkdir -p /srv/data/Docs. - FS1 → панель → «Кластер» → «Создать кластер»: имя, адрес узла
10.0.0.21:7443. - FS1 → «Пригласить узел» → скопируйте токен.
- FS2 → панель → «Кластер» → «Присоединиться»: токен, адрес
10.0.0.22:7443. Конфигурация FS2 заменяется кластерной; войдите в панель заново учёткой кластера. - FS1 → «Параметры и свидетель»: адрес
10.0.0.29:7443, логин/пароль администратора свидетеля (из его/var/lib/hopedfs/initial_admin_password.txt) → «Сохранить». Кворум станет «3 из 3». - «Создать роль»: имя
HOPEFS, VIP10.0.0.50/24, хранение — общий том или репликация, предпочтительные владельцы FS1, FS2. - «Общие папки» → создайте шары и выберите роль
HOPEFS. - DNS: A-запись
HOPEFS → 10.0.0.50. Если сервер подключён к домену — «Домен» → выполните подключение к домену повторно, чтобы создать учёткуHOPEFS$для Kerberos.
Клиенты подключаются к \\HOPEFS\Docs.
4. Обслуживание
| Задача | Действие |
|---|---|
| Плановые работы на узле | «Приостановить» узел — роли уйдут на другие; после работ — «Возобновить» |
| Перенести роль | значок «Переместить» у роли → выбрать узел (или «Автоматически» — вернуть под управление кластера) |
| Остановить роль | «Остановить» — IP снимается, шары роли недоступны |
| Вернуть роль на основной узел после восстановления | в свойствах роли включить «Возвращать роль на предпочтительный узел» |
| Лицензионное соглашение | принимается в панели каждого узла отдельно (запись хранится на узле); службы узла работают и до принятия |
| Обновить версию | по одному узлу: «Приостановить» → «Настройки» → «Обновления» (выбрать узел вверху страницы) или install.sh с новым бинарником → «Возобновить»; все узлы — на одну версию (после обновления — Ctrl+F5 в панели) |
| Вывести узел навсегда | на узле «Вывести этот узел»; если узел мёртв — «Исключить» на любом живом |
| Состояние репликации | карточка «Репликация»: эпоха журнала, применённые записи, отставание, ошибки |
5. Лицензии в кластере
Отказоустойчивый кластер доступен только в редакции Enterprise, лицензия Enterprise нужна каждому узлу: без неё нельзя создать кластер, пригласить узел или присоединиться (координатор проверяет и лицензию нового узла). Лицензия привязана к узлу и не реплицируется — каждому узлу свой ключ (как в HopeDC). Если у работающего узла кластера лицензия перестала быть Enterprise, кластер продолжает работать, но панель предупреждает об этом и не даёт приглашать новые узлы. Подробно — «Руководство администратора», раздел «Лицензия и редакции».
6. Сеть
- Между узлами и свидетелем должен быть открыт 7443/tcp (обмен подписан HMAC ключом кластера, шифруется TLS).
- VIP должен быть из подсети одного из интерфейсов узлов (интерфейс определяется по подсети или задаётся в роли).
- Коммутаторы должны принимать gratuitous ARP (обычно так и есть). В облаках (AWS/Azure/GCP/Яндекс) плавающий IP через ARP не работает — используйте балансировщик облака или назначение IP через API.
- Разные подсети (метрокластер) — роль без VIP + DNS с коротким TTL, либо отдельные роли на площадку.
- Удалённые площадки с медленным каналом лучше связывать не одним кластером, а репликацией между площадками (раздел 15 «Руководства администратора»): кластер целиком подключается к группе репликации как один участник.
7. Кворум — что будет при отказах
| Конфигурация | Отказ | Результат |
|---|---|---|
| 2 узла + свидетель | 1 узел | работает (2 из 3 голосов) |
| 2 узла + свидетель | свидетель | работает (2 из 3) |
| 2 узла + свидетель | связь между узлами (свидетель видит обоих) | роль остаётся у узла, получившего голос свидетеля |
| 2 узла без свидетеля | 1 узел | роли поднимает узел с меньшим приоритетом (только если отказал другой); при разрыве связи без свидетеля возможен простой — используйте свидетель |
| 3 узла | 1 узел | работает (2 из 3) |
8. Защита от шифровальщиков в кластере
- Настройки защиты, действующие блокировки и список инцидентов — часть общей конфигурации кластера. Источник атаки, обнаруженный на одном узле, сразу теряет право записи и на остальных узлах — в том числе на ролях, которые обслуживают другие узлы, и после переноса роли.
- Атаку обнаруживает узел, обслуживающий роль, к которой подключён шифратор. На нём хранятся журнал файлов
инцидента (
/var/lib/hopedfs/ransom/) и выполняется восстановление — панель сама отправляет эти запросы нужному узлу (в окне инцидента указан узел). - Страховочные копии и карантин лежат в служебной папке шары (
.hopedfs/ransom/): на общем томе они переезжают вместе с ролью, при встроенной репликации остаются на узле, где были сделаны. - Файлы-ловушки создаёт узел-владелец роли; в репликации между площадками они не участвуют — у каждого сервера свои.