Если информация была полезной для вас, вы можете поблагодарить за труды Яндекс деньгами: 41001164449086 или пластиковой картой:

Собираем mdadm soft RAID5 из 3Tb WD Red с Advanced Format

В Интернет можно найти достаточно статей по созданию софтовых RAID под Linux при помощи mdadm, однако мне хотелось бы рассказать об особенностях, которые возникают если это делать с дисками объёмом 3000Гб и более. Ещё более интересно, когда диски имеют физический сектор 4 КБ аля Advanced Format, со всеми вытекающими последствиями по выравниванию и оптимизации.

Итак сразу переходим к сути вопроса.
В качестве примера я рассмотрю случай создания RAID5 из 3-х дисков, хотя всё нижеизложенное справедливо и для массивов с бОльшим количеством дисков и дисков бОльшего объёма.

Если говорить по простому, то soft RAID по средствам mdadm организуется путём объединения нескольких разделов расположенных на физически разных дисках. Т.е. mdadm оперирует разделами на дисках, а не самими дисками. В принципе можно оперировать и самими дисками, но это в корне не правильно, о чём чуть позже.

Итак, прежде всего, для организации RAID надо создать соответствующие разделы на дисках.
В качестве дисков будут использоваться - Western Digital Red WD30EFRX. Это 3Tb диски с Advanced Format (AF), а значит необходимо учитывать физический размер сектора 4Кб для оптимального быстродействия.
Поскольку мы будем иметь дело с дисками объёмом более 2000Гб, то будем пользоваться утилитой parted, которая их корректно поддерживает, в отличия от fdisk и её производных.

Кроме 3-х дисков под RAID5, в системе также есть ещё один небольшой диск под систему. Вопросы почему система находиться не на RAID рассматривать здесь не будем, но если в вкратце, то так проще и правильнее.

Для начала просмотрим информацию по имеющимся в системе дискам, для чего даём соответствующую команду:

[root@nas ]# parted -l
Модель: ATA WDC WD30EFRX-68A (scsi)
Диск /dev/sda: 3001GB
Размер сектора (логич./физич.): 512B/512B
Таблица разделов: unknown
Disk Flags:

Модель: ATA WDC WD30EFRX-68A (scsi)
Диск /dev/sdb: 3001GB
Размер сектора (логич./физич.): 512B/512B
Таблица разделов: unknown
Disk Flags:

Модель: ATA WDC WD30EFRX-68A (scsi)
Диск /dev/sdc: 3001GB
Размер сектора (логич./физич.): 512B/512B
Таблица разделов: unknown
Disk Flags:

Модель: ATA WDC WD5003AZEX-0 (scsi)
Диск /dev/sdd: 500GB
Размер сектора (логич./физич.): 512B/512B
Таблица разделов: msdos
Disk Flags:

Номер Начало Конец Размер Тип Файловая система Флаги
1 1049kB 472GB 472GB primary ext4 загрузочный



Соответственно:
/dev/sda – RAID5
/dev/sdb – RAID5
/dev/sdc – RAID5
/dev/sdd – системный.

Как было написано ранее, mdadm оперирует разделами, а следовательно их необходимо создать, для чего воспользуемся parted.

[root@nas ]# parted /dev/sda
GNU Parted 3.1
Используется /dev/sda
(parted) mklabel gpt
(parted) mkpart raid ext4 1Mib 3000GB
(parted) set 1 raid on
(parted) print
Модель: ATA WDC WD30EFRX-68A (scsi)
Диск /dev/sda: 3001GB
Размер сектора (логич./физич.): 512B/512B
Таблица разделов: gpt
Disk Flags:

Номер Начало Конец Размер Файловая система Имя Флаги
1 1049kB 3000GB 3000GB ext4 raid
(parted) q



Теперь несколько подробнее по тому, что здесь написано:
parted /dev/sda
Запустили parted и начали работать с диском /dev/sda

(parted) mklabel gpt
Cоздали разметку диска в GPT формате.

Если коротко, то разметка в системе MBR (MSDOS) не позволяет работать с разделами более 2-х Тб, а нам то как раз надо больше, именно по этому будем использовать GPT.

(parted) mkpart raid ext4 1Mib 3000GB
Создали 1 раздел (в системе GPT разделы идут по номерам без разделения primary, extended и т.д.) с именем raid в котором будет файловая система ext4, с началом 1МiB (т. е. честные - 1024) и окончанием 3000GB (не честные — 1000).

