Настройка программного RAID (gmirror)

Тут описывается нелёгкий путь настройки ОС FreeBSD, начиная с установки дистрибутива и заканчивая настройкой каждого сервиса
Ответить
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Настройка программного RAID (gmirror)

Сообщение RomA »

Предисловие:
Время диктует свои правила... вот вышла FreeBSD 9.0 в которой не осталось место утилитки atacontrol которую мы раньше использовали, а резервироваться надо. В этой статье я обобщу тот опыт, который получил при переходе на FreeBSD 9.0 с FreeBSD 8.2

Теория:
1) с приходом FreeBSD 9.0 утилитка atacontrol считается устаревшей и не работает
2) диски теперь идут по порядку и называются ada (ada0, ada1, ...)

Задача:
Настроить программный райд на базе gmirror

Решение:
Начнём с того момента, что у меня стоит FreeBSD 8.2 из которой я уже бытащил жёский жиск из зеркала и положил его как резервный. Потом обновил исходники, пересобрал мир и ядро. установил, но не перегружался. Так как изменились названия дисков надо переписать файл /etc/fstab, который должен был бы выглядеть следующим образом:

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

# Device		Mountpoint	FStype	Options		Dump	Pass#
/dev/ada0s1b		none		swap	sw		0	0
/dev/ada0s1a		/		ufs	rw		1	1
/dev/ada0s1e		/tmp		ufs	rw		2	2
/dev/ada0s1f		/usr		ufs	rw		2	2
/dev/ada0s1g		/usr/home		ufs	rw		2	2
/dev/ada0s1d		/var		ufs	rw		2	2
/dev/acd0		/cdrom		cd9660	ro,noauto	0	0
Тут лирическое отступление.
1) если у вас диски были не в райд массиве интелевском, то вы делаете как в первом варианте и не паритесь
2) если же у вас была рабочая фря, как было написано на форуме, на райде, который появлялся при загрузке сервера, то вам следует:
2.1) убедиться что оба диска системы в зеркале (atacontrol status ar0)
2.2) вытащить один диск, дабы была копия системы (atacontrol detach ata3)
2.3) перегрузить сервер (reboot)
2.4) зайти в утилиту управления raid контролером (сразу после биоса, Ctrl+I)
2.5) удалить райд раздел - он скажет что все данные на volume0 будут уничтожены - соглашаемся
2.6) сохраняем конфигураци, перегружамся, идём в биос и там выключаем RAID а ставим ARCH
2.7) сохраняем, перегружамся..

Если же вы как-то упустили этот момент, то ваш fstab должен выглядеть следующим образом:

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

# Device		Mountpoint	FStype	Options		Dump	Pass#
/dev/raid/r0s1b		none		swap	sw		0	0
/dev/raid/r0s1a		/		ufs	rw		1	1
/dev/raid/r0s1e		/tmp		ufs	rw		2	2
/dev/raid/r0s1f		/usr		ufs	rw		2	2
/dev/raid/r0s1g		/usr/home		ufs	rw		2	2
/dev/raid/r0s1d		/var		ufs	rw		2	2
/dev/acd0		/cdrom		cd9660	ro,noauto	0	0
[/color]

теперь я перегружаю сервер. Иду в биос и там выключаю райд и ставлю ARCH. Загружаюсь - всё прошло нормально. Теперь делаем по манулу http://www.freebsd.org/doc/handbook/geom-mirror.html - хочу заметить, что тут немного по другому, чем это же делалось бы в 8.2
итак

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

stat# sysctl kern.geom.debugflags=17
kern.geom.debugflags: 0 -> 17
теперь

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

stat# gmirror label -vb round-robin gm0 /dev/ada0
Metadata value stored on /dev/ada0.
Done.
stat# 
и ещё

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

stat# gmirror load
а так же

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

stat# echo 'geom_mirror_load="YES"' >> /boot/loader.conf
теперь настало время проверить что натворили

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

stat# cat /boot/loader.conf
coretemp_load="YES"
geom_mirror_load="YES"
stat# 
и

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

stat# ls /dev/mirror/
gm0	gm0s1	gm0s1a	gm0s1b	gm0s1d	gm0s1e	gm0s1f	gm0s1g
stat#
Пока что всё хорошо. теперь надо исправить /etc/fstab - он должен выглядеть так

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

