15 ноября 2008

Настройка Device-Mapper Multipath в RHEL 5

В данном посте я хочу описать шаги для настройки Multipath при помощи dm-multipath. Device Mapper Multipathing (DM-Multipath) позволяет "собрать" несколько маршрутов ввода/вывода между сервером и дисковым массивом в единое целое, и рассматривать доступный по нескольким путям массив как одно мета-устройство. Например, если сервер с двумя двух-портовыми HBA подключен к одному и тому же массиву, то сервер, в самом простейшем случае, будет "видеть" четыре устройства /dev/sd{a,b,c,d}. При помощи dm-multipath можно собрать из них агрегирующее все четыре пути мета-устройство /dev/dm-N, обеспечив прозрачную для операционной системы и приложений конфигурацию, отказоустойчивую в случае выхода из строя HBA, кабеля или коммутатора (если каждый HBA подключен через свой коммутатор).

Хотя, по информации, приведенной в этом посте, можно повторить все шаги и настроить dm-multipath, но информация будет явно не достаточна для понимания всех деталей работы и команд. Для дальнейшего изучения материала рекомендую обратиться к официальной документации Red Hat - книге "Device-Mapper Multipath Configuration and Administration", доступной на сайте Red Hat как в виде PDF, так и HTML.

Далее рассмотрим настройку dm-multipath для конфигурации представленной на рисунке:Имеется iSCSI-target, доступная по двум интерфейсам в двух сетях: 192.168.0.0/24 и 192.168.1.0/24. Соответственно на сервере vm01 есть два сетевых интерфейса, каждый из которых подключен к одной из двух сетей. На сервере установлен iSCSI-инициатор, и сервер может обращаться к доступному ему целевому устройству по двум различным путям. Попробуем организовать конфигурацию, устойчивую к отказу одного из путей, при помощи dm-multipath.

Для начала убедимся, что на vm01 установлен пакет device-mapper-multipath, и загружены модули ядра dm_multipath и dm_round_robin:

[root@vm01 ~]# rpm -qa | grep multipath
device-mapper-multipath-0.4.7-12.el5
[root@vm01 ~]# lsmod | grep dm_
dm_round_robin 7617 0
dm_multipath 21577 1 dm_round_robin
dm_snapshot 20709 0
dm_zero 6209 0
dm_mirror 28869 0
dm_mod 58201 9 dm_multipath,dm_snapshot,dm_zero,dm_mirror

При необходимости установите пакет. Если модули не загружены, то воспользуйтесь командой modprobe. Далее запускаем процесс обзора для поиска iSCSI-целей. При необходимости можно обратиться к моему посту "Настройка iSCSI target и initiator в RHEL/Fedora" или к любой другой доступной документации.

[root@vm01 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.0.114:3260
192.168.0.114:3260,1 iqn.2003-12.net.markelov:disk1
[root@vm01 ~]# iscsiadm -m discovery -t sendtargets -p 192.168.1.114:3260
192.168.1.114:3260,1 iqn.2003-12.net.markelov:disk1

Перезапускаем демон iscsi и проверяем вывод команды fdisk -l для того, чтобы убедиться, что сервер "видит" подключенную цель:

[root@vm01 ~]# service iscsi restart
[root@vm01 ~]# fdisk -l

Disk /dev/xvda: 17.1 GB, 17179869184 bytes
255 heads, 63 sectors/track, 2088 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

...

Disk /dev/sda: 5368 MB, 5368709120 bytes
166 heads, 62 sectors/track, 1018 cylinders
Units = cylinders of 10292 * 512 = 5269504 bytes

Disk /dev/sda doesn't contain a valid partition table

Disk /dev/sdb: 5368 MB, 5368709120 bytes
166 heads, 62 sectors/track, 1018 cylinders
Units = cylinders of 10292 * 512 = 5269504 bytes

Disk /dev/sdb doesn't contain a valid partition table

Как видно, помимо локального /dev/xvda, появились два новых устройства - /dev/sda и /dev/sdb - одинакового размера. Можно убедиться, что это одно и тоже устройство, сравнив идентификаторы:

[root@vm01 ~]# scsi_id -g -s /block/sda
16465616462656166313a3100000000000000000000000000
[root@vm01 ~]# scsi_id -g -s /block/sdb
16465616462656166313a3100000000000000000000000000

Теперь приступаем к правке конфигурационного файла демона multipathd - /etc/multipath.conf. Необходимо закомментировать секцию, определяющую, для каких устройств multipathing выключен:

#blacklist {
# devnode "*"
#}

По умолчанию он был выключен для всех устройств - devnode "*". Далее необходимо раскомментировать секцию с комментариями:
## This is a template multipath-tools configuration file
## Uncomment the lines relevent to your environment
В этом шаблоне есть практически все, что нам нужно. Единственное, что мы изменим, это в path_grouping_policy пропишем failover. В следующей секции описан blacklist, который определяет такие устройства, как floppy-дисководы и IDE-диски. Его также можно раскомментировать. При необходимости добавьте свои устройства. Теперь можно запустить демон multipathd:

[root@vm01 ~]# chkconfig multipathd on
[root@vm01 ~]# service multipathd start

Все готово. Теперь можно убедиться, что в выводе команды fdisk появилось новое устройство:

[root@vm01 ~]# fdisk -l

...

Disk /dev/dm-2: 5368 MB, 5368709120 bytes
255 heads, 63 sectors/track, 652 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes

Disk /dev/dm-2 doesn't contain a valid partition table

Цель iqn.2003-12.net.markelov:disk1, очевидно, не содержит таблицы разделов. Создадим ее. Однако, команду fdisk нельзя использовать для работы с разделами на устройствах /dev/dm-*. Вместо этого мы создадим разделы на /dev/sda или /dev/sdb:

[root@vm01 ~]# fdisk /dev/sda
... создаем, например, два раздела...
[root@vm01 ~]# partprobe
[root@vm01 ~]# fdisk -l

Disk /dev/xvda: 17.1 GB, 17179869184 bytes

...

Disk /dev/sda: 5368 MB, 5368709120 bytes
166 heads, 62 sectors/track, 1018 cylinders
Units = cylinders of 10292 * 512 = 5269504 bytes

Device Boot Start End Blocks Id System
/dev/sda1 1 509 2619283 83 Linux
/dev/sda2 510 1018 2619314 83 Linux

Disk /dev/sdb: 5368 MB, 5368709120 bytes
166 heads, 62 sectors/track, 1018 cylinders
Units = cylinders of 10292 * 512 = 5269504 bytes

Device Boot Start End Blocks Id System
/dev/sdb1 1 509 2619283 83 Linux
/dev/sdb2 510 1018 2619314 83 Linux

Disk /dev/dm-2: 5368 MB, 5368709120 bytes
166 heads, 62 sectors/track, 1018 cylinders
Units = cylinders of 10292 * 512 = 5269504 bytes

Device Boot Start End Blocks Id System
/dev/dm-2p1 1 509 2619283 83 Linux
/dev/dm-2p2 510 1018 2619314 83 Linux
[root@vm01 ~]#

Наконец осталось создать из наших разделов устройства /dev/dm-*, для того, чтобы с ними далее можно было работать:

[root@vm01 ~]# kpartx -a /dev/dm-2

После этого появятся два новых устройства - /dev/dm-3 и /dev/dm-4, - которые и являются нашими двумя ранее созданными разделами. Можно создать файловую систему и смонтировать ее:

[root@vm01 ~]# mkfs.ext3 /dev/dm-3
[root@vm01 ~]# mkdir /mnt/dm3
[root@vm01 ~]# mount /dev/dm-3 /mnt/dm3/

Далее можно работать с разделом /dev/dm-3 обычным образом. Просмотреть состояние multipathed-устройств можно командой:

[root@vm01 ~]# multipath -ll
mpath0 (16465616462656166313a3100000000000000000000000000) dm-2 IET,VIRTUAL-DISK
[size=5.0G][features=0][hwhandler=0]
\_ round-robin 0 [prio=0][active]
\_ 0:0:0:1 sda 8:0 [active][ready]
\_ round-robin 0 [prio=0][enabled]
\_ 1:0:0:1 sdb 8:16 [active][ready]

По выводу:

[root@vm01 ~]# dmsetup ls --target multipath
mpath0 (253, 2)

можно сопоставить устройство /dev/mapper/mpath0 и /dev/dm-2. Теперь промоделируем выход из строя одного из маршрутов:

[root@vm01 ~]# multipath -ll
sdb: checker msg is "readsector0 checker reports path is down"
mpath0 (16465616462656166313a3100000000000000000000000000) dm-2 IET,VIRTUAL-DISK
[size=5.0G][features=0][hwhandler=0]
\_ round-robin 0 [prio=0][active]
\_ 0:0:0:1 sda 8:0 [active][ready]
\_ round-robin 0 [prio=0][enabled]
\_ 1:0:0:1 sdb 8:16 [failed][faulty]

Тем не менее наше устройство доступно, что легко проверить, записав какую-нибудь информацию в /mnt/dm3. После этого можно "поднять" интерфейс eth1 и провести тот же эксперимент с eth0.

7 комментариев:

Roman Sozinov комментирует...

Есть интересный вопрос, который мы в своё время у себя решили, но это было летом 2007 года и быть может уже существуют официальные решения, о которых я не знаю.
А вопрос в следущем - пробовали ли вы загружиться с dm-устройства? Т.е. пробовали ли вы делать так, чтобы сервера работали без дисков и даже загрузка системы (kernel) на данные сервера происходила с multipath-устройства?
Нам в своё время пришлось править mkinitrd-скрипт, чтобы иметь возможность сформировать правильный initrd-файл.

Konstantin комментирует...

Можно собрать initrd c опциями --with=dm-rdac --with=multipath
это должно работать.

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

Сейчас уже не надо ни каких опций, если используется iscsi, mkinitrd его упаковывает в multipath конфигурации со статичной картой.

Беда будет только если устройства поменяеются кардинально, а карта devmapper`а останется старой.

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

Два вопроса:
1. С чем связана необходимость создавать разделы на sda? Разве мультипас не должен быть прозрачным?
2. Можем ли мы сделать ЛВМ на мультипас-устройстве? Если да, то нужно ли извращаться так же, как с первым пунктом?

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

Спасибо, очень интересная и полезная статья.

Smerch комментирует...

Есть вопрос, нигде не могу найти ответ. Например у меня есть 1 хранилище и 2 управляющих сервера подключенные к нему по FC. Я создал раздел на хранилище с помощью pvcreate и lvmcreate. Один сервер видит хранилище и монтирует его разделы, как сдлеать чтобы второй тоже увидел? как перенести туда туже структуру lvm?

Andrey Markelov комментирует...

2 Smerch
Читайте про CLVM в официальной документации:
http://www.redhat.com/docs/manuals/csgfs/