понедельник, 21 января 2008 г.

Построение программных RAID массивов средствами Solaris Volume Manager.

Сегодня, предоставление качественных услуг в сфере информационных технологий довольно сильно зависит от выбора дисковой системы хранения, на которую будет ложится основная нагрузка предоставления сервисов функционирующих 24 часа в сутки и 365 дней в неделю. Для обеспечения надежности функционирования дисковых систем и сохранности данных, используется технология RAID (Redundant Array of Inexpensive Disks). Задача данной статьи - описать технологии создания программных RAID-массивов в операционной системе Sun Solaris 10. Будет подробно описано построение RAID уровней 0, 1, 5 c помощью Solaris Volume Manager (SVM).

Введение


RAID устройства представляют собой набор дисков, объединенных по особым правилам в один виртуальный дисковый носитель. В операционной системе Sun Solaris используется довольно мощный программный продукт для организации RAID устройств - Solaris Volume Manager (SVM). Начиная с Solaris 9 (в Solaris 8 это был отдельный продукт – Solstice Disk Suite), он интегрирован в систему и предоставляет механизмы по созданию не только RAID устройств, но и расширяет функциональные возможности дисковой системы в Sun Solaris.
Не из редких случаев рядовому администратору требуется настроить Software-RAID с нуля, только потому что аппаратного RAID не имеется. И многие задаются вопросом "Почему в серверах компании SUN нет встроенного RAID-контроллера, а в x86 платформах он присутствует ?" На этот вопрос мне помог ответить Юрий Воинов, сертифицированный специалист и инструктор Sun Solaris 10 и Oracle DB.

"Ответ состоит из нескольких пунктов.
1. Компоненты и устройства Sun достаточно быстродействующие и дорогие, чтобы можно было позволить их встраивать "про запас" и "чтобы было". Даже при покупке, например, cерверов Sun x64 с дисками SAS контроллер SAS необходимо устанавливать отдельно (при заказе серверов с дисками SAS он комплектуется по умолчанию). Это не тайваньский ширпотреб, производимый миллионами, куда достаточно впаять китайский чип стоимостью 15 долларов.
2. Sun производит оборудование общего назначения и далеко не во всех случаях требуется наличие аппаратных RAID-контроллеров. У Sun, например, есть парадигма Sun Cluster, согласно которой RAID-контроллер целесообразно размещать на стороне дисковой системы, не на стороне процессорных модулей. Это разумно со всех точек зрения, так как аппаратный RAID серверного класса-сложное самостоятельное устройство, как и было сказано - значительно более дорогое, чем, скажем, ATA/SATA RAID.
3. В соответствие с вышеуказанной парадигмой, в системные блоки устанавливаются высокоскоростные контроллеры ввода-вывода (SCSI/FC-AL etc.), к которым и подключаются оконечные устройства хранения, могущие содержать аппаратные RAID-контроллеры.
В этой связи Sun давно выносит аппаратные RAID-контроллеры в специализированные системы хранения:
http://www.sun.com/storagetek/index.jsp

Почему нет и скорей всего никогда не будет RAID-контроллеров в системных блоках Sun?
Ответ прост. Нецелесообразно. Системные диски зеркалируются средствами Solaris Volume Manager, имеют достаточно статичную структуру и достаточно высокое быстродействие, а также легко и (в силу относительно небольшого объема) быстро резервируются и восстанавливаются штатными системными средствами. Некоторые рабочие станции Sun комплектовались аппаратными RAID-контроллерами SCSI. Но, насколько мне известно, сейчас эти модели сняты с производства."

Собственно после разумного и внятного объяснения, мы перейдем к теме создания RAID массивов.

Часть 1. RAID 0.

RAID 0 (Striping) — Представляет собой совокупность двух или более жестких дисков, которые объединяются в единое логическое устройство, с отсутствием избыточности. Информация разбивается на блоки данных (Ai) и записывается на оба/несколько диска поочередно. За счет этого существенно повышается производительность(от количества дисков зависит кратность увеличения производительности), но страдает надежность всего массива. При выходе из строя любого из входящих в RAID 0 винчестеров полностью и безвозвратно пропадает вся информация. Обычно данный тип RAID настраивают в целях повышения производительности дисковой системы, либо для увеличения ее объема.

