Зеркалирование дисков


Конфигурирование и управление механизмом зеркалирования дисков во FreeBSD производится с помощью команды gmirror(8). Традиционно зеркало состоит из пары дисков, но вы можете создать зеркало с любым числом дисков. Зеркальные диски — одна из самых простых форм обеспечения отказоустойчивости: если из строя выходит один диск, данные остаются на зеркале. При создании зеркала в идеале следует выбирать физически отделенные друг от друга диски: на разных контроллерах, подключенные к разным кабелям и даже к разным серверам, если это возможно. В данном примере я использую два жестких диска SCSI — /dev/da0 и /dev/da1.

Зеркальное копирование метаданных производится в конец каждого раздела с замещением любых данных, которые там могут находиться. Я рекомендую зеркалировать только вновь созданные диски и разделы, так как любые данные в этих разделах обычно начинают записываться с начала раздела. В старых разделах файлы часто разбросаны по всему пространству.

Загрузите модуль ядра geom_mirror или выполните команду gmirror load. Чтобы активизировать поддержку зеркалирования на этапе загрузки, добавьте строку geom_mirror_load="YES" в файл /boot/loader.conf.

Создание зеркала

Команда gmirror(8) очень напоминает команду gstripe(8): выберите диски для объединения в зеркало и с помощью gmirror(8) пометьте эти диски как зеркальную пару. Однако, в отличие от gstripe(8), зеркала обычно создаются для дисков, на которых уже хранятся какие-то данные. В этом примере я уже использую диск /dev/da7 для раздела /usr/ports. (Точнее, я использую устройство /dev/da7s1d, но это всего лишь раздел на диске.) Настраивать зеркалирование можно только на отмонтированных дисках, поэтому я сначала должен отмонтировать раздел и только потом попытаться создать зеркало. Сама операция включения диска в зеркало выполняется очень быстро.

# umount /usr/ports/
# gmirror label -v MyMirror /dev/da7

Metadata value stored on /dev/da7.
Done.

# mount /dev/da7s1d /usr/ports/
mount: /dev/da7s1d : No such file or directory

Ой! Что с моим разделом? Не волнуйтесь. Просто диск стал частью устройства-зеркала с именем MyMirror в каталоге /dev/mirror:

# ls /dev/mirror/
MyMirror MyMirrors1 MyMirrors1c MyMirrors1d
# mount /dev/mirror/MyMirrors1d /usr/ports/

Проверка каталога /usr/ports показала, что данные снова доступны.

Просмотреть состояние зеркала можно с помощью команды status утилиты gmirror:

# gmirror status
           Name    Status  Components
mirror/MyMirror  COMPLETE  da7

Информация на всех дисках зеркала полностью синхронизирована. Поскольку здесь только один диск, этого следовало ожидать! Добавлять диски в зеркало можно с помощью команды insert. Команда принимает два аргумента: имя зеркала и добавляемый диск:

# gmirror insert MyMirror /dev/da2

Проверьте состояние зеркала после добавления диска:

# gmirror status
           Name    Status  Components
mirror/MyMirror  DEGRADED  da7
                           da2 (11%)

Синхронизация данных на зеркале еще не закончилась, копирование данных на зеркальный диск может занять некоторое время. В зависимости от объема диска и скорости работы дисковой подсистемы это может занять от нескольких минут до нескольких часов. Вы в любой момент сможете проверить состояние зеркала, чтобы увидеть, как движется процесс синхронизации.

Восстановление зеркала

Основное назначение зеркала — избыточность. Когда один жесткий диск выходит из строя, желательно иметь возможность восстановить данные и/или произвести действия по обслуживанию. Способность продолжать работу диктуется аппаратными средствами. Если в вашей системе имеются диски SCSI или SATA, допускающие возможность горячей замены, вы можете восстановить зеркало прямо на ходу, но если вы используете диски АТА, то, скорее всего, вам придется остановить систему, чтобы заменить вышедший из строя жесткий диск.

Сначала удалите испорченный диск из зеркала с помощью команды forget утилиты gmirror(8). Несмотря на пугающее название, эта команда всего лишь предписывает утилите gmirror удалить все устройства, недоступные в настоящий момент, из конфигурации зеркала. Команда forget не стирает данные на зеркале! Затем просто используйте команду insert для добавления диска в конфигурацию, имя которой нужно указать первым:

# gmirror forget MyMirror
# gmirror insert MyMirror /dev/da8

Зеркалирование загрузочных дисков

Создать зеркало загрузочного диска не так сложно, как может показаться. Зеркало можно создать даже в процессе установки, с помощью командного интерпретатора восстановления (emergency shell), но мы пойдем более простым путем и сделаем это после установки.

