Кластерные файловые системы [362.3]

Рейтинг: 64.6% · 12 голосов
Специализация LPIC-3 306 (v3.0): кластеры HA (Pacemaker/Corosync), балансировка (LVS, keepalived, HAProxy), DRBD, кластерные и распределённые ФС (GFS2, OCFS2, GlusterFS, Ceph), iSCSI/multipath, advanced RAID/LVM.
Ответить
Аватара пользователя
Sergey_Sysadmin
Сообщения: 134
Зарегистрирован: 11 май 2026, 05:31

Кластерные файловые системы [362.3]

Сообщение Sergey_Sysadmin »

Оглавление курса (14)
  1. Введение в LPIC-3 306: высокая доступность и хранилища
  2. Концепции и теория высокой доступности [361.1]
  3. Кластеры с балансировкой нагрузки [361.2]
  4. Failover-кластеры: Corosync и Pacemaker [361.3, часть 1]
  5. Pacemaker: ресурсы, ограничения, fencing [361.3, часть 2]
  6. DRBD [362.1]
  7. Доступ к кластерному хранилищу [362.2]
  8. Кластерные файловые системы [362.3] (вы здесь)
  9. Распределённое хранилище GlusterFS [363.1]
  10. Ceph: архитектура [363.2, часть 1]
  11. Ceph: использование и эксплуатация [363.2, часть 2]
  12. Отказоустойчивость узла: железо и сервисы [364.1]
  13. Продвинутый RAID
  14. Продвинутый LVM и сетевая отказоустойчивость [364.3 + 364.4]
Урок 7. Кластерные файловые системы [362.3]

В предыдущих уроках вы научились давать нескольким узлам один и тот же блочный том - через общий SAN-LUN или через DRBD в режиме dual-primary. Но блочное устройство - это просто массив секторов. Если вы возьмёте обычный ext4 или XFS и смонтируете его на двух узлах одновременно, вы получите не отказоустойчивость, а гарантированное разрушение данных за минуты. Этот урок про то, как сделать одну файловую систему, которую несколько узлов читают и пишут параллельно и при этом не дерутся за метаданные. Разберём GFS2 и OCFS2, их зависимость от DLM и кворумного кластера, форматирование с журналами по узлам, монтирование, и главное - чем кластерная ФС принципиально отличается от распределённой.

Изображение

Как это работает

Любая обычная локальная ФС считает, что она единственный хозяин устройства. Она кеширует блоки метаданных в памяти, отложенно сбрасывает их на диск, держит inode-битмапы и журнал в расчёте на то, что никто другой эти же секторы не трогает. Смонтируйте такую ФС на двух узлах - и каждый закеширует свою версию суперблока и битмапов, они начнут писать друг поверх друга, и согласованности не будет ни на диске, ни в памяти. Файловую систему это не чинит fsck, потому что повреждение не структурное, а логическое.

Кластерная ФС решает ровно эту проблему. Она не хранит метаданные на разных дисках - она хранит их на одном общем устройстве, но координирует доступ к ним между узлами через распределённую блокировку. Перед тем как узел тронет inode, каталог или блок данных, он берёт на него кластерную блокировку. Эту блокировку выдаёт DLM - Distributed Lock Manager, который работает поверх кластерного стека Corosync. Узел, изменивший метаданные, обязан сбросить их на диск и отдать блокировку, прежде чем другой узел её получит. Так все видят согласованное состояние.

Отсюда жёсткая зависимость: кластерная ФС не запускается без кворумного кластера. DLM получает членство и кворум от Corosync, а в Pacemaker за неё отвечают ресурсы dlm и lvmlockd (или clvmd на старых системах). Нет кворума - DLM замораживает все блокировки, и ФS встаёт колом. Это сделано намеренно: лучше зависнуть, чем продолжать писать в расколотом кластере (split-brain). Поэтому фенсинг (STONITH) обязателен - DLM не разблокируется, пока кластер не убедится, что отвалившийся узел гарантированно мёртв и не пишет в общий том.

