Conectar em iSCSI Target com Multipath (MPIO) em Linux

Introdução

Há diversas situações em que você precisa estender a capacidade de seu sistema de arquivos no seu servidor Linux além da capacidade local, seja pela maior disponibilidade dos sistemas NAS (Network Attached Storage) ou até mesmo permitindo a mobilidade de virtualização.

Um caso que podemos utilizar como exemplo é na implementação de uma nuvem privada utilizando Openstack. Na Cloud privada, as máquinas virtuais podem ser iniciadas em qualquer host disponível, e a camada de Storage necessita estar disponível para estes hosts. Uma das opções é provisionar o armazenamento através de iSCSI, podendo este ser um hardware específico para esta tarefa ou até mesmo um serviço sendo executando sob o Linux.

Neste artigo irei assumir que você já possuí um servidor iSCSI em funcionamento, e que precisa seu nó computacional cao Storage, utilizando Multipath.

O que é Mutipath?

Multipath é uma técnica empregada que possibilita a conexão mais de um caminho entre o sistema computacional e seus dispositivos de armazenamento em massa, provendo tolerância a falhas e melhoria de performance. A maioria dos Hardwares que provisionam acesso iSCSI, possuem sistemas redundantes, um deles é o acesso a rede onde configuramos cada uma das interfaces em subnets diferentes, para maior disponibilidade.

Como configurar um target iSCSI utilizando multipath?

Instale o pacote open-iscsi e multipath-tools, vou considerar neste artigo que você esteja utilizando Ubuntu Server:

 sudo apt-get install open-iscsi multipath-tools 

Após instalação, altere o arquivo de configuração /etc/iscsid.conf para que a conexão com os iSCSI targets  seja efetuada automaticamente alterando a linha abaixo:

node.startup = automatic

Para encontrar os targets disponíveis em um determinado Target, execute o comando abaixo, subsituindo o IP de destino pelo correto ou preferencialmente o nome DNS:

sudo iscsiadm -m discovery -t st -p 192.168.1.1

Este comando irá retornar os targets IQN disponíveis:

iscsiadm -m discovery -t st -p msa001-iscsi.lab.local
192.168.20.30:3260,1 iqn.1986-03.com.hp:storage.msa2012i.0827d5a4c6.a
192.168.20.31:3260,2 iqn.1986-03.com.hp:storage.msa2012i.0827d5a4c6.a

Para conectar-se ao target, execute:

sudo iscsiadm -m node --login

Para verificar se os discos foram conectados, execute o comando dmesg para verificar as mensagens de buffer do Kernel Linux:

dmesg | grep sd
[357569.408679] sd 6:0:0:0: Attached scsi generic sg2 type 0
[357569.408797] sd 7:0:0:0: Attached scsi generic sg3 type 0
[357569.410816] sd 6:0:0:0: [sdc] 2343616512 512-byte logical blocks: (1.20 TB/1.09 TiB)
[357569.410855] sd 7:0:0:0: [sdb] 2343616512 512-byte logical blocks: (1.20 TB/1.09 TiB)
[357569.457172] sd 7:0:0:0: [sdb] Write Protect is off
[357569.457176] sd 7:0:0:0: [sdb] Mode Sense: 93 00 00 08
[357569.457821] sd 7:0:0:0: [sdb] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[357569.497189] sd 6:0:0:0: [sdc] Write Protect is off
[357569.497193] sd 6:0:0:0: [sdc] Mode Sense: 93 00 00 08
[357569.498059] sd 6:0:0:0: [sdc] Write cache: enabled, read cache: enabled, doesn't support DPO or FUA
[357569.671111] sd 7:0:0:0: [sdb] Attached SCSI disk
[357569.678228] sd 6:0:0:0: [sdc] Attached SCSI disk

Veja também que devido ao target estar conectado à rede utilizando duas interfaces de rede, o sistema exibe como se dois discos (SDB e SDC) estivessem disponíveis, o que está incorreto. Perceba que também até executando o comando pvdisplay verificamos esta duplicidade:

root@nlinux001:/home/ubuntu# pvdisplay
WARNING: Not using lvmetad because duplicate PVs were found.
WARNING: Use multipath or vgimportclone to resolve duplicate PVs?
WARNING: After duplicates are resolved, run "pvscan --cache" to enable lvmetad.
WARNING: PV 4y1Cwb-HhrC-K1vm-lToM-ze3L-r3Oh-mQJkUo on /dev/sdc was already found on /dev/sdb.
WARNING: PV 4y1Cwb-HhrC-K1vm-lToM-ze3L-r3Oh-mQJkUo prefers device /dev/sdb because device is used by LV. 

Para resolver este problema, habilitamos o Multipath. Execute o comando abaixo para exibir a topologia multipath:

multipath -ll

root@node001:/home/ubuntu# multipath -ll
3600c0ff000d5b8d84e79625801000000 dm-8 HP,MSA2012i
size=1.1T features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
|- 6:0:0:0 sdc 8:32 active ready running
`- 7:0:0:0 sdb 8:16 active ready running

Na saída deste comando há o WWN do target , onde está mapeado o modelo do device. Há também a política distribuição de trafego, configurada para Round-Robin. Execute agora o comando fdisk -l para listar as partições, repare que é exibida uma partição mapper com o WWN do target, exatamente como é exibido na saída do comando multipath -ll:

Disk /dev/mapper/3600c0ff000d5b8d84e79625801000000: 1.1 TiB, 1199931654144 bytes, 2343616512 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Vamos editar as configurações de multipath e adicionar um apelido para este target. Copie o arquivo modelo disponível para o diretório mutipath para facilitar e para que você possa visualizar as diversas opções possíveis:

cp /usr/share/doc/multipath-tools/examples/multipath.conf.synthetic /etc/multipath/multipath.conf

Edite o arquivo e adicione um Alias referenciando o WWID:

</pre>
]defaults {

}

multipaths {
multipath {
wwid 3600c0ff000d5b8d84e79625801000000
# Este alias pode ser qualquer nome que descreva sua LUN
alias msa001-iscsi
}
}

Reinicie o serviço mutipathd:

service multipathd restart

Executando novamente o comando multipath -ll e fdisk -l podemos ver que agora foi criado um apelido para o WWID:

root@node001:/etc# multipath -ll
msa001-iscsi (3600c0ff000d5b8d84e79625801000000) dm-8 HP,MSA2012i
size=1.1T features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
|- 6:0:0:0 sdc 8:32 active ready running
`- 7:0:0:0 sdb 8:16 active ready running

fdisk -l
Disk /dev/mapper/msa001-iscsi: 1.1 TiB, 1199931654144 bytes, 2343616512 sectors
Units: sectors of 1 * 512 = 512 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes

Porém devido aos múltiplos caminhos para o storage, ainda é exibida uma mensagem de alerta ao executamos o comando pvdisplay para visualizarmos os dispositivos físicos LVM:

root@node001:/etc# pvdisplay
WARNING: Not using lvmetad because duplicate PVs were found.
WARNING: Use multipath or vgimportclone to resolve duplicate PVs?
WARNING: After duplicates are resolved, run "pvscan --cache" to enable lvmetad.
WARNING: PV 4y1Cwb-HhrC-K1vm-lToM-ze3L-r3Oh-mQJkUo on /dev/sdb was already found on /dev/mapper/msa001-iscsi.
WARNING: PV 4y1Cwb-HhrC-K1vm-lToM-ze3L-r3Oh-mQJkUo prefers device /dev/sdb because device is used by LV.

Para solucionarmos este problema devemos aplicar um filtro LVM permitindo apenas o SCAN do nó multipath e não os dispositivos RAW. Vamos aplicar este filtro em /etc/lvm/lvm.conf

Para isso verifique o qual o dispositivo iSCSI você deseja utilizar, coletando o  WWID:

root@node001:/etc# multipath -l
msa001-iscsi (3600c0ff000d5b8d84e79625801000000) dm-8 HP,MSA2012i
size=1.1T features='1 queue_if_no_path' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=0 status=active
|- 6:0:0:0 sdc 8:32 active undef running
`- 7:0:0:0 sdb 8:16 active undef running 

root@node001:/etc# ls -l /dev/disk/by-id/ | grep 3600c0ff000d5b8d84e79625801000000
lrwxrwxrwx 1 root root 10 Feb 14 17:10 dm-uuid-mpath-3600c0ff000d5b8d84e79625801000000 -> ../../dm-8
lrwxrwxrwx 1 root root 10 Feb 14 17:10 scsi-3600c0ff000d5b8d84e79625801000000 -> ../../dm-8

Vamos então aplicar o filtro, permitindo apenas que o LVM realize o scan do disco SDAm que possui o sistema operacional instalado , e nosso Storage:

global_filter = [ "a/sda/", "a|/dev/disk/by-id/scsi-msa001-iscsi|", "r|.*/|"]

Em suma este filtro adiciona o disco SDA e o iSCSI, removendo todo os outros.

Agora executando o comando pvscan, serão ignorado os outros devices:

root@node001:/home/ubuntu# pvscan
PV /dev/sda5 VG node001-vg lvm2 [465.28 GiB / 0 free]
PV /dev/disk/by-id/scsi-msa001-iscsi VG cinder-volumes lvm2 [1.09 TiB / 1.09 TiB free]
Total: 2 [1.55 TiB] / in use: 2 [1.55 TiB] / in no VG: 0 [0 ]

Vamos testar agora o resultado, criando um Logical Volume, montá-lo e formatá-lo:

root@node001:/home/ubuntu# lvcreate -L 10G -n lv_teste cinder-volumes
Logical volume "lv_teste" created.

root@node001:/home/ubuntu# lvdisplay

— Logical volume —
LV Path /dev/cinder-volumes/lv_teste
LV Name lv_teste
VG Name cinder-volumes
LV UUID rHP5D7-3nZA-O2cH-a9RF-9FCD-Bomb-gtKIlE
LV Write Access read/write
LV Creation host, time node001, 2017-02-16 12:18:17 -0200
LV Status available
# open 0
LV Size 10.00 GiB
Current LE 2560
Segments 1
Allocation inherit
Read ahead sectors auto
– currently set to 256
Block device 252:2

root@node001:/home/ubuntu# mkfs.ext4 /dev/cinder-volumes/lv_teste
mke2fs 1.43.3 (04-Sep-2016)
Creating filesystem with 2621440 4k blocks and 655360 inodes
Filesystem UUID: ddc596be-fcff-430d-9118-91f7f2de0a65
Superblock backups stored on blocks:
32768, 98304, 163840, 229376, 294912, 819200, 884736, 1605632

Allocating group tables: done
Writing inode tables: done
Creating journal (16384 blocks): done
Writing superblocks and filesystem accounting information: done

root@node001:/tmp# mount /dev/cinder-volumes/lv_teste /tmp/lv_teste/
root@node001:/tmp# df -h
Filesystem Size Used Avail Use% Mounted on
udev 3.9G 0 3.9G 0% /dev
tmpfs 787M 39M 749M 5% /run
/dev/mapper/node001–vg-root 450G 1.9G 425G 1% /
tmpfs 3.9G 0 3.9G 0% /dev/shm
tmpfs 5.0M 0 5.0M 0% /run/lock
tmpfs 3.9G 0 3.9G 0% /sys/fs/cgroup
/dev/sda1 472M 61M 387M 14% /boot
tmpfs 787M 0 787M 0% /run/user/1000
/dev/mapper/cinder–volumes-lv_teste 9.8G 37M 9.3G 1% /tmp/lv_teste
root@node001:/tmp#

Deixe uma resposta

O seu endereço de e-mail não será publicado. Campos obrigatórios são marcados com *