Сначала нужно добавить загрузку модуля ядра geom_mirror в файл /boot/loader.conf. Без этого FreeBSD не найдет загрузочный диск, так как это будет устройство, не опознанное ядром. Рекомендую после этого перезагрузить систему, чтобы модуль geom_mirror наверняка загрузился на этапе загрузки.

Следующая наша задача — помочь FreeBSD отыскать загрузочное устройство. По умолчанию FreeBSD устанавливается в корневой раздел устройства /dev/ad0s1a. Однако после включения корневого диска в зеркало корневой раздел будет располагаться на другом устройстве, например на /dev/mirror/MyBootDrives1a. Остальные разделы и участки будут располагаться на похожих устройствах. Для корректной загрузки FreeBSD вы должны описать их в файле /etc/fstab. Кое-кто пускается на разные хитрости, чтобы отредактировать /etc/fstab в однопользовательском режиме, где недоступен даже редактор vi(1). Вы можете сделать это в sed(1) или ed(1) или даже смонтировать раздел /usr, чтобы можно было использовать vi(1). Но почему бы не внести нужные изменения в многопользовательском режиме, сохранив их в отдельном файле?

Скопируйте файл /etc/fstab в файл /etc/fstab-mirror. Отредактируйте этот файл, чтобы назначить новые имена устройств вашим разделам. Допустим, предполагается создать устройство RootMirror0 для загрузочного диска. Вот содержимое небольшого файла /etc/fstab:

/dev/ad0s1a                    /        ufs     rw     1     1
/dev/ad0s1e                    /usr     ufs     rw     2     2
/dev/ad0s1d                    /var     ufs     rw     2     2

После создания зеркала FreeBSD ожидает, чтобы файл /etc/fstab содержал примерно следующее:

/dev/mirror/RootMirror0s1a     /        ufs     rw     1     1
/dev/mirror/RootMirror0s1e     /usr     ufs     rw     2     2
/dev/mirror/RootMirror0s1d     /var     ufs     rw     2     2

Раз вы уже знаете, как должен выглядеть необходимый файл /etc/fstab, скорей создайте его, пока под рукой есть удобный редактор. Обязательно трижды проверьте свою работу — гораздо проще лишний раз проверить правильность таблицы файловой системы, чем потом возиться с загрузчиком или компакт-диском восстановления!

Теперь перезагрузитесь в однопользовательский режим. В этом режиме FreeBSD монтирует только корневой раздел в режиме «только для чтения». Обычно настроить ни один модуль GEOM для смонтированного диска невозможно, но установив параметр kern.geom.debugflags в значение 16, вы сможете сделать это. Этот прием не поможет, если нужно включить корневой раздел в RAID любого типа. Находясь в однопользовательском режиме, скопируйте новый файл fstab на место, разрешите режим отладки GEOM и затем создайте зеркало:

# ср /etc/fstab /etc/fstab-nomirror
# ср /etc/fstab-mirror /etc/fstab
# sysctl kern.geom.debugflags=16
# gmirror label -v RootMirror0 /dev/ad0

После перезагрузки FreeBSD должна найти корневой раздел на новом зеркальном диске. Замечу, что сейчас зеркало состоит из единственного диска и поэтому совершенно неэффективно. Но как только вы вернетесь в многопользовательский режим, просто добавьте резервный диск с помощью соответствующей команды insert:

# gmirror insert RootMirror0 /dev/ad6

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

Разборка зеркала

Если зеркало стало не нужным, выполните команду gmirror stop, передав ей имя зеркала. После этого можно выполнить команду gmirror clear, чтобы стереть метаданные на дисках, ранее входивших в состав зеркала:

# gmirror stop MyMirror
# gmirror clear /dev/da7 /dev/da2

После этого вы сможете использовать освободившиеся диски с другими модулями GEOM.

Ежедневный отчет о состоянии

Операционная система FreeBSD может включать результаты проверки состояния зеркалированных дисков в ежедневный отчет periodic(8). Для этого достаточно добавить строку daily_status_gmirror_enable="YES" в файл /etc/periodic.conf.

Многодисковые зеркала

Традиционно зеркала состоят из двух дисков, однако применение трех дисков в зеркале поможет существенно ускорить резервное копирование базы данных, не затрагивая избыточность. Поместите свою базу данных на трехдисковое зеркало. Если вам понадобилась «холодная» резервная копия, остановите базу данных, удалите диск из зеркала и запустите базу данных. На досуге создайте резервную копию с жесткого диска, извлеченного из зеркала. По окончании процедуры резервного копирования верните третий диск в состав зеркала и позвольте системе выполнить синхронизацию данных.

Комментарии запрещены.