Программный RAID

http://xgu.ru/wiki/Программный_RAID_в_Linux

Файловая система создается поверх рейд-массива.

Создать raid-1 с одним отсутствующим диском:

mdadm --create --verbose /dev/md0 --level=1 --bitmap=internal --raid-devices=2 /dev/xvdb1 missing
mdadm --detail --scan >> /etc/mdadm/mdadm.conf

Недостающий диск можно подключить позднее:

mdadm /dev/md0 --add /dev/xvdc1

Пометить диск как сбойный и удалить его из массива:

mdadm /dev/md0 --fail /dev/sdb1
mdadm /dev/md0 --remove /dev/sdb1

Если диск уже пропал из системы, то mdadm откажется его удалять т.к. «no such file». В таком случае выполняем удаление всех отсоединенных дисков:

mdadm /dev/md0 -r detached

Создать raid-5 с тремя дисками и одним диском в горячем резерве (hot-spare), размер чанка 64КБ, bitmap хранится в файле /md2.bitmap:

mdadm --create --verbose /dev/md2 --level=5 --raid-devices=3 --spare-devices=1 /dev/sd{f,g,h,i}1 --chunk=512 --bitmap=/md2.bitmap
mdadm --readwrite /dev/md2

Удаление суперблока:

mdadm --zero-superblock /dev/sdx

Загрузка с raid1

Известный баг Grub: если корневая система в raid, то при загрузке с одного из дисков reboot сразу после появления надписи «Welcome to Grub!».

Решение – раскомментировать строчку

GRUB_TERMINAL=console

в файле /etc/default/grub, и выполнить команду

update-grub

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

Для нормальной производительности и уменьшения износа диска важно выравнивать разделы по блокам/цилиндрам. Современные диски большого объема имеют увеличенный размер сектора в 4096 байт (вместо 512), что создает дополнительные сложности. Рекомендуется выравнивать всё по 1 МБ.

При создании LVM:

pvcreate --dataalignment=1M

Для raid-5

SUBSYSTEM=="block", KERNEL=="md*", ACTION=="change", TEST=="md/stripe_cache_size", ATTR{md/stripe_cache_size}="8192"

udevadm trigger
udevadm control --reload-rules

Скорость синхронизации

Чтобы сервер не «подвис» в момент ресинхронизации дисков, устанавливаем предел скорости.

dev.raid.speed_limit_max = 10240

sysctl -p /etc/sysctl.d/mdadm.conf

Производительность

Хорошая статья

mdraid

Создать raid-5 на 4 разделах

/dev/sdh1, /dev/sdi1, … .

mdadm --create /dev/mdX --raid-devices=4 --level=5 /dev/sd{h,i,j,k}1

Ограничить скорость resync

dev.raid.speed_limit_max = 51200

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

sysctl --system

Остановить Resync

Бывает полезно, когда нужно совместить resync с последующим копированием данных на свежесозданный массив.

Создаём массив;

останавливаем синхронизацию;

копируем данные.

Не забываем включить обратно чтобы синхронизировать оставшееся место.

echo frozen > /sys/block/md2/md/sync_action
echo none > /sys/block/md2/md/resync_start
echo idle > /sys/block/md2/md/sync_action
echo repair > /sys/block/md2/md/sync_action

Настроить файловую систему ext4

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

stride=stride-size Configure the filesystem for a RAID array with stride-size filesystem blocks. This is the number of blocks read or written to disk before moving to next disk. This mostly affects placement of filesystem metadata like bitmaps at mke2fs(2) time to avoid placing them on a single disk, which can hurt the performance. It may also be used by block allocator.

stripe_width=stripe-width Configure the filesystem for a RAID array with stripe-width filesystem blocks per stripe. This is typically be stride-size * N, where N is the number of data disks in the RAID (e.g. RAID 5 N+1, RAID 6 N+2). This allows the block allocator to prevent read-modify-write of the parity in a RAID stripe if possible when the data is written.

Файловую систему перед этим рекомендуется отмонтировать.

chunk size = 512kB
block size = 4kB (recommended for large files, and most of time)
stride = chunk / block = 128
N = (n disks in raid6) - 2
#or N = (n disks in raid5) - 1
stripe-width = stride * N = 512
tune2fs -E stride=128,stripe-width=512 /dev/mdX

Конвертировать raid на блочных устройствах в raid на разделах

Пример: Массив создан на блочных устройствах:

md1 : active raid5 sdb[4] sde[2] sdc[0] sdd[1]
23435249664 blocks super 1.2 level 5, 512k chunk, algorithm 2 [4/4] [UUUU]

Это доставляет неудобства, т.к. теперь в массив можно добавить только диски в точности такого же или большего размера (если новый диск на пару мегабайт меньше, он не добавится).

Чтобы исправить проблему, достаточно было бы уменьшить размер рейда на несколько мегабайт, а затем по очереди «вынуть» из массива по одному диску, создать на них partition и добавить его обратно в массив.

Сорян, но в mdraid это невозможно. Даже если уменьшить раздел командой mdadm --grow, всё равно диск не добавится с ошибкой «not large enough to join array». И не важно, какая версия метаданных, 0.9 или 1.2. Единственный выход – перенести куда-то данные, создать партишены и пересоздать на них raid.

Переименовать mdadm-раздел

Допустим, у насть есть раздел /dev/md3 с именем computername:3 и мы хотим переименовать его в othername:1. Ситуация усложняется тем, что на разделе находится lvm-том vg с разделом /home.

1. Выкидываем всех пользователей из системы и отмонтируем /home.
umount /home
2. Останавливаем udev.
service udev stop
3. Останавливаем lvm-том.
dmsetup remove vg-home
4. Смотрим, на каких дисках собран md-раздел.
Допустим это /dev/sdX3, /dev/sdY3
5. Останавливаем mdadm-диск.
mdadm --stop /dev/md3
6. Запускаем диск со сменой имени.
mdadm --assemble /dev/md1 --name othername:1 --update=name /dev/sd{X,Y}3
7. Обновляем имя в файле ''/etc/mdadm/mdadm.conf''
mdadm --detail --scan
8. Обновляем initramfs.
update-initramfs -u

Перенос корневого раздела на программный рейд

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

Установить mdadm.

Создать программный рейд-массив для будущего корневого раздела.

Создать на новом массиве ФС, примонтировать ФС в /mnt, скорпировать туда все каталоги и файлы из корневого раздела (кроме тех, которые являются точкой монтирования виртуальных ФС).

Создать каталоги /mnt/dev, /mnt/sys, /mnt/proc

Сделать mount --bind /dev /mnt/dev (повторить для sys и proc).

Сделать chroot /mnt

Поправить /etc/fstab

Запустить dpkg-reconfigure mdadm

Запустить dpkg-reconfigure grub-pc

Перезагрузиться в новую систему.

Проверил – всё получилось.