Translate

неділя, 16 червня 2013 р.

RAID: теорія та практика

Жорсткий диск завжди вважався "вузьким" місцем системи в плані надійності і, зазвичай, швидкості. Саме тому людство придумало таку технологію як RAID, що здатна в певній мірі підвищити ці показники, проте звісно не без втрат. Про це і піде далі мова.
   RAID (англ. redundant array of independent/inexpensive disks) - надлишковий масив дисків, що покликаний підвищити надійність та/або швидкість роботи постійної пам'яті. В залежності від рівня, RAID буває:

1) RAID 0 - масив, як мінімум із 2-х дисків, дані на яких розподіляються частинами (блоками) і записується відповідно на кожен диск. Тобто кожен блок знаходиться лише на одному диску. Таким чином цей масив значно підвищує швидкість запису/читання проте аж ніяк не підвищує надійність.


2) RAID 1 - дзеркальний масив. Дані на кожному із дисків ідентичні. Організація масиву в RAID 1 підвищує швидкість  читання та рівень надійності дискової системи (при пошкодженні одного із дисків, система буде працювати з іншим робочим), але все це за рахунок втрати корисної ємності одного із дисків. Тобто використовуючи два диски місця буде доступно вдвічі менше, адже вони оперують тими ж самими даними.



Окремо також існують комбінації масивів: RAID 10 та RAID 0+1. У першому типі двоє масивів RAID 1 об'єднуються в RAID 0:
Таким чином забезпечуючи високу надійність та швидкість, проте ціною зменшення ефективної ємності.
У другому, RAID 0+1, із двох масивів RAID 0 складається RAID 1:
Останній тип RAID не використовується, адже не має переваг перед попереднім. Також RAID 0+1 має меншу надійність в порівнянні з RAID 10.

3)  RAID 5 - дисковий масив, що складається як мінімум із 3 дисків, один із котрих використовується для відновлення данних у разі "випадання" одного із дисків масиву. Тобто дані як і в RAID 0 розподіляються по дискам, проте на кожному із диску масиву також  знаходяться блоки парності, сервісні дані для відновлення пошкоджених ділянок. Масив працюватиме при пошкодженні одного із дисків, а падіння наступного буде для масиву фатальним.


Принцип відновлення інформації у випадку поломки одного із дисків в масиві RAID 5 гарно описано тут.
Також варто згадати про масиви типу RAID 5E, що відрізняються від згаданого вище лиш наявністю Hot Spare диску (іншими словами запасного чистого), тож у разі пошкодження одного із дисків, одразу почнеться відновлення інформації на запасний.

4) RAID 6 - масив, для роботи якого необхідно мінімум 4 диски, характеризується більшою надлишковістю та надійністю аніж RAID 5 і трішки меншою швидкістю роботи. RAID 6 масив разом з блоками парності володіє додатковою сервісною інформацією, що розраховується по іншому алгоритму і також знаходиться послідовно на всіх дисках. У разі поломки двох дисків масив залишиться робочим.


Також звісно існують варіації RAID: RAID 2, 3, 4, проте наразі вони значно поступаються перевагами і як наслідок популярністю описаним попередньо масивам. Почитати про них можна у Вікіпедії.
В залежності від фантазії створювачів масивів в природі можуть існувати різні комбінації RAID на кшталт RAID 100, RAID 50, RAID 51 та інші.

У другій частині я хотів би описати як проходить створення програмного масиву RAID в ОС Linux.

1) Установлюємо mdadm - утиліту для налаштування і управління програмними RAID-масивами:

# apt-get install mdadm

2) За допомогою утиліти fdisk створюємо три однакові за об'ємом розділи на трьох різних фізичних дисках. Можна створити три розділи на одному диску, але сенс в тому повністю відсутній: не буде ані підвищення надійності, ані швидкості.
Будемо вважати, що було створено три розділи /dev/sda5, /dev/sdb5 та /dev/sdc5.

