20.09.2024

Настройка Multipath I/O в Linux

Подключение дисков использую множественные пути. Пример для  Debian 11/12 и СХД  HPE MSA P2000, HPE MSA 2040,HPE MSA 2050, HPE MSA 2060

apt install -y multipath-tools

Сканируем на наличие назначенных томов (volume) для нашего сервера

rescan-scsi-bus.sh

Смотрим какие диски мы получили

multipath -ll

Если вывод пустой то посмотрим так

lsblk

В данном случае получаем

NAME    MAJ:MIN RM  SIZE  RO TYPE MOUNTPOINT
fd0     2:0     1     4K  0  disk
sda     8:0     0   127G  0  disk
├─sda1  8:1     0   123G  0  part /
├─sda2  8:2     0     1K  0  part
└─sda5  8:5     0     4G  0  part [SWAP]
sdb     8:16    0  10.9T  0  disk
sdc     8:32    0  10.9T  0  disk
sr0     11:0     1 1024M  0  rom

Нас интересуют диски sdb и sdс

Получаем их uuid

/lib/udev/scsi_id -g -u -d /dev/sdb

#3600c0ff00012be6bd05f1e6601000000

Либо находим uuid в выводе

multipath -v3

#===== paths list =====
#uuid hcil dev dev_t pri dm_st chk_st vend/pro
#3600224807bc1e4a554afc0dc5e935f25 0:0:0:0 sda 8:0 1 undef undef Msft,Vir
#3600c0ff00012be6bd05f1e6601000000 2:0:2:94 sdb 8:16 10 undef undef HP,P2000
#3600c0ff00012be6bd05f1e6601000000 2:0:3:94 sdc 8:32 50 undef undef HP,P2000

Добавляем данный uuid как путь в назначенному тому

multipath -a 3600c0ff00012be6bd05f1e6601000000

Для блокировки локальных дисков нужно перечислить диски и контроллеры в файле multipath.conf

blacklist { 
    wwid ".*"
    devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
    devnode "^hd[a-z][[0-9]*]"
    devnode "^sda[[0-9]*]"
    devnode "^cciss!c[0-9]d[0-9]*"
}

Для исключения блокировки томов нужно их перечислить в файле multipath.conf

blacklist_exceptions { 
    wwid 3600c0ff00012be6bd05f1e6601000000
}

Получим список multipath томов и обратим внимание что наш uuid находится в dm-0

ls -l /dev/mapper/

#total 0
#lrwxrwxrwx 1 root root 7 Apr 16 11:55 mpatha -> ../dm-0
#crw------- 1 root root 10, 236 Apr 16 11:40 control

Создадим раздел GPT

fdisk /dev/dm-0

#Command (m for help): g
#Created a new GPT disklabel (GUID: 67752DFA-8643-8E4E-9E62-4E24D620D080).

#Command (m for help): n
#Partition number (1-128, default 1):
#First sector (2048-23418489566, default 2048):
#Last sector, +/-sectors or +/-size{K,M,G,T,P} (2048-23418489566, default 23418488831):

#Created a new partition 1 of type 'Linux filesystem' and of size 10.9 TiB.

#Command (m for help): w
#The partition table has been altered.
#Syncing disks.

Можно использовать cfdisk /dev/dm-0

Проверим что создали дополнительный раздел, нумерация аналогичная привычной /dev/sdb => /dev/sdb1 только /dev/dm-0 => /dev/dm-1

ls -l /dev/mapper/ 
#total 0 
#lrwxrwxrwx 1 root root 7 Apr 16 11:55 mpatha -> ../dm-0 
lrwxrwxrwx 1 root root 7 Apr 16 11:55 mpatha-part1 -> ../dm-1
#crw------- 1 root root 10, 236 Apr 16 11:40 control

Создадим нужную файловую систему

mkfs.ext4 /dev/dm-1
mkdir -p /data
mount /dev/dm-1 /data

Поверим

df -h

#Filesystem Size Used Avail Use% Mounted on
#/dev/mapper/3600c0ff00012be6bd05f1e6601000000 10.9T 24K 87G 1% /data

Создадим необходимую запись в fstab для автомонтирования диска

Получим UUID тома в системе, не путайте с uuid multipath

blkid /dev/dm-1

#/dev/dm-1: UUID="2c9e39d1-8860-458b-adee-18c99a3bb9c7" BLOCK_SIZE="4096" TYPE="ext4"

nano /etc/fstab

# data
UUID=2c9e39d1-8860-458b-adee-18c99a3bb9c7 /data ext4 defaults 0 2

Проверим

umount /data
mount -a

К  подключенным томам можно обращаться по именам, так же как если бы вы обращались к физическим устройствам при создании физического тома LVM. Например, если имя устройства — /dev/mapper/vmb, то команда, которая отметит его как физический том, будет выглядеть так

pvcreate /dev/mapper/vmb
vgcreate vmdisk /dev/mapper/vmb

multipath.conf

При необходимости можно создать multipath.conf с перечнем своих правил сканирования и подключения внешних томов

nano /etc/multipath.conf

defaults {
    # for debian
    find_multipaths "no"
    user_friendly_names "yes"
    polling_interval 10
    path_selector "round-robin 0"
    path_grouping_policy "group_by_prio"
    # getuid_callout "/lib/udev/scsi_id -g -u /dev/%n"
    # getuid_callout "/lib/udev/scsi_id --whitelisted --device=/dev/%n"
    prio "const"
    path_checker "tur"
    max_fds "max"
    rr_min_io 100
    rr_weight "uniform"
    failback "immediate"
    no_path_retry 12
}

blacklist {
    wwid ".*"
    devnode "^(ram|raw|loop|fd|md|dm-|sr|scd|st)[0-9]*"
    devnode "^hd[a-z][[0-9]*]"
    devnode "^sda[[0-9]*]"
    devnode "^cciss!c[0-9]d[0-9]*"
}

blacklist_exceptions {
    wwid 3600c0ff0003c47c04b46846501000000
    wwid 3600c0ff00012be6b87c1846501000000
}

devices {
   device {
      vendor "HP|HPE"
      product "(P2000 G3 FC|P2000 G3 FC/iSCSI)"
      path_grouping_policy "group_by_prio"
      prio "alua"
      path_selector "round-robin 0"
      path_checker "tur"
      hardware_handler "0"
      failback "immediate"
      rr_min_io 100
      rr_weight "uniform"
      no_path_retry 18
   }
   device {
       vendor "HP|HPE"
       product "(MSA 2040 SAN|MSA 2050 SAN|MSA 2060 SAN)"
       path_grouping_policy "group_by_prio"
       prio "alua"
       path_selector "round-robin 0"
       path_checker "tur"
       hardware_handler "0"
       failback "immediate"
       rr_min_io 100
       rr_min_io_rq 1
       rr_weight "uniform"
       no_path_retry 18
   }
}

multipaths {
    multipath {
        wwid 3600c0ff0003c47c04b46846501000000
        alias data
    }
    multipath {
        wwid 3600c0ff00012be6b87c1846501000000
        alias log
    }
}

Тестирование производительности подключенного тома

apt install -y fio

Тест: чтение 60%, запись 40%, размер блока 4Кб, глубина очереди 32, использовать 6 файлов размером 10Gb, длительность теста 600 секунд, прямая запись на диск минуя кеш и не использовать аппаратное кеширование

fio --name=IO-RAND --ioengine=libaio --iodepth=32 --rw=randrw --rwmixread=60 --bs=4k --direct=1 --buffered=0 --size=10G --numjobs=6 --time_based=1 --runtime=600 --group_reporting && rm -f IO-RAND*