Второй ключевой момент - журналы по узлам. У обычной ФС один журнал. У кластерной их несколько: по одному на каждый узел, который монтирует ФС одновременно. Если бы журнал был общий, узлы дрались бы ещё и за него. Поэтому при форматировании вы заранее указываете число журналов, и это число задаёт верхний предел одновременных монтирований. Хотите добавить узлы сверх лимита - доращиваете журналы отдельной операцией.

Теперь отличие от распределённых ФС, которое любят спрашивать. Кластерная ФС (GFS2, OCFS2) - это shared-disk: все узлы видят одно и то же блочное устройство (SAN, iSCSI, DRBD), а сетью гоняются только блокировки и небольшие сообщения координации. Данные по сети не передаются, узлы читают их прямо с общего диска. Распределённая ФС (CephFS, GlusterFS) - это shared-nothing: у каждого узла свои локальные диски, а сами данные реплицируются и собираются по сети. Кластерная ФС даёт低 задержку и точную POSIX-семантику, но плохо масштабируется за десяток узлов и требует общего хранилища. Распределённая масштабируется на сотни узлов на обычном железе, но платит сетевой задержкой и более слабыми гарантиями.

Команды и примеры

Сначала ставим пакеты. Состав отличается по семействам.

Debian 13 / Ubuntu 24.04 LTS:

Код: Выделить всё

apt install gfs2-utils dlm-controld lvm2-lockd
# для OCFS2:
apt install ocfs2-tools
RHEL 10 / Fedora 41+ (gfs2 живёт в репозитории Resilient Storage):

Код: Выделить всё

dnf install gfs2-utils dlm lvm2-lockd
# OCFS2 в RHEL официально не поставляется, это путь Oracle Linux/SUSE
Перед форматированием в Pacemaker должны уже работать ресурсы dlm и lvmlockd как клон на всех узлах, и обязан быть настроен фенсинг. Том под GFS2 обычно это shared VG с lock_type=dlm. Форматируем GFS2:

Код: Выделить всё

mkfs.gfs2 -p lock_dlm -t mycluster:webdata -j 3 /dev/vg_shared/lv_web
Разберём ключи. Флаг -p lock_dlm выбирает протокол блокировок DLM (альтернатива lock_nolock - для одиночного монтирования, не в кластере). Флаг -t задаёт имя замка в формате ИмяКластера:ИмяФС - имя кластера обязано совпадать с тем, что в Corosync, иначе узлы не смонтируют. Флаг -j 3 создаёт три журнала, то есть до трёх узлов смогут монтировать одновременно.

Монтирование - на каждом узле обычным mount, тип gfs2:

Код: Выделить всё

mount -t gfs2 /dev/vg_shared/lv_web /srv/web
В проде монтированием управляет Pacemaker через ресурс Filesystem (агент ocf:heartbeat:Filesystem) с упорядочиванием после dlm и lvmlockd, а не строка в /etc/fstab. Добавить журнал под новый узел на смонтированной ФС:

Код: Выделить всё

gfs2_jadd -j 1 /srv/web        # добавит один журнал
gfs2_grow /srv/web             # расширить ФС после роста LV
Для OCFS2 логика та же, но утилиты свои. Форматирование с восемью слотами узлов:

Код: Выделить всё

mkfs.ocfs2 -N 8 -L webdata /dev/sdb1
# -N - число node slots (аналог журналов/слотов), -L - метка
tunefs.ocfs2 --node-slots 12 /dev/sdb1   # нарастить слоты позже
OCFS2 исторически имеет собственный стек o2cb, но в современных связках его тоже заводят через Pacemaker/DLM, а o2cb остаётся как наследие для standalone-сценариев.