Теперь несколько подробнее, почему были выбранены именно такие значения.
Поскольку мы имеем дело с Advanced Format, то необходимо учитывать, что физический размер сектора равен 4 Кб, и для предотвращения потери производительности необходимо, чтобы разметка диска была кратной 4КБ.
В данном случае - 1МiB, т.е отступ он начала, составил 1024КБ/4КБ=256 физических секторов.

Вообще, при современном размере жёстких дисков советую в любом случае разбивать их на разделы кратные 1МiB (т. е. честные мегабайты), в не зависимости от того используется ли Advanced Format или нет. Это гарантированно защитит вас от возможной потери производительности, от несовпадения физического и логического секторов. Ну да ладно, мы отвлеклись, все кому будет интересна эта тема более подробно, смогут сами изучить её в полной мере.

Окончание раздела надо выбирать исходя из тех соображений, что он должен быть несколько меньше физического объёма диска.
Всё дело в том, что диски разных производителей и разные моделей имеют несколько разные размеры, несмотря на то, что на всех них написан один и тот же объём. Различия минимальны, но они есть.
Получается, что в случае поломки одного из дисков в RAID массиве, может возникнуть ситуация при которой, новый купленный диск окажется чуть меньшего объёма чем вышедший из строя. Восстановить работу RAID массива тогда не получиться, поскольку размер раздела на новом диске должен быть равен либо больше размера, что и существующие в RAID массиве.
Именно по этому окончание раздела выбирается с некоторым запасом относительно физического объёма. Фуф, вроде понятно объяснил...

В моём случая я выбрал 3000GB (не честные — 1000), т. е. меньше чем физический размер 3001GB, в принципе можно было сделать даже 2999GB, но тут уже надо действовать по обстоятельствам. Самое главное при этом руководствоваться выше изложенными соображениями.

Почти всё, осталось совсем немного.
(parted) set 1 raid on
Для того чтобы mdadm корректно воспринял разделы, необходимо установить флаг raid в состояние on. Что соответственно и было сделано на 1-вом разделе.

Ну и последняя команда print просто вывела информацию о диске после проделанных манипуляций.

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

[root@nas ]# parted -l
Модель: ATA WDC WD30EFRX-68A (scsi)
Диск /dev/sda: 3001GB
Размер сектора (логич./физич.): 512B/512B
Таблица разделов: gpt
Disk Flags:

Номер Начало Конец Размер Файловая система Имя Флаги
1 1049kB 3000GB 3000GB raid raid

Модель: ATA WDC WD30EFRX-68A (scsi)
Диск /dev/sdb: 3001GB
Размер сектора (логич./физич.): 512B/512B
Таблица разделов: gpt
Disk Flags:

Номер Начало Конец Размер Файловая система Имя Флаги
1 1049kB 3000GB 3000GB raid raid


Модель: ATA WDC WD30EFRX-68A (scsi)
Диск /dev/sdc: 3001GB
Размер сектора (логич./физич.): 512B/512B
Таблица разделов: gpt
Disk Flags:

Номер Начало Конец Размер Файловая система Имя Флаги
1 1049kB 3000GB 3000GB raid raid


Модель: ATA WDC WD5003AZEX-0 (scsi)
Диск /dev/sdd: 500GB
Размер сектора (логич./физич.): 512B/512B
Таблица разделов: msdos
Disk Flags:

Номер Начало Конец Размер Тип Файловая система Флаги
1 1049kB 472GB 472GB primary ext4 загрузочный



Всё, все разделы созданы, теперь можно собирать наш RAID по средствам mdadm:

[root@nas ]# mdadm --create /dev/md0 --level=5 --raid-devices=3 /dev/hda1 /dev/hdb1 /dev/hdc1



Посмотреть текущее состояние RAID можно следующим образом:

[root@nas ]# mdadm --detail /dev/md0
/dev/md0:
Version : 1.2
Creation Time : Fri Jul 12 21:14:31 2013
Raid Level : raid5
Array Size : 5859322880 (5587.89 GiB 5999.95 GB)
Used Dev Size : 2929661440 (2793.94 GiB 2999.97 GB)
Raid Devices : 3
Total Devices : 3
Persistence : Superblock is persistent

Update Time : Thu Jul 25 15:13:09 2013
State : clean
Active Devices : 3
Working Devices : 3
Failed Devices : 0
Spare Devices : 0

Layout : left-symmetric
Chunk Size : 512K

Name : localhost:0
UUID : d73b4ae7:45ecf208:4fefc59e:33f8bcaf
Events : 2553

Number Major Minor RaidDevice State
4 8 1 0 active sync /dev/sda1
1 8 17 1 active sync /dev/sdb1
3 8 33 2 active sync /dev/sdc1