stat# cat /etc/fstab
# Device		Mountpoint	FStype	Options		Dump	Pass#
/dev/mirror/gm0s1b		none		swap	sw		0	0
/dev/mirror/gm0s1a		/		ufs	rw		1	1
/dev/mirror/gm0s1e		/tmp		ufs	rw		2	2
/dev/mirror/gm0s1f		/usr		ufs	rw		2	2
/dev/mirror/gm0s1g		/usr/home		ufs	rw		2	2
/dev/mirror/gm0s1d		/var		ufs	rw		2	2
/dev/acd0		/cdrom		cd9660	ro,noauto	0	0
stat# 
перезагружаемся. я в этот момент вставил ещё пустой жёский диск. система загрузилась и я увидел такую картину

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

stat# df -m
Filesystem         1M-blocks  Used  Avail Capacity  Mounted on
/dev/mirror/gm0s1a       989   650    259    72%    /
devfs                      0     0      0   100%    /dev
/dev/mirror/gm0s1e      9916     5   9117     0%    /tmp
/dev/mirror/gm0s1f    198353 15276 167208     8%    /usr
/dev/mirror/gm0s1g     46364   935  41720     2%    /usr/home
/dev/mirror/gm0s1d    198353 40887 141597    22%    /var
stat#
всё хорошо - я загрузился с массива - посмотрим его статус

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

stat# gmirror status gm0
      Name    Status  Components
mirror/gm0  COMPLETE  ada0 (ACTIVE)
stat# 
винт один, но всё хорошо )))) добавляем второй винт

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

stat# gmirror insert gm0 /dev/ada1
и смотрим что получилось

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

stat# gmirror status gm0
      Name    Status  Components
mirror/gm0  DEGRADED  ada0 (ACTIVE)
                      ada1 (SYNCHRONIZING, 0%)
stat# 
через какое-то время процесс начинается

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

stat# gmirror status gm0
      Name    Status  Components
mirror/gm0  DEGRADED  ada0 (ACTIVE)
                      ada1 (SYNCHRONIZING, 3%)
stat# 
ну ждём окончания...

по мимо этого можно посмотреть более детальную статистику
stat# gmirror list
Geom name: gm0
State: DEGRADED
Components: 2
Balance: round-robin
Slice: 4096
Flags: NONE
GenID: 0
SyncID: 1
ID: 2821503591
Providers:
1. Name: mirror/gm0
Mediasize: 500107861504 (465G)
Sectorsize: 512
Mode: r7w6e17
Consumers:
1. Name: ada0
Mediasize: 500107862016 (465G)
Sectorsize: 512
Mode: r1w1e1
State: ACTIVE
Priority: 0
Flags: NONE
GenID: 0
SyncID: 1
ID: 3658449252
2. Name: ada1
Mediasize: 500107862016 (465G)
Sectorsize: 512
Stripesize: 4096
Stripeoffset: 0
Mode: r1w1e1
State: SYNCHRONIZING
Priority: 0
Flags: DIRTY, SYNCHRONIZING
GenID: 0
SyncID: 1
Synchronized: 21%
ID: 3035217133

stat#
Ну и на последок советы бывалых
При замене жесткого диска в массиве, требуется исключить старый из массива, добавить новый и перестроить масси

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

gmirror forget gm0 
gmirror insert gm0 /dev/ad1
gmirror rebuild gm0 /dev/ad1
если жесткий диск не менялся, то достаточно

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

gmirror rebuild gm0 /dev/ad1
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Восстановление RAID после сбоев

Сообщение RomA »

Получилось так, что у меня всё развалилось. Надо признать что ради тестов и написания этой статьи я добивался этого долго и упорно. и вот в один прекрасный момент у меня фря не загрузилась... вообще. сказала что загрузочных дисков нет. Отчаиваться было не интересно - я выключил сервер, поменял первый и второй винт местами, в надежде что на втором информация сохранилась. Оказалось, что так и есть - со второго диска он загрузился, но показал мне вот это:
1.JPG
1.JPG (688.01 КБ) 13068 просмотров
Ну что же - не будем отчаиваться и таки запустим систему, загрузившись с одного диска (в FreeBSD ниже 9 версии это ad4 в 9 и выше - ada0 )
2.JPG
2.JPG (822.98 КБ) 13068 просмотров
Итак, система загрузилась. Теперь мы смонтируем раздел /usr на котором лежит программа для редактирования файлов, а так же перемонтируем корневой раздел в режим записи
3.JPG
3.JPG (788.51 КБ) 13068 просмотров
Теперь нам надо поправить файл /etc/fstab - в который прописать наш жёский диск, с коротого мы успешно загрузились (помним о версии FreeBSD)
4.JPG
4.JPG (731.8 КБ) 13068 просмотров
Сохраняем файл и перегружаем сервер.

После загрузки нам прийдётся выполнить все действия по созданию райд, описанные в первой стаье, так как программный райд развалился и больше не существуюет. Но есть одно "но" - при загрузке сервера загрузился модель райда, который не даст выполнить нужных операций - потому сразу после загрузки сервера выгрузите его из памяти

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

stat# kldunload geom_mirror.ko
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Некоторые тонкости темы

Сообщение RomA »

Хочется обратить ваше внимание на некоторые вещи, характерные для софтовых райдов
1) Винты должны быть СТРОГО одинаковые - малейшее несоответствие приведёт к тому, что райд собираться не будет - даже разница в один байт
2) Лучше всего ставить одинаковые винты одинаковой серии
3) если вы подсовываете gmirror новый винт, он начинает синхриться, долго висит на 0% а потом исчезает из системы - значит винт плохой и не подойдёт - не надо пытаться его ввести в массив - поменяйте
4) после ввода НОВОГО диска в массив - перегрузите сервер - очень может быть что винт пропадёт из массива и прийдётся делать всё заново
RomA
Сообщения: 358
Зарегистрирован: 05 авг 2008, 14:53
Контактная информация:

Замена винта из зеркала

Сообщение RomA »

Если покопаться на форуме, то в теме про райд на atacontrol есть описание как выташить один винт из массива и вставить другой. В этой статье я опишу аналогичный процесс.

Но прежде лирическое отступление. Так как с предыдущего поста прошло много времени я успел наслушаться огромное количество недовольства от всяких "умников" по поводу такого метода. Не буду разводить долгую полемику, а приведу доводы, которые считаю достаточными для своих действий:
Аксиомы:
1) как правило винты в сервер покупаются вместе с сервером
2) как правило это винты одной и той же серии
3) как правило они потом работаю в паре - инфа пишется на них параллельно
Следствия:
1) из 2 следует что если в серии есть заводской брак - то оба винта вылелят одновременно и вы потеряете данные
2) из 1 и 3 следует что так как нагрузка одинакова, и ресурс одинаков - винты вылетят одновременно и вы потеряете данные
Выводы:
1) необходимо иметь дубликат массива
2) винты необходимо менять, что бы рассинхронизировать их жизненный цикл
Вот именно потому я и советую вам пользоваться нижеописанным методом бекапа данных. Ну и конечно же ни одно резервное копирование конфигов не сможет заменить полную и точную копию рабочей системы, которая может запуститься совершенно на любом железе - ведь райд программный и никак не привязан к железу - так что в случае чего развернуть новую фрю будет делом одной минуты!

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

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

stat# gmirror deactivate gm0 /dev/ada0
затем проверяем что винт пропал

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

stat# gmirror status
      Name    Status  Components
mirror/gm0  DEGRADED  ada1 (ACTIVE)
stat#
теперь можно идти к серверу и вытаскивать винт из первой корзины - ничего не случится - сервер продолжит работать.
Вставляем новый винт в корзину и идёт опять за консоль - будем добавлять новый винт в массив, развалив старый ))) (перед этим подождём пару минут что бы система могла инициализировать новое устройство)

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

stat# gmirror forget gm0 
stat# gmirror insert gm0 /dev/ada0
stat# gmirror status
      Name    Status  Components
mirror/gm0  DEGRADED  ada1 (ACTIVE)
                      ada0 (SYNCHRONIZING, 0%)
stat#
Как видим винт начал синхриться. чем дальше тем больше процентиков идёт

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

stat# gmirror status
      Name    Status  Components
mirror/gm0  DEGRADED  ada1 (ACTIVE)
                      ada0 (SYNCHRONIZING, 17%)
stat# 
Хочу заметить что перезагрузка сервера в момент синхранизации неизбежно приведёт к тому, что массив развалится - потому настоятельно рекомендую не перезагружать сервер и вообще бережно к нему относиться в это время. Сама же скорость синхронизации зависит от того, сколько данных вы изменяете на сервере - то есть чем меньше загружена файловая система - тем быстрее будет идти синхранизация. То есть если вы запустите синхранизацию и начтёне закачивать на сервер огромный файл - синхриться массив будет ооочень долго

Итак повторяю:
На совершенно рабочей машине делаем

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

stat# gmirror status
      Name    Status  Components