3)  Так можна створити RAID 0 (--level=stripe):

# mdadm --create --verbose /dev/md0 --level=stripe --raid-devices=2 /dev/sdb6 /dev/sdc5

Можливості додавання hot spare диску до масиву RAID 0 немає.
Для створення RAID 1 (--level=mirror) із та без hot spare диску необхідно виконати відповідно:

# mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 /dev/sdb1 /dev/sdc1 --spare-devices=1 /dev/sdd1
# mdadm --create --verbose /dev/md0 --level=mirror --raid-devices=2 /dev/sdb1 /dev/sdc1

Для створення RAID 5 (--level=5) із hot spare диском необхідно виконати:

# mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sda5 /dev/sdb5 /dev/sdc5 --spare-devices=1 /dev/sde5

Для екпериментальних цілей я створив RAID 5 без hot spare диску:

# mdadm --create --verbose /dev/md0 --level=5 --raid-devices=3 /dev/sda5 /dev/sdb5 /dev/sdc5
mdadm: layout defaults to left-symmetric
mdadm: layout defaults to left-symmetric
mdadm: chunk size defaults to 512K
mdadm: size set to 5238272K
mdadm: Defaulting to version 1.2 metadata
mdadm: array /dev/md0 started.

--create - режим створення
--verbose - просимо mdadm "говорити" більше
--level - рівень RAID-масиву, у нашому випадку це п'ятий рівень
--raid-devices - к-ть дисків, що братимуть участь у створенні масиву

Перевірити чи правильно було проініціалізовано масив можна в /proc/mdstat:

# cat /proc/mdstat
Personalities : [raid6] [raid5] [raid4] 
md0 : active raid5 sdc5[3] sdb5[1] sda5[0]
      10476544 blocks super 1.2 level 5, 512k chunk, algorithm 2 [3/2] [UU_]
      [===>.................]  recovery = 19.1% (1001644/5238272) finish=3.7min speed=18578K/sec
unused devices: <none>

4) Форматуємо новостворений RAID-масив в файлову систему ext3:

# mkfs.ext3 -v -b 4096 -E stride=32,stripe-width=64 /dev/md0
mke2fs 1.42.5 (29-Jul-2012)
fs_types for mke2fs.conf resolution: 'ext3'
Filesystem label=
OS type: Linux
Block size=4096 (log=2)
Fragment size=4096 (log=2)
Stride=32 blocks, Stripe width=64 blocks
655360 inodes, 2619136 blocks
2619 blocks (0.10%) reserved for the super user
First data block=0
Maximum filesystem blocks=2684354560
80 block groups
32768 blocks per group, 32768 fragments per group
8192 inodes per group
Superblock backups stored on blocks: 
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done                            

Writing inode tables: done                            
Creating journal (32768 blocks): done
Writing superblocks and filesystem accounting information: done

-v - verbose режим
-b - розмір блоку
-E - extended, додаткові опції
stride -  к-ть блоків, які будуть записані на диск масиву перед переходом для запису на інший фізичний диск. (дані в RAID 6, 5, 0 пишуться страйпами(блоками) на кожен диск).
stripe-width - к-ть блоків, що записується на всі data-диски в масиві і розраховується відповідго як stripe-width=stride * (N-1), 1 диск використовується як диск парності для відновлення даних в RAID 5.

Як варіант розрахувати stride та stripe-width можна використавши це посилання http://busybox.net/~aldot/mkfs_stride.html

5) Операційна система не запам'ятовує які масиви їй необхідно створити при завантаженні, тому необхідно це описати в /etc/mdadm/mdadm.conf:

# echo "DEVICE partitions" > /etc/mdadm/mdadm.conf
# mdadm --detail --scan --verbose | awk '/ARRAY/ {print}' >> /etc/mdadm/mdadm.conf

6) Все, можна монтувати блочний пристрій /dev/md0 і використовувати:

# mkdir /media/raid
# mount /dev/md0 /media/raid

2 коментарі: