Программный рейд на Linux

Опубликовано: 7 Июнь, 2015 в разделе: Обучение

Добрый день, друзья. Сегодня мы будем изучать создание программного рейда через инструмент mdadm (MD — multiple devices). Я сразу сделаю отсылку к тому что такое рейд-массив и для чего он нужен.

Скажу здесь, что рейд-массив используется для обеспечения отказоустойчивости в случае выхода из строя какого-либо диска. Если у нас работает сервер без использования технологии raid, то выход из строя одного из накопителей выведет из строя и весь сервер. Надо сказать, что в последнее время поломка жесткого диска — рядовое явление, случающееся достаточно часто.

Если выходит из строя диск, находящийся в рейде, достаточно произвести его замену, это никак не повлияет на доступность данных. Разумеется, такой подход немного увеличивает накладные расходы на хранение данных, поскольку часть объема накопителей (в зависимости от типа рейда) расходуется под некоторую избыточность, но в наше время стоимость гигабайта данных на магнитном диске весьма недорогая.

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

Рассмотрим построение рейда 5-го уровня на трёх дисках.

Открываем настройки виртуальной машины (с удовольствием бы крутил на реальной тачке, но нет возможности показывать всё, что хочется) и добавляем дополнительные накопители как на скриншоте (показал стрелкой):

Дополнительные диски

Дополнительные диски

Теперь загружаем виртуальную машину и смотрим диски:


# fdisk -l

Вывод Fdisk

Вывод Fdisk

Диски без разделов. Создадим разделы при помощи fdisk (мы уже рассматривали это здесь)

Создадим по два раздела на каждом устройстве. Первый 1,5 Гб, второй — 0,5 Гб.

Не забываем указать тип файловой системы fd (Linux raid)

2

3

Аналогично поступим и для других дисков. Чтобы перенести настройки одного диска на другой воспользуемся утилитой sfdisk, которая переносит настройки одного устройства на другое:


# sfdisk -d /dev/sdb | sfdisk /dev/sdc
# sfdisk -d /dev/sdb | sfdisk /dev/sdd

Теперь у нас три диска, с одинаковой разметкой. Вот вывод команды fdisk -l:

4

Создание массива


# mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sdb1 /dev/sdc1 /dev/sdd1

Здесь всё просто. Операция создания рейда, /dev/md0 — новое устройство. Уровень рейда и количество дисков с их перечислением.

Кстати, прогресс сборки рейда (синхронизации, перестройки) отображается в файле /proc/mdstat. Обновляется в реальном времени, поэтому смотреть можно через watch (утилита, запускающая через определенный интервал команду).


# watch -n 1 cat /proc/mdstat

Аналогичные действия производим, собирая все вторые устройства в девайс md1:

# mdadm --create --verbose /dev/md1 --level=5 --raid-devices=3 /dev/sdb2 /dev/sdc2 /dev/sdd2

Проверить статус рейда можно так:


# mdadm -D /dev/md0

Мы увидим детальную информацию о типе рейда и о состоянии дисков

5

Итак, массивы созданы, блоки синхронизированны. Будем создавать файловые системы на новых устройствах.

6

7

8

Отлично. Теперь обновим файл автомонтирования файловых систем /etc/fstab (я дописал две строчки внизу)

9

Не забываем создать каталог /data, куда будет монтироваться наш рейд.

Попутно скопируем в этот каталог всё содержимое каталога /etc/, чтобы были какие-то данные. Для эксперимента.


# cp -r /etc/ /data/

Кстати! Насколько я понимаю, чтобы рейд автоматически создавался при старте системы, нужно прописать это в конфиге или образе начальной загрузке. Я предпочитаю конфиг: /etc/mdadm/mdadm.conf

Нужно создать файл, добавить в него строку DEVICE partitions, а ниже вывод команды # mdadm —detail —scan, которая выдаст все настройки рейда, количество девайсов и UUID массива:

10

Отлично. Перезагрузим сервер, чтобы убедиться, что всё у нас стартовало нормально.

Проверка отказоустойчивости

Следующим шагом будет убийство одного из дисков. Имитация выхода из строя, удаление из массива, установка нового диска (чистого), синхронизация данных.

Выход диска из строя:

# mdadm /dev/md0 -f /dev/sdc1
# mdadm /dev/md1 -f /dev/sdc2

Ключ -f означает выход из строя. Мы гипотетически решили, что из строя вышел один из дисков (sdc) и пометили все его вхождения в рейд как сбойные.

Смотрим статистику:


# mdadm -D /dev/md0

11

Печально. Видим, что сбойнул /dev/sdc1

Удаляем его из массива. Данные остаются на месте, это легко проверить.

12

Изымаем диски физически, ставим новый чистый (я просто занулю весь диск при помощи dd)

# dd if=/dev/zero of=/dev/sdc bs=4k &

13

Нетрудно заметить, что диск /dev/sdc теперь не содержит ни данных, ни разметки. То есть абсолютно новый.

Переносим разметку на него и собираем рейд:

# sfdisk -d /dev/sdb | sfdisk /dev/sdc
# mdadm /dev/md0 -a /dev/sdc1
# mdadm /dev/md1 -a /dev/sdc2

Ключ -a означает добавление раздела в рейд. При этом автоматически происходит rebuild массива:

15

Когда rebuild будет завершен, мы увидим вновь рабочий массив:

16

Как-то так оно и работает.

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

Вот видео по теме:

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Лимит времени истёк. Пожалуйста, перезагрузите CAPTCHA.