Библиотека MNWhost.ru
FreeBSD и gmirror

Нюансы gmirror

В случае отсутствия полноценного аппаратного RAID контроллера (встроенные в материнские платы мы не берем в расчет, поскольку они по сути являютсся программными) приходится использовать его бесплатный аналог - программный. Для FreeBSD популярен gmirror. Вкратце о некоторых практических моментах.


Создание зеркала. Допустим, есть 2 диска, ad0 и ad2 и система установлена на ad0. Первое, это то, что ad2 должен быть не меньше ad0. Если ad2 меньше хотя бы на 1 байт, зеркала не получится. Убедимся в этом - смотрим на вывод dmesg|grep ad. Грузимся, далее:

sysctl kern.geom.debugflags=16
gmirror label -v -b round-robin gm0 /dev/ad0
echo geom_mirror_load="YES" > /boot/loader.conf
cp /etc/fstab /etc/fstab.ad0

в /etc/fstab меняем /dev/ad0* на /dev/mirror/gm0*

reboot

Если все правильно, смотрим на mount
Должно быть типа 

/dev/mirror/gm0s1a on / (ufs, local)
devfs on /dev (devfs, local)
/dev/mirror/gm0s1e on /tmp (ufs, local)
/dev/mirror/gm0s1f on /usr (ufs, local)
/dev/mirror/gm0s1d on /var (ufs, local)
     

gmirror status - покажет нам массив из одного диска со статусом COMPLETE. Далее добавляем второй диск, и получаем зеркало со статусом DEGRADED
gmirror insert gm0 /dev/ad2 Ждем окончания синхронизации, после чего наблюдаем 2 диска и статус массива COMPLETE. Вроде бы можно расслабиться и наслаждаться отказоустойчивым хранилищем. Но жизнь гораздо многообразнее.

1. Внезапный ребут. Не важно по какой причине, но он случился, и вы ждете, пока сервер прочекает fsck диски и поднимется. Полчаса ждете, час, два.. Дело в том, что по умолчанию вы собрали зеркало с автоматическим ребилдом. То есть одновременно работает fsck и ребилд зеркала. Выхода как обычно два. Дождаться, пока сервер все-таки загрузится, или прервать загрузку тем же ресетом и загрузиться в single mode. Смотрим, какой диск перестраивается командой gmirror status. Например, это ad2. Насильно прекращаем ребилд командой gmirror remove gm0 ad2. Ребутимся, fsck все равно проверяет систему, но делает это гораздо быстрее..

В удобное время, когда сервер меньше всего загружен, поскольку программный RAID при ребилде будет тормозить сам сервер, делаем gmirror insert gm0 ad2. И отключаем авторебилд: gmirror configure -n gm0. В следующий раз при ребуте авторебилда не произойдет, один из дисков просто перейдет в режим STALE. Узнаем об этом при помощи любого скрипта мониторинга gmirror. gmirror status покажет 2 диска в массиве, но статус массива будет DEGRADED. gmirror list скажет, какой диск нужно ребилдить, на случай если мы забыли. Если, непример, статус STALED у ad2 - делаем gmirror rebuild gm0 ad2. Следует заметить, что при крахе системы зеркало gmirror рассыпается не всегда.

Вывод. Если не хотим долго ждать, пока после ресета сервер загрузится, либо вмешиваться в процесс загрузки, после создания зеркала сразу отключаем авторебилд.

2. Мониторинг нам сказал, что массив DEGRADED. Смотрим, какой диск вылетел, делаем gmirror forget gm0, меняем диск на новый, либо б/у, но отформатированный низкоуровневым форматом. Это нам гарантирует не только проверку на бэдблоки, но и отсутствие на диске следов предыдущего gmirror. Проверено: данные с большой вероятностью убьются, если диск, который меняем, был когда-то в зеркале, авторебилд на нем не отключен и загрузка по какой-то причине пошла с него.

3. Зеркало gmirror на практике показывает себя достаточно хорошо, но это все равно не повод забывать про регулярные бэкапы на внешний носитель. И еще раз - никогда не использовать для зеркалирования в системах на FreeBSD встроенные на материнской плате RAID контроллеры.

размещение сервера