Частые грабли
  • Смонтировать ext4/XFS на двух узлах сразу. Это не кластерная ФС, координации нет, данные превратятся в кашу. XFS поверх общего LUN допустим только в active/passive, когда монтирует строго один узел.
  • Забыть про фенсинг. Без рабочего STONITH DLM при сбое узла навсегда заморозит блокировки, и вся ФС зависнет до ручного вмешательства. Это не баг, это защита от split-brain.
  • Несовпадение имени кластера в ключе -t и в Corosync. ФС просто не смонтируется, а ошибка в логах неочевидная.
  • Слишком мало журналов/слотов. Поставили -j 2, а узлов три - третий не смонтирует, пока не добавите журнал. Планируйте с запасом.
  • Ждать от кластерной ФС масштабирования как у Ceph. На десятках узлов GFS2 захлебнётся в трафике блокировок DLM. Это инструмент для 2-8 узлов с общим диском, а не для сотен.
  • Тяжёлые нагрузки с конкуренцией за одни и те же файлы/каталоги. Постоянная передача блокировок (lock ping-pong) убивает производительность. Разносите рабочие наборы узлов по разным каталогам.
Мини-лаба
  • Соберите кластер из двух-трёх узлов с уже работающими Corosync, Pacemaker и настроенным фенсингом (хотя бы fence_virsh в виртуалке).
  • Дайте узлам общий том: проще всего DRBD в dual-primary или один iSCSI-LUN, экспортированный на все узлы.
  • Поднимите в Pacemaker клон-ресурсы dlm и lvmlockd, дождитесь, что они Started на всех узлах.
  • Отформатируйте том: mkfs.gfs2 -p lock_dlm -t ИмяВашегоКластера:lab -j 3 /dev/... - число журналов не меньше числа узлов.
  • Смонтируйте ФС на всех узлах (вручную mount -t gfs2), создайте файл на одном узле, убедитесь, что он мгновенно виден на остальных.
  • Проверьте координацию: запишите в один файл с двух узлов поочерёдно, посмотрите dlm_tool ls и счётчики блокировок.
  • Сымитируйте сбой: грубо вырубите один узел (kill питания ВМ) и проследите, как фенсинг подтверждает смерть, а DLM возвращает блокировки выжившим.
Контрольные вопросы
  • Почему обычную ext4 или XFS нельзя смонтировать на двух узлах одновременно, и какое именно повреждение это вызывает?
  • Какую роль играет DLM и от какого компонента он получает информацию о кворуме и членстве?
  • Зачем кластерной ФС несколько журналов и что произойдёт при попытке смонтировать ФС на узлах больше, чем создано журналов?
  • Что означает ключ -t в mkfs.gfs2 и к каким последствиям приведёт несовпадение имени кластера?
  • Почему фенсинг (STONITH) обязателен для GFS2/OCFS2, а не желателен?
  • В чём принципиальная разница между кластерной (shared-disk) и распределённой (shared-nothing) ФС, и в каком сценарии выбирают каждую?
👍3 ❤️ 🔥1 😄 🤔1
Аватара пользователя
grafana2010
Сообщения: 1
Зарегистрирован: 24 май 2026, 06:43

Re: Кластерные файловые системы [362.3]

Сообщение grafana2010 »

Правильно понимаю, что число -j журналов это и есть жёсткий потолок одновременных монтирований? То есть если узлов станет больше, без gfs2_jadd новый просто не примонтируется?
👍1 ❤️ 🔥 😄 🤔
Аватара пользователя
lighters
Сообщения: 1
Зарегистрирован: 18 май 2026, 03:26

Re: Кластерные файловые системы [362.3]

Сообщение lighters »

У меня на тесте без STONITH при выключении узла вся gfs2 намертво подвисла, eле отвис кластер. Теперь дошло, что это не глюк, а защита - DLM ждёт подтверждения что узел реально мёртв.
👍2 ❤️1 🔥1 😄 🤔
Ответить
← Предыдущая глава
Доступ к кластерному хранилищу [362.2]
Следующая глава →
Распределённое хранилище GlusterFS [363.1]

Все главы курса «LPIC-3 306: высокая доступность и хранилища»

Поделиться темой: ✈ Telegram VK
  • Похожие темы

Вернуться в «LPIC-3 306: высокая доступность и хранилища»

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и 1 гость