Вопрос или проблема
Я настроил glusterfs на паре серверов и смог подключить этот файл на моих клиентских машинах. Я также хочу иметь возможность монтировать файловую систему glusterfs на обоих серверах glusterfs при загрузке, когда я выключаю обе машины и запускаю их с нуля.
Эти серверы настроены как кластер с использованием pacemaker. В дополнение к общей базе данных, pacemaker также предоставляет виртуальный IP-адрес для монтирования файловой системы gluster.
Я могу вручную монтировать файловую систему на каждом после того, как оба сервера запущены, с помощью команды:
mount -t glusterfs nodea:/gv0 /data
Что отлично. Но я хочу, чтобы это происходило автоматически при загрузке.
Поэтому я попробовал добавить запись в fstab:
nodea:/gv0 /data glusterfs _netdev 0 0
Это срабатывает, когда я запускаю команду “mount -a” после того, как кластер запущен и работает. Однако это не работает при загрузке. (Таким образом клиентские машины монтируют glusterfs при загрузке, но кластер уже запущен и работает. Поэтому, конечно, это работает при загрузке у них.)
Я также пытался создать unit файл systemd для обработки монтирования glusterfs при загрузке. Мой unit файл находится в /etc/systemd/system под названием “data.mount” и выглядит так:
# Монтирование gluster fs в /data
[Unit]
Description = Автоматическое монтирование файловой системы gluster
After=pcsd.service
[Mount]
What=nodea:/gv0
Where=/data
Type=glusterfs
[Install]
WantedBy = pcsd.service
Снова, это срабатывает, когда оба сервера запущены, с помощью выполнения команды “systemctl start data.mount”. Это также работает, если я перезагрузил только одну из машин в кластере. Но это не работает при перезагрузке обоих серверов.
Если оба узла в кластере выходят из строя, или если я хочу перезагрузить оба одновременно по какой-либо причине, я хочу быть уверен, что когда обе машины вернутся онлайн, glusterfs будет смонтирован в /data.
В качестве временного решения я добавил следующие строки в crontab root на обеих машинах:
@reboot sleep 60 && mount -t glusterfs nodea:/gv0 /data
@reboot sleep 300 && mount -t glusterfs nodea:/gv0 /data
Это работает, если я запускаю оба сервера с нуля. Но моя обеспокоенность в том, что если службе pacemaker когда-либо потребуется более 5 минут на запуск, то у меня все равно не будет смонтирована файловая система gluster на сервере в /data.
Есть ли способ проверить с помощью systemd unit файла, удалось ли ему фактически смонтировать файловую систему, и если нет, снова попытаться, пока это не получится?
Есть ли какой-нибудь другой способ иметь glusterfs, монтируемый при загрузке, и проверять, что он действительно смонтирован?
Вы должны иметь возможность настроить автоматическое монтирование с помощью systemd, когда это необходимо. У меня также были проблемы с монтированием на Ubuntu 16.04 при загрузке. На основе этого сообщения я добавил noauto,x-systemd.automount
в строку fstab
:
gluster1:/volume1 /storage-pool glusterfs defaults,_netdev,noauto,x-systemd.automount 0 0
Я перезагружал серверы приложений несколько раз, и они все успешно монтировались. Надеюсь, это поможет и вам!
Я обходил эту проблему, учитывая подход LP:
файл: /etc/systemd/system/glusterfsmounts.service
:
[Unit]
Description=Glustermounting
Requires=glusterd.service # используйте glusterfs-server.service на более старых системах
[Service]
Type=simple
RemainAfterExit=true
ExecStartPre=/usr/sbin/gluster volume list
ExecStart=/bin/mount -a -t glusterfs
Restart=on-failure
RestartSec=3
[Install]
WantedBy=multi-user.target
затем вы бы:
systemctl daemon-reload
systemctl enable glusterfsmounts
и перезагрузить…
Это работало наилучшим образом для меня до сих пор
Вы можете использовать скрипт, чтобы задерживать статус “started” службы glusterfs в systemd до тех пор, пока тома на самом деле не будут готовы.
systemctl edit glusterd.service
[Service]
ExecStartPost=/usr/local/sbin/glusterfs-wait
Создайте файл /usr/local/sbin/glusterfs-wait
со следующим содержимым:
#!/bin/bash
FAIL=1
until [ $FAIL -eq 0 ]; do
gluster volume status all
FAIL=$?
test $FAIL -ne 0 && sleep 1
done
exit 0
Убедитесь, что этот файл исполняемый.
Затем создайте override для монтирования, например, для /mnt/storage
это был бы mnt-storage.mount
, слеши заменяются на дефисы.
systemctl edit mnt-storage.mount
Если это не работает и вы только что добавили запись в fstab, перезагрузите systemd, чтобы он увидел обновление (systemctl daemon-reload
).
[Unit]
After=glusterd.service
Wants=glusterd.service
.
Ответ или решение
Для решения проблемы автоматического монтирования файловой системы GlusterFS на серверах кластерной конфигурации при запуске в операционной системе RHEL 7, требуется тщательно подходить к конфигурации служб и настройке управляющей логики для успешного старта. Давайте рассмотрим все аспекты, которые необходимо учесть для достижения безотказной работы.
Теория (Theory)
GlusterFS — это распределённая файловая система, которая позволяет объединять дисковое пространство нескольких серверов в единое файловое пространство. При настройке таких систем в кластере с использованием pacemaker и virtual IP важно обеспечить, чтобы монтирование файловых систем происходило в правильном порядке, после поднятия необходимых служб и ресурсов.
Автоматическое монтирование файловой системы GlusterFS на старте сервера может быть сложным из-за особенностей запуска и подъёма кластерных сервисов pacemaker. Важно, чтобы монтирование происходило после того, как все необходимые сетевые и кластерные ресурсы стали доступны. Инструкции, которые требуют сети, должны быть помечены как _netdev
в fstab
для отображения необходимости сетевого подключения до их исполнения. Также необходимо правильное создание и использование systemd юнитов.
Пример (Example)
В приведённом вами примере была предложена следующая строка для файла fstab
:
nodea:/gv0 /data glusterfs _netdev 0 0
Это строка указывает на необходимость монтирования файловой системы по сети, но, как выяснилось, этого не достаточно для автоматического монтирования при старте серверов кластера.
Другим предложенным подходом было создание systemd юнита data.mount
, однако возникли проблемы при одновременной перезагрузке обоих узлов, что этому подходу также не даёт стабильности.
В более надёжном методе использован systemd
юнит glusterfsmounts.service
, который описан в следующем виде:
[Unit]
Description=GlusterFS Mounting Service
Requires=glusterd.service
After=glusterd.service
[Service]
Type=oneshot
RemainAfterExit=true
ExecStart=/bin/mount -a -t glusterfs
ExecStartPost=/usr/local/sbin/glusterfs-wait
[Install]
WantedBy=multi-user.target
Дополнительный скрипт /usr/local/sbin/glusterfs-wait
используется для ожидания, пока GlusterFS полностью стартует и становится доступным.
Применение (Application)
Для обеспечения надежного монтирования GlusterFS на старте необходимо убедиться, что все системные юниты и зависимости настроены правильно. Вот следующие шаги для настройки:
-
Создание и настройка
glusterfsmounts.service
:
Скопируйте пример выше и сохраните его как/etc/systemd/system/glusterfsmounts.service
. Не забывайте использовать командуsystemctl daemon-reload
, чтобы применить изменения. -
Настройка скрипта ожидания:
Создайте файл/usr/local/sbin/glusterfs-wait
со следующим содержимым:#!/bin/bash while ! gluster volume status all; do sleep 1 done exit 0
Убедитесь, что этот скрипт исполняемый, выполнив
chmod +x /usr/local/sbin/glusterfs-wait
. -
Конфигурация
fstab
:
Внесите строку с опциямиnoauto,x-systemd.automount
для каждого тома GlusterFS, как показано ниже:nodea:/gv0 /data glusterfs defaults,_netdev,noauto,x-systemd.automount 0 0
-
Активация службы:
Активируйте созданный сервис с помощью команды:systemctl enable glusterfsmounts.service
-
Тестирование:
Перезагрузите обе машины и убедитесь, что операция монтирования происходит автоматически. Проверяйте журнал с помощьюjournalctl -u glusterfsmounts.service
для диагностики возможных проблем.
Используя такой подход, вы настроите систему так, чтобы она проверяла доступность GlusterFS перед монтированием, обеспечивая тем самым надёжное включение томов после перезагрузки узлов.
Таким образом, решение вопроса требует внимательного подхода к конфигурации управления сервисами systemd и грамотной организацией контрольной логики на старте операционной системы. Это обеспечит надежность вашего кластера и его бесперебойное функционирование в различных сценариях запуска.