mirror/gm0  COMPLETE  ada0 (ACTIVE)
                      ada1 (ACTIVE)
stat#
stat# gmirror deactivate gm0 /dev/ada0
stat# gmirror status
      Name    Status  Components
mirror/gm0  DEGRADED  ada1 (ACTIVE)
stat#
вытаскиваем старый винт и вставляем новый

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

stat# gmirror status
      Name    Status  Components
mirror/gm0  DEGRADED  ada1 (ACTIVE)
stat# gmirror forget gm0
stat# gmirror insert gm0 /dev/ada0
stat# gmirror status
      Name    Status  Components
mirror/gm0  DEGRADED  ada1 (ACTIVE)
                      ada0 (SYNCHRONIZING, 0%)
stat#
Всё работает. Для реализации этой процедуры ни разу не надо выключать сервер физически или останавливать какие-то жизнено-важные сервисы. Конечный пользователь даже не заметит.
Vitamin
Сообщения: 14
Зарегистрирован: 02 мар 2010, 13:50
Контактная информация:

Re: Настройка программного RAID (gmirror)

Сообщение Vitamin »

Столкнулся с проблемой, при добавлении диска в массив.

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

hz2# gmirror insert gm0 /dev/ada1
gmirror: Cannot access provider ada1.
hz2#
Долго гуглил и нашёл решение.
http://people.freebsd.org/~rse/mirror/
Там советуют убедиться что диск свежий.
make sure the second disk is treated as a really fresh one
А значит обновить MBR.
В нашем случае делаем.

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

hz2# dd if=/dev/zero of=/dev/ada1 bs=512 count=79
и далее:

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

hz2# gmirror insert gm0 /dev/ada1
hz2#
Проверим.

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

hz2# gmirror status gm0
      Name    Status  Components
mirror/gm0  DEGRADED  ada0 (ACTIVE)
                      ada1 (SYNCHRONIZING, 0%)
Ура! Добавился!

RomA
А у меня случилось по другому - при добавлении винта в массив говорилось

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

stat# gmirror insert gm0 /dev/ada1
gmirror: Cannot access provider ada1
Начал смотреть почему же нет доступа - наверное кто-то блокирует - смотрим что есть

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

stat# ls /dev/ 
Среди прочего был замечен некий массив /dev/ar0 которого быть не должно - смотрим

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

stat# graid list
Geom name: Intel-184781de
State: DEGRADED
Metadata: Intel
Providers:
1. Name: raid/r0
   Mediasize: 500104691712 (465G)
   Sectorsize: 512
   Mode: r0w0e0
   Subdisks: ada1 (ACTIVE), NONE (NONE)
   Dirty: No
   State: DEGRADED
   Strip: 65536
   Components: 2
   Transformation: RAID1
   RAIDLevel: RAID1
   Label: Volume0
   descr: Intel RAID1 volume
Consumers:
1. Name: ada1
   Mediasize: 500107862016 (465G)
   Sectorsize: 512
   Mode: r1w1e1
   ReadErrors: 0
   Subdisks: r0(Volume0):0@0
   State: ACTIVE (ACTIVE)
Вот наш винт - он принадлежит другому райду. Выводим.

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

stat# graid delete raid/r0
Проверяем

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

stat# graid list
Всё хорошо. Добавляем винт в массив и проверяем

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

stat# gmirror insert gm0 /dev/ada1
stat# gmirror status
      Name    Status  Components
mirror/gm0  DEGRADED  ada0 (ACTIVE)
                      ada1 (SYNCHRONIZING, 0%)
ну вот - всё хорошо. Включаем ребилд
Vitamin
Сообщения: 14
Зарегистрирован: 02 мар 2010, 13:50
Контактная информация:

Re: Настройка программного RAID (gmirror)

Сообщение Vitamin »

Начиная с этого места.
phz# gmirror load
Бывает так, что нам отвечает:
gmirror: Command 'load' not available.
Что делаем.Смотрим какие модули загружены:
phz# kldstat
Id Refs Address Size Name
1 3 0xffffffff80200000 15b9440 kernel
2 1 0xffffffff817ba000 24708 geom_mirror.ko
Выгружаем модуль:
phz# kldunload geom_mirror.ko
И снова выполняем команду:
phz# gmirror load
phz#
Смотрим для интереса модули:
phz# kldstat
Id Refs Address Size Name
1 3 0xffffffff80200000 15b9440 kernel
2 1 0xffffffff817ba000 24708 geom_mirror.ko
Отлично, радуемся.
Ответить