RAID-0 устройства можно создавать на всю партицию диска и на отдельные части файловой системы: /(root), /usr, /var, /opt, swap и т.д.

Существует три функциональных механизма работы RAID-0:
- Распределение (stripe)
- Склеивание (concatenation)
- Склеивание «распределенных» томов (concatenated stripe)

База данных состояния метадевайсов.

В самом начале перед процессом создания массивов нам нужно создать так называемую Metadevice State Database (далее - MSD), в которой хранится конфигурация и состояние RAID-устройств в системе. Если система не сможет прочитать информацию с данных баз, то все данные о RAID устройствах исчезнут, а вместе с ними и вся хранившаяся информация. Для хранения MSD используются небольшие отдельные разделы, например на 7-ом слайсе. В этих разделах может храниться несколько копий MSD, которые называются State Database Replicas. Одна SR (реплика) занимает приблизительно 4-5 Мбайт. Рекомендуется создавать как минимум 2 таких реплики, но чем больше тем лучше.

Создание метабаз производится командой metadb, а мониторинг состояния этих баз производится командой metastat. В качестве примера мы возьмем 3 диска и создадим на каждом из них по 3 реплики в отдельном 7-ом слайсе, объемом 15 Мб (3x5=15).
suncow # metadb -a -f -c 3 c0t0d0s7 c0t1d0s7 c1t0d0s7
suncow # metadb
flags first blk block count
a u 16 8192 /dev/dsk/c0t0d0s7
a u 8208 8192 /dev/dsk/c0t0d0s7
a u 16400 8192 /dev/dsk/c0t0d0s7
a u 16 8192 /dev/dsk/c0t1d0s7
a u 8208 8192 /dev/dsk/c0t1d0s7
a u 16400 8192 /dev/dsk/c0t1d0s7
a u 16 8192 /dev/dsk/c1t0d0s7
a u 8208 8192 /dev/dsk/c1t0d0s7
a u 16400 8192 /dev/dsk/c1t0d0s7

Создание RAID-0 Stripe Volumes.

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

Не создавайте логические тома больше 1Тб, если вы запускаете ПО Solaris с 32-ух битным ядром или используемая версия вашей ОС Solaris 9 4/03.

Теперь давайте а качестве примера возьмем эти 3 диска и объединим их в Stripe. Для этого мы с помощью format также приготовили отдельные слайсы на каждом из дисков по 6 Гб.
suncow # metainit d10 1 3 c0t0d0s0 c0t1d0s0 c1t0d0s0
d10: Concat/Stripe is setup

Данной командой мы создали RAID-устройство d10 как 1 отдельное устройство (цифра 1) с 3 дисками (цифра 3).
Проверяем что у нас получилось.
suncow # metastat d10
d10: Concat/Stripe
Size: 12514635 blocks (6.0 GB)
Stripe 0: (interlace: 1024 blocks)
Device Start Block Dbase Reloc
c0t0d0s0 32130 Yes Yes
c0t1d0s0 32130 Yes Yes
c1t0d0s0 32130 Yes Yes

Device Relocation Information:
Device Reloc Device ID
c1d1 Yes id1,cmdk@AMaxtor_2F020J0=F14BT74E

Создание RAID-0 Concatenation Volumes.

При механизме «сoncatenation» (склеивание), данные записываются в первую часть логического тома, а по его заполнении – во вторую, и т.д. Очевидно, что в данном случае никакого повышения производительности операций ввода/вывода не происходит, так как данные записываются последовательно. RAID-0 в режиме «сoncatenation» оптимально подходит для ситуаций, когда необходимо организовать дисковый раздел определенного размера, собрав его из нескольких частей. Важной особенностью данного механизма, является возможность динамически расширять размер логического тома, добавляя новые части дисков. Кроме того, эти действия можно проводить на «активной» файловой системе без нарушения ее работоспособности.