На самом деле если дать такую команду сразу после создания массива, то в строке State будет сообщение о том, что массив проверяется. В моём же случае массив был уже давно собран, по этому статус – Clean.

Теперь надо создать файловую систему на собранном массиве:

[root@nas ]# mkfs.ext4 /dev/md0



Я предпочитаю ext4, но вы можете использовать любую другую на ваш вкус. Тут следует обратить внимание на то, что файловая система создаётся сразу поверх устройства, без создания разделов на нём.

После этого можно подмонтировать наш RAID к файловой системе:

[root@nas ]# mount /dev/md0 /mnt/raid



Узнаем UUID для нашего раздела и внесём соответствующие изменения в файлы конфигураций, для того чтобы RAID автоматически монтировался при загрузке:

[root@nas ]# blkid
/dev/sda1: UUID="d73b4ae7-45ec-f208-4fef-c59e33f8bcaf" UUID_SUB="93735f8c-6b20-0070-c982-b337e93c2524" LABEL="localhost:0" TYPE="linux_raid_member" PARTLABEL="ext4" PARTUUID="44c83b1d-fdf3-40b6-a2be-3bea81671452"
/dev/sdb1: UUID="d73b4ae7-45ec-f208-4fef-c59e33f8bcaf" UUID_SUB="e3998895-141b-b983-4735-9ecb262b6cf8" LABEL="localhost:0" TYPE="linux_raid_member" PARTLABEL="ext4" PARTUUID="6847b62f-2801-45c7-b1ba-85b8eeb182e0"
/dev/sdc1: UUID="d73b4ae7-45ec-f208-4fef-c59e33f8bcaf" UUID_SUB="884944c3-11fa-1be9-672c-e0bfb0387a9c" LABEL="localhost:0" TYPE="linux_raid_member" PARTLABEL="ext4" PARTUUID="22a3daf5-38b9-41a0-80d3-db37381f3e0e"
/dev/sdd1: UUID="0884b59a-439e-4586-a512-a8621344b0a2" TYPE="ext4"
/dev/md0: UUID="a13f2c38-cf60-4e05-bc19-147b909e462c" TYPE="ext4"



После чего внесём необходимую запись в конфиг:

[root@nas ]# echo “UUID=a13f2c38-cf60-4e05-bc19-147b909e462c /mnt/raid ext4 auto” >> /etc/fstab



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

В силу некоторых обстоятельств, иногда /dev/md0 вдруг становиться /dev/md127, для того чтобы этого не возникало достаточно сделать запись о нашем массиве в конфигурационном файле mdadm:

[root@nas ]# echo “ARRAY /dev/md0 UUID=d73b4ae7:45ecf208:4fefc59e:33f8bcaf” >> /etc/mdadm.conf



UUID, можно узнать из:

[root@nas dark705]# mdadm --detail /dev/md0



Кроме этого хочу дать ещё одну полезную команду, которая существенно увеличивает производительность записи для RAID 5 и 6-тых уровней:

[root@nas dark705]# /usr/bin/echo 16384 > /sys/block/md0/md/stripe_cache_size



Более подробно для что нужна эта команда, можно узнать по адресу:
http://romanrm.ru/mdadm-raid

Автор великолепно всё расписал, и повторяться я думаю не имеет смысла.

Внесённые изменения действуют до перезагрузки, поэтому неплохо бы организовать выполнение этой команды автоматически. Как это сделать зависит от дистрибутива.

Для Mageia 1-3 и многих других достаточно внести её в файл:

[root@nas rc.d]# echo “/usr/bin/echo 16384 > /sys/block/md0/md/stripe_cache_size” >> /etc/rc.d/rc.local



Ну и напоследок простенькое тестирование производительности получившегося у меня массива:

[root@nas rc.d]# dd if=/dev/zero of=/mnt/raid/test.hdd bs=1G count=40
40+0 записей получено
40+0 записей отправлено
скопировано 42949672960 байт (43 GB), 145,78 c, 295 MB/c
[root@nas rc.d]# dd of=/dev/zero if=/mnt/raid/test.hdd bs=1G count=40
40+0 записей получено
40+0 записей отправлено
скопировано 42949672960 байт (43 GB), 141,144 c, 304 MB/c



Скорость чтения - 304 MB/c, а скорость записи - 295 MB/c, по моему результаты просто отличные!

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


Если информация была полезной для вас, вы можете поблагодарить за труды Яндекс деньгами: 41001164449086 или пластиковой картой: