Debian.pro/

Про Debian


raid10 в mdadm — не то, чем кажется.

Прежде, чем заявить «Пффф, да всё легко, шо вы тут мне втираете», ответьте мысленно на простенький вопрос — какой объём (в количестве дисков) будет у raid10 в mdadm, если в массиве 3 диска? Ответили? Правда же вы ответили, что-то вроде «либо полтора диска, либо один диск»? Нет? Присаживайтесь — я, конечно, не коммитил в raid10.c, но кое что когда-то нагуглил про него, да и хорошие люди показали-рассказали.

Погнали.

Если постараться свести всю статью в одно предложение, то можно выразиться примерно так — «raid10 в mdadm — это не raid1+0 или raid0+1, хотя и может ими быть, если повезёт, посмотрите в man mdadm | grep raid10».

Для начала подготовим стенд, 5 луп… эээ… loop devices по 1 гигабайту размером:

root@server:~# for i in {a..e}; do fallocate -l 1G /vd${i}; done

Сделаем блочные устройства из файлов:

root@server:~# for i in {a..e}; do for i in {a..e}; do losetup --show -f /vd${i}; done
/dev/loop9
/dev/loop10
/dev/loop11
/dev/loop12
/dev/loop13

Чудненько, теперь у нас есть блочные устройства /dev/loop{9..13}, из которых мы можем собирать что-то в mdadm.

Пробуем что-нибудь простенькое:

root@server:~# mdadm --create /dev/md0 --level 10 --raid-devices 4 /dev/loop{9..12}
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.
root@server:~# mkfs.ext4 /dev/md0; mount /dev/md0 /mnt ; df -h /mnt/; umount /mnt/
...
/dev/md0 2.0G 6.0M 1.9G 1% /mnt

Выглядит ожидаемо. А что там за непонятные буквы в мане?

root@server:~# mdadm -S /dev/md0
root@server:~# mdadm --create /dev/md0 --level 10 -p f4 --raid-devices 4 /dev/loop{9..12}
root@server:~# mkfs.ext4 /dev/md0; mount /dev/md0 /mnt ; df -h /mnt/; umount /mnt/
...
/dev/md0 990M 2.6M 921M 1% /mnt

У нас получился raid1 из 4 дисков?

root@server:~# cat /proc/mdstat
Personalities : [linear] [multipath] [raid0] [raid1] [raid6] [raid5] [raid4] [raid10]
md0 : active raid10 loop12[3] loop11[2] loop10[1] loop9[0]
1046528 blocks super 1.2 512K chunks 4 far-copies [4/4] [UUUU]

Вроде всё верно, raid10.
Получится ли сделать «raid0» из raid10?

root@server:~# mdadm -S /dev/md0
root@server:~# mdadm --create /dev/md0 --level 10 -p f1 --raid-devices 4 /dev/loop{9..12}
...
mdadm: RUN_ARRAY failed: Invalid argument

Не выходит каменный цветок — нужно минимум 2 копии файлов.
Но всё это приводит нас к тому, что md10 из двух дисков с двумя копиями — это вроде как бы raid1. И с тремя копиями из трёх дисков — тоже вроде бы raid1
Сейчас самое время задать логичный вопрос — ну и что? Вроде как пока что всё логично, raid0 из некоторого количества raid1, пусть и с тремя-четырьмя дисками в зеркале.
Давайте сделаем странное:

root@server:~# mdadm -S /dev/md0
root@server:~# mdadm --create /dev/md0 --level 10 -p n2 --raid-devices 3 /dev/loop{9..11}
root@server:~# mkfs.ext4 /dev/md0; mount /dev/md0 /mnt ; df -h /mnt/; umount /mnt/
...
/dev/md0 1.5G 4.5M 1.4G 1% /mnt

И ещё разок:

root@server:~# mdadm -S /dev/md0
root@server:~# mdadm --create /dev/md0 --level 10 -p n2 --raid-devices 5 /dev/loop{9..13}
root@server:~# mkfs.ext4 /dev/md0; mount /dev/md0 /mnt ; df -h /mnt/; umount /mnt//br
...
/dev/md0 2.4G 7.5M 2.3G 1% /mnt

Ну теперь-то я вас заинтриговал?
Да, в raid10 из нечетного количества дисков размер массива будет кратен половине объёма диска. И у вас будет по две (или сколько там вы написали) копии ЛЮБОГО блока, а не «ну на трёх дисках, наверное, получится зеркало из двух дисков плюс один диск не будет дублироваться, а массив будет объёмом в 2 диска».
Почему? Их есть у нас. Попробуем представить схему работы в raid10 в виде матрицы, где одинаковые цифры — копии блоков (столбцы — диски):

1 1 2 2
3 3 4 4
5 5 6 6
7 7 8 8

Можно справедливо предположить, что на трёх дисках получится такой массив:

1 1 2
3 3 4
5 5 6
7 7 8

Но на самом деле raid10 (в ооооочень-очень упрощённом виде) всегда работает так:

1 1 2
2 3 3
4 4 5
5 6 6

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

1 1 x 2
3 3 2 4
5 5 4 6
. . 6 .

А примерно следующим:

1 1 x 2
2 3 3 4
4 5 5 6
6 ...

И никаких «парных» дисков у вас не будет вообще.
А может быть это и вовсе дефолтное поведение, я не помню, честно говоря -)

Да, надо не забыть почистить систему от наших экспериментов:

root@server:~# mdadm -S /dev/md0; for i in /dev/loop{9..13}; do losetup -d "$i"; done; rm "/vd{a..e}"

К чему я вообще весь этот разговор затеял?
— НЕ ВЫДЁРГИВАЙТЕ 2 диска из md-raid10 НИКОГДА, БЛ*. Есть шансы потерять данные. Не, ну если копий больше двух — то 2 диска дёрнуть можно.
— если у вас 3 ssd и вам нужно одновременно оптимальные скорости чтения, записи и, одновременно, надёжность — делайте raid10 из 3 ssd с -p f2, будет хорошо (тут стоит отметить, что raid-ы с математикой исторически имели баги, приводящие к потере данных — а одинаковые блоки на дисках они и есть блоки на диске).
ЗЫ — nARN, я помню, что это ты мне рассказал.
ЗЗЫ — да, есть far-copies и near-copies (-p n и -p f, соответственно). Но лучше в мане смотрите — я могу спороть полную чушь, потом краснеть придётся.

Ну и в заключение хотелось бы сразу ответить всем тем, кто сейчас уже пишет гневное «ууу, md, ужас-ужас, медленно! Только хардкор, только хардварные».
Во-первых, закажите что-нибудь от adaptec год назад — получили? То-то же. LSI? Спасибо, знаем, покушали, больше не надо.
Во-вторых, md raid1 держит на запись 7 гигабайт в секунду на современных железках (и проц от этого не напрягается вообще) — и я даже хызы, где сейчас взять диски ещё быстрее. Разве что optane, но «are you akhueli optane in raid??».
Ну а по поводу raidz позвольте ответить цитатой из чатика:

inkvizitor68sl, [07.07.2022 23:30]
у меня недавно 2 хоста с zfs ушли в вечный d-state

nikoinlove 🐈, [07.07.2022 23:36]
[In reply to inkvizitor68sl]
вот такой зфс я узнаю

nikoinlove 🐈, [07.07.2022 23:37]
а работает с 2 гигами рам на рейдз не очень узнаю

Комментариев пока нет.

Написать комментарий