suncow # metainit d30 3 1 c0t0d0s1 c0t1d0s1 c1t0d0s1
d30: Concat/Stripe is setup

Этот пример создает склеиваемое устройство d30, которое состоит из трех "stripes" (цифра 3), каждая из единого слайса (цифра 1 в передней части каждого слайса). Давайте проверим наше устройство.
suncow # metastat d30
d30: Concat/Stripe
Size: 12627090 blocks (6.0 GB)
Stripe 0:
Device Start Block Dbase Reloc
c0t0d0s1 0 No Yes
Stripe 1:
Device Start Block Dbase Reloc
c0t1d0s1 0 No Yes
Stripe 2:
Device Start Block Dbase Reloc
c1t0d0s1 0 No Yes

Device Relocation Information:
Device Reloc Device ID
c1d1 Yes id1,cmdk@AMaxtor_2F020J0=F14BT74E
Давайте смонтируем данное устройство в системе.
suncow # newfs /dev/md/dsk/d30
/dev/md/rdsk/d30: Unable to find Media type. Proceeding with system determined parameters.
newfs: construct a new file system /dev/md/rdsk/d30: (y/n)? y
Warning: 13230 sector(s) in last cylinder unallocated
/dev/md/rdsk/d30: 12627090 sectors in 836 cylinders of 240 tracks, 63 sectors
6165.6MB in 120 cyl groups (7 c/g, 51.68MB/g, 6272 i/g)
super-block backups (for fsck -F ufs -o b=#) at:
32, 105936, 211840, 317744, 423648, 529552, 635456, 741360, 847264, 953168,
11649472, 11755376, 11861280, 11967184, 12073088, 12178992, 12284896,
12390800, 12496704, 12602608
suncow # mkdir /data
suncow # mount /dev/md/dsk/d30 /data/
suncow # df -h /data/
Filesystem size used avail capacity Mounted on
/dev/md/dsk/d30 5.9G 6.0M 5.9G 1% /data

Для добавления еще одного диска в наш сoncatenation-volume нужно выполнить команду metattach:
suncow # metattach d20 c1t1d0s1
d20: component is attached

И после пересоздания файловой системы у нас будет диск объемом в 8 Гб.
Теперь удалим наши RAID-устройства
suncow # umount /data
suncow # metaclear -a
d20: Concat/Stripe is cleared

Часть 2. RAID 1.

RAID 1 (Mirroring — «зеркало»). Обеспечивает приемлемую скорость записи и выигрыш по скорости чтения за счет распараллеливания запросов. Имеет высокую надежность - работает до тех пор пока функционирует хотя бы один диск в массиве. Недостаток заключается в том, что приходится выплачивать стоимость двух жёстких дисков, получая полезный объем одного жёсткого диска (классический случай, когда массив состоит из двух дисков).
Стандартное «зеркало» состоит из двух частей: «главного зеркала» и «вторичного зеркала». Вы можете добавить еще одно либо два дополнительных «вторичных зеркала» и использовать их для backup-а системы. Таким образом, можно «на горячую» производить архивирование файловой системы, организованной механизмом RAID-1

SVM поддерживает два вида RAID-1 устройств:
- RAID-0+1 – технология зеркалирования «распределенных» томов
- RAID-1+0 – технология распределения «зеркальных» томов

В случае использования технологии RAID-0+1, выход из «строя» одной из частей «распределенного» тома повлечет за собой нарушение работы всего «вторичного зеркала».
Пример организации технологии RAID-0+1 представлен на следующем рисунке:

В отличие от RAID-0+1, технология 1+0 более защищена от возможных сбоев при выходе из «строя» одного из компонентов в любом зеркале, нарушения работы не произойдет. Как видно на следующем рисунке, RAID-1+0 представляет собой совокупность зеркальных томов, объединенных в «распределенное» логическое устройство:

Создание RAID-1.

Давайте рассмотрим пример построение RAID-1 на основе настройки зеркала для корневого раздела / (root). Для сокращения нашего времени и объема статьи мы не будем углубляться в описание настройки деления слайсов. Хочу лишь отметить что слайсы должны быть не меньше друг друга по объему, а также отмечу сразу что метабазы уже созданы.
В начале нам потребуется создать RAID-0 Concatenation устройства которые в последствии мы объединим в RAID-1 Mirror. За пример возмем 2 диска с нулевыми слайсами которые мы и будем зеркалить.

Создаем устройство d11 из слайса c0d0s0 на котором находится корневой раздел системы
suncow # metainit -f d11 1 1 c0d0s0
d11: Concat/Stripe is setup

Создаем устройство d12 из слайса c1d1s0 который зазеркалируем с корневым разделом системы.
suncow # metainit -f d12 1 1 c1d1s0
d12: Concat/Stripe is setup

Создаем устройство d10 как Mirror-device и добавляем в него устройство d11.
suncow # metainit d10 -m d11
d10: Mirror is setup

Теперь надо указать нашей системе что корневой раздел это /dev/md/dsk/d10. Для это мы воспользуемся командой metaroot.
suncow # metaroot d10
Теперь посмотрим что конкретно поменяла эта команда в нашей системе.
suncow # cat /etc/vfstab | grep md
/dev/md/dsk/d10 /dev/md/rdsk/d10 / ufs 1 no -
suncow # tail /etc/system | grep md
rootdev:/pseudo/md@0:0,12,blk

Отпраляем систему на reboot для ее загрузки с устройства d10 и возможности добавления в зеркало d10 второго устройства d12.
suncow # init 6
Теперь добавляем устройство d12 в наше зеркало
suncow # metattach d10 d12
d10: submirror d12 is attached

И смотрим результат состояния устройств.
suncow # metastat d10
d10: Mirror
Submirror 0: d11
State: Okay
Submirror 1: d12
State: Resyncing
Resync in progress:
4 % done
Pass: 1
Read option: roundrobin (default)
Write option: parallel (default)
Size: 1048707 blocks (512 MB)
d11: Submirror of d10
State: Okay
Size: 10635030 blocks (5.1 GB)
Stripe 0:
Device Start Block Dbase State Reloc Hot Spare
c0d0s0 0 No Okay Yes
d12: Submirror of d10
State:
Resyncing
Size: 10635030 blocks (5.1 GB)
Stripe 1:
Device Start Block Dbase State Reloc Hot Spare
c1t1s0 0 No Okay Yes
Device Relocation Information:
Device Reloc Device ID
c0d0 Yes id1,cmdk@AST380011A=5JV3A9CR
c1d1 Yes id2,cmdk@AST345093B=5LJ34KKE

Как мы видим все прошло успешно и в данный момент проходит синхронизация нашего зеркала. Теперь нужно установить загрузочную область (bootblk) на устройство d12 для возможности загружаться с него.

Установить bootblk можно с помощью команды installboot:
Для sparc-платформы команда будет выглядеть так:

suncow # installboot /usr/platform/`uname -i`/lib/fs/ufs/bootblk /dev/rdsk/c1d1s0

Для х86-платформы немного по другому:

suncow # installboot /usr/platform/`uname -i`/lib/fs/ufs/pboot \
/usr/platform/`uname -i`/lib/fs/ufs/bootblk /dev/rdsk/c1d1s2


Теперь осталось лишь прописать в OpenBoot (ok) альтернативный вариант загрузки. Сперва надо определмть физическое имя для нашего раздела c1d1s0.
suncow # ls -l /dev/rdsk/c1d1s0
lrwxrwxrwx 1 root root 47 Dec 28 09:05 /dev/rdsk/c1d1s0 ->../../devices
/pci@1c,600000/scsi@2/sd@1,0:e,raw
Теперь переходим в командный режим OpenBoot
suncow # init 0
Для удобства создаем удобный alias для физического раздела
ok nvalias mirror /pci@1c,600000/scsi@2/disk@1,0:e
Смотрим в каком порядке выставлена загрузка
ok printenv boot-device
boot-device= disk net

Указываем новый порядок загрузки
ok setenv boot-device disk mirror net
boot-device= disk mirror net

Грузимся с зеркального раздела для проверки загрузки.
ok boot mirror
Также можно использовать утилиту eeprom для конфигурации OpenBoot. Данный вариант подходит если вы находитесь далеко от сервера либо вам нежелательна остановка сервисов и ПО.
suncow # eeprom nvalias mirror /pci@1c,600000/scsi@2/disk@1,0:e
suncow # eeprom nvalias mirror /pci@1c,600000/scsi@2/disk@1,0:e
suncow # setenv boot-device disk mirror net
boot-device= disk mirror net

В случае какого либо рода сбоя основного диска, система автоматически загрузится с резервного раздела.
Для задачи настроить зеркала на все рабочие разделы (например /, /var, /usr, /opt итд), советую воспользоваться командой prtvtov. Например ниже приведенная команда перенесет таблицу разбиения первого диска на второй.
suncow # prtvtoc /dev/rdsk/c0t0d0s2 | fmthard –s - \
/dev/rdsk/c1t1d1s2

Эта операция экономит вам время без использования утилиты format.

Давайте теперь представим что вам нужно удалить то зеркало которое мы только что настроили. Для начала там нужно вывести из зеркала то устройство которое мы подсоединили.
suncow # metadetach d10 d12
d10: submirror d12 is detached

Указываем системе «boot»-устройство и перезагрузим ее:
suncow # metaroot /dev/dsk/c0d0s0
suncow # init 6
Удаляем зеркало d10 и ассоциированное с ним RAID-0 устройство d11:
suncow # metaclear -r d10
d10: Mirror is cleared
d11: Concat/Stripe is cleared

Удаляем RAID-0 устройство d12:
suncow # metaclear d12
d12: Concat/Stripe is cleared

Часть 3. RAID 5.

Cамый популярный из уровней, в первую очередь благодаря своей экономичности. Жертвуя ради избыточности емкостью всего одного диска из массива, мы получаем защиту от выхода из строя любого из винчестеров тома. Данный тип устройств очень похож на технологию RAID-0, но, в отличие от
«распределенных» томов, содержит специальную область на каждом диске с данными контроля четности одного из компонентов тома.
На запись информации на том RAID 5 тратятся дополнительные ресурсы, так как требуются дополнительные вычисления, зато при чтении (по сравнению с отдельным винчестером) имеется выигрыш, потому что потоки данных с нескольких накопителей массива распараллеливаются.

Если по какой-либо причине компонент RAID-5 системы выходит из «строя», то
данные, которые были на нем, автоматически восстановятся на основании информации с других компонентов тома. Для того чтобы данный механизм успешно функционировал, количество дисков, объединяемых в RAID-5, должно быть больше трех. Если вы не используете Hot Spare Pools (пул дисков «горячей» замены), то система может восстановить только один поврежденный компонент тома. Суммарный размер RAID-5 тома равен количеству дисков, объединенных в том, уменьшенному на размер одного дискового носителя.

RAID-5 нельзя использовать для разделов: /(root), /usr и swap, а также для уже
существующих файловых систем.

Создание RAID-5.

RAID-5 соберается довольно легко. Достаточно выполнить всего лишь одну команду:
suncow # metainit d20 -r c1t0d0s2 c2t0d0s2 c3t0d0s2
d45: RAID is setup
suncow # metastat d20
d20: RAID
State: Okay
Interlace: 32 blocks
Size: 10080 blocks
Original device:
Size: 8087040 blocks
Device Start Block Dbase State Hot Spare
c1t0d0s2 330 No Okay
c2t0d0s2 330 No Okay
c3t0d0s2 330 No Okay

Собственно все. А добавляются новые диски в рабочий RAID-5 аналогично тому как это делалось с зеркальными устройствами с помощью команды metattach:
suncow # metattach d20 c4t0d0s2
d20: column is attached

Замена поврежденных томов в RAID-5 устройстве осуществляется с помощью механизма пулов «горячей» замены либо в «ручную», используя команду metareplace:
suncow # metareplace d20 c3t0d0s2 c3t1d0s2
d20: device c3t0d0s2 is replaced with c3t1d0s2

Hot Spare Pools (пулы «горячей» замены). Пулы «горячей» замены предоставляют возможность повысить надежность функционирования RAID-1 и RAID-5 устройств. Они представляют собой набор дисковых частей, которые по мере необходимости используются вместо поврежденных частей RAID-тома. Когда происходит ошибка в работе RAID, система просматривает пул и выбирает доступные и подходящие по размеру предварительно заготовленные «разделы замены». Найдя подходящий раздел, она помечает его как “In-Use”, включает в RAID-том и проводит синхронизацию данных. Вы можете создавать и изменять пулы, назначать их разным RAID устройствам, но сами эти устройства могут ассоциироваться только с одним объявленным пулом. RAID устройства используют пулы до тех пор, пока поврежденные части не
будут заменены. После этого ресурс пула освобождается, устанавливается в состояние “Available” и может использоваться снова.

Создаются пулы с помощью команды metainit:
suncow # metainit hsp001 c2t2d0s2 c3t2d0s2
hsp001: Hotspare pool is setup
suncow # metastat hsp001
hsp001: 1 hot spare
c2t2d0s2 Available 16800 blocks
c3t2d0s2 Available 16800 blocks

Добавить диски в существующий пул можно так
suncow # metahs -a hsp001 /dev/dsk/c3t0d0s2
hsp001: Hotspare is added
suncow # metastat hsp001
hsp001: 1 hot spare
c2t2d0s2 Available 16800 blocks
c3t2d0s2 Available 16800 blocks
c3t0d0s2 Available 16800 blocks

Если у нас создано несколько пулов, и мы хотим добавить данный диск во все имеющиеся у нас пулы «горячей» замены, то необходимо добавить опцию –all:
suncow # metahs -a -all   /dev/dsk/c3t0d0s2
hsp001: Hotspare is added
hsp002: Hotspare is added
hsp003: Hotspare is added

После того как пулы созданы, их необходимо назначить RAID-устройствам, которые будут ими пользоваться в случае необходимости. Добавим к созданному нами зеркалу d10, точнее к его компонентам d11 и d12, пул «горячей» замены — hsp001:
suncow # metaparam -h hsp001 d11
suncow # metaparam -h hsp001 d12
suncow # metastat d10
d10: Mirror
Submirror 0: d11
State: Okay
Submirror 1: d12
State: Okay
d11: Submirror of d10
State: Okay
Hot spare pool: hsp001
d12: Submirror of d10
State: Okay
Hot spare pool: hsp001

Для RAID-5 процедура ассоциации с пулом «горячей» замены будет выглядеть следующим образом:
suncow # metaparam -h hsp001 d20
suncow # metastat d20
d20: RAID
State: Okay
Hot spare pool: hsp001
...
Если необходимо изменить пул, который используется для RAID-устройства, то
выполнить это можно с помощью команды metaparam и опции –h:
suncow # metastat d20
d20: RAID
State: Okay
Hot spare pool: hsp001
...
suncow # metaparam -h hsp002 d20
suncow # metastat d20
d20: RAID
State: Okay
Hot spare pool: hsp002
...

А открепить пул можно так
suncow # metastat d20
d20: RAID
State: Okay
Hot spare pool: hsp002
...
suncow # metaparam -h none d20
suncow # metastat d20
d20: RAID
State: Okay
Hot spare pool:
...

Вот собственно и все что я хотел рассказать в этой заметке о построении RAID в операционой системе Sun Solaris 10. Эта статья была для меня не только как закрепление собственных знаний, но и благодаря другим публикациям я усвоил для себя кое что новое и надеюсь что эта статья послужит вам только пользой.

Используемая литература

1.
Solaris 10. “Solaris Volume Manager Administration Guide”.
(
http://docs.sun.com)
2. Solaris Volume Manager. Конфигурирование RAID устройств”.
(http://www.opennet.ru/docs/RUS/svm_raid/svm.pdf)

1 комментарий:

Анонимный комментирует...

Гы-гы-гы! Ну если SF V440/V445 - это "рабочая станция"...;-)