Sebagai lanjutan tulisan sebelumnya tentang iSCSI, kali ini saya ingin menuliskan tentang koneksi iSCSI dengan multipathing. Multipathing maksudnya adalah iSCSI Initiator (client) akan mengakses 1 shared disk melalui 2 network yang berbeda (ada tambahan redundant link). Dengan tambahan redundant link, koneksi iSCSI menjadi lebih aman terhadap kemungkinan terjadinya masalah pada jaringan.

Masih menggunakan contoh dari tulisan sebelumnya, saya menggunakan 2 buah mesin untuk mensimulasikan iSCSI Multipathing ini. Mesin pertama yang bertindak sebagai iSCSI Target adalah sansvr01. Sementara mesin yang akan bertindak sebagai iSCSI Initiator adalah dev01.
Menyiapkan iSCSI Redundant Link
Di contoh sebelumnya sansvr01 hanya punya 2 IP, satu untuk akses publik (192.168.10.111) dan satu lagi untuk komunikasi iSCSI (172.16.10.5). iSCSI Target & iSCSI Initiator berkomunikasi melalui jaringan 172.16.10.0/24. Nantinya akan ada 1 jalur komunikasi baru dari iSCSI Target ke iSCSI Initiator melalui jaringan 172.16.11.0/24. Untuk mesimulasikan multipathing, saya tambahkan satu interface baru (eth2) pada sansvr01 dengan IP 172.16.11.5.
root@sansvr01:~# ifconfig -a
eth0 Link encap:Ethernet HWaddr 52:54:00:66:EC:19
inet addr:192.168.10.111 Bcast:192.168.10.255 Mask:255.255.255.0
inet6 addr: fe80::5054:ff:fe66:ec19/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:11951 errors:0 dropped:0 overruns:0 frame:0
TX packets:1457 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1485359 (1.4 MiB) TX bytes:217666 (212.5 KiB)
Interrupt:11 Base address:0x6000
eth1 Link encap:Ethernet HWaddr 52:54:00:8B:EC:A5
inet addr:172.16.10.5 Bcast:172.16.10.255 Mask:255.255.255.0
inet6 addr: fe80::5054:ff:fe8b:eca5/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:15283 errors:0 dropped:0 overruns:0 frame:0
TX packets:8546 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:1232962 (1.1 MiB) TX bytes:3726368 (3.5 MiB)
Interrupt:11 Base address:0x4000
eth2 Link encap:Ethernet HWaddr 52:54:00:06:A1:35
inet addr:172.16.11.5 Bcast:172.16.11.255 Mask:255.255.255.0
inet6 addr: fe80::5054:ff:fe06:a135/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:438 errors:0 dropped:0 overruns:0 frame:0
TX packets:91 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:57372 (56.0 KiB) TX bytes:10219 (9.9 KiB)
Interrupt:10 Base address:0x8000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:0 errors:0 dropped:0 overruns:0 frame:0
TX packets:0 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:0 (0.0 b) TX bytes:0 (0.0 b)
root@sansvr01:~#
Saya juga tambahkan IP baru (eth2 : 172.16.11.31) pada mesin dev01 :
root@dev01:~# ifconfig -a
eth0 Link encap:Ethernet HWaddr 52:54:00:A6:28:13
inet addr:192.168.10.31 Bcast:192.168.10.255 Mask:255.255.255.0
inet6 addr: fe80::5054:ff:fea6:2813/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:22032 errors:0 dropped:0 overruns:0 frame:0
TX packets:6381 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:2570471 (2.4 MiB) TX bytes:1042792 (1018.3 KiB)
Interrupt:11 Base address:0x6000
eth1 Link encap:Ethernet HWaddr 52:54:00:EC:9B:73
inet addr:172.16.10.31 Bcast:172.16.10.255 Mask:255.255.255.0
inet6 addr: fe80::5054:ff:feec:9b73/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:26783 errors:0 dropped:0 overruns:0 frame:0
TX packets:56508 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:14197492 (13.5 MiB) TX bytes:42777972 (40.7 MiB)
Interrupt:11 Base address:0x4000
eth2 Link encap:Ethernet HWaddr 52:54:00:5F:15:D8
inet addr:172.16.11.31 Bcast:172.16.11.255 Mask:255.255.255.0
inet6 addr: fe80::5054:ff:fe5f:15d8/64 Scope:Link
UP BROADCAST RUNNING MULTICAST MTU:1500 Metric:1
RX packets:26285 errors:0 dropped:0 overruns:0 frame:0
TX packets:56686 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:1000
RX bytes:14100612 (13.4 MiB) TX bytes:43110648 (41.1 MiB)
Interrupt:10 Base address:0x8000
lo Link encap:Local Loopback
inet addr:127.0.0.1 Mask:255.0.0.0
inet6 addr: ::1/128 Scope:Host
UP LOOPBACK RUNNING MTU:16436 Metric:1
RX packets:104 errors:0 dropped:0 overruns:0 frame:0
TX packets:104 errors:0 dropped:0 overruns:0 carrier:0
collisions:0 txqueuelen:0
RX bytes:9084 (8.8 KiB) TX bytes:9084 (8.8 KiB)
root@dev01:~#
Yang perlu dilakukan sekarang adalah memodifikasi berkas targets.conf untuk mendaftarkan IP baru milik dev01.
root@sansvr01:~# cat /etc/tgt/targets.conf
default-driver iscsi
<target iqn.2014-04.localdomain:sansvr01.shared01>
backing-store /dev/mapper/vg_shareddisk-shared01
initiator-address 172.16.10.31
initiator-address 172.16.11.31
</target>
root@sansvr01:~#
Berikutnya kita perlu “memaksa” servis tgtd di sansvr01 untuk menggunakan konfigurasi baru :
root@sansvr01:~# service tgtd force-reload
Force-updating SCSI target daemon configuration: [ OK ]
root@sansvr01:~#
Kita bisa pastikan ACL baru sudah aktif dengan perintah tgt-admin :
root@sansvr01:~# tgt-admin -s
Target 1: iqn.2014-04.localdomain:sansvr01.shared01
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 524 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
Backing store type: rdwr
Backing store path: /dev/mapper/vg_shareddisk-shared01
Backing store flags:
Account information:
ACL information:
172.16.10.31
172.16.11.31
root@sansvr01:~#
Penting sekali untuk menambah konfigurasi firewall untuk mengijinkan iSCSI Initiator mengakses shared disk melalui network 172.16.11.0/24 :
root@sansvr01:~# iptables -I INPUT -p tcp -s 172.16.11.0/24 --dport 3260 -j ACCEPT
root@sansvr01:~# service iptables save
iptables: Saving firewall rules to /etc/sysconfig/iptables:[ OK ]
root@sansvr01:~#
Mengatur Multipath Di iSCSI Initiator
Sekarang mesin dev01 bisa mengenali shared disk dari kedua network :
root@dev01:~# iscsiadm --mode discovery --type sendtargets --portal 172.16.11.5:3260 --discover
172.16.11.5:3260,1 iqn.2014-04.localdomain:sansvr01.shared01
root@dev01:~# iscsiadm --mode discovery --type sendtargets --portal 172.16.10.5:3260 --discover
172.16.10.5:3260,1 iqn.2014-04.localdomain:sansvr01.shared01
root@dev01:~#
Mesin dev01 juga bisa login & mengakses shared disk yang sama lewat 2 target IP yang berbeda :
root@dev01:~# iscsiadm --mode node --targetname="iqn.2014-04.localdomain:sansvr01.shared01" --portal 172.16.10.5:3260 --login
Logging in to [iface: default, target: iqn.2014-04.localdomain:sansvr01.shared01, portal: 172.16.10.5,3260] (multiple)
Login to [iface: default, target: iqn.2014-04.localdomain:sansvr01.shared01, portal: 172.16.10.5,3260] successful.
root@dev01:~#
root@dev01:~# iscsiadm --mode node --targetname="iqn.2014-04.localdomain:sansvr01.shared01" --portal 172.16.11.5:3260 --login
Logging in to [iface: default, target: iqn.2014-04.localdomain:sansvr01.shared01, portal: 172.16.11.5,3260] (multiple)
Login to [iface: default, target: iqn.2014-04.localdomain:sansvr01.shared01, portal: 172.16.11.5,3260] successful.
root@dev01:~#
Belum cukup sampai di sini konfigurasinya, mesin dev01 melihat iqn.2014-04.localdomain:sansvr01.shared01 sebagai 2 external disk yang berbeda.
root@dev01:~# cat /proc/partitions
major minor #blocks name
8 0 8388608 sda
8 1 512000 sda1
8 2 7875584 sda2
253 0 7036928 dm-0
253 1 835584 dm-1
8 16 512000 sdb
8 32 512000 sdc
root@dev01:~#
Dari informasi di atas, mesin dev01 menganggap ada 2 harddisk baru yaitu sdb & sdc. Perintah fdisk juga menampilkan hal yang sama :
root@dev01:~# fdisk -l
Disk /dev/sda: 8589 MB, 8589934592 bytes
255 heads, 63 sectors/track, 1044 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x0002d485
Device Boot Start End Blocks Id System
/dev/sda1 * 1 64 512000 83 Linux
Partition 1 does not end on cylinder boundary.
/dev/sda2 64 1045 7875584 8e Linux LVM
Disk /dev/mapper/vg_dev01-lv_root: 7205 MB, 7205814272 bytes
255 heads, 63 sectors/track, 876 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/mapper/vg_dev01-lv_swap: 855 MB, 855638016 bytes
255 heads, 63 sectors/track, 104 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x00000000
Disk /dev/sdb: 524 MB, 524288000 bytes
17 heads, 59 sectors/track, 1020 cylinders
Units = cylinders of 1003 * 512 = 513536 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x636c0fb3
Device Boot Start End Blocks Id System
Disk /dev/sdc: 524 MB, 524288000 bytes
17 heads, 59 sectors/track, 1020 cylinders
Units = cylinders of 1003 * 512 = 513536 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x636c0fb3
Device Boot Start End Blocks Id System
root@dev01:~#
Ini yang masih perlu diperbaiki karena sebenarnya shared disk yang diakses oleh mesin dev01 hanya 1 buah. Dengan multipathing, kita memberitahu OS bahwa sebenarnya /dev/sdb & /dev/sdc mengacu pada “physical storage” yang sama. Hanya proses komunikasinya bisa melalui 2 jalur yang berbeda.
Linux punya daemon multipathd yang bisa melakan proses multipathing. multipathd akan bertugas mengatur pertukaran data dari server ke storage melalui 2 jalur komunikasi yang berbeda. Bila satu jalur putus, multipathd akan tetep mengalihkan jalur pertukaran data tadi melalui redundant link-nya. Kalau mengacu pada gambar ilustrasi di atas, pertukaran data antara iSCSI Target & iSCSI Initiator bisa melalui network 172.16.10.0 atau 172.16.11.0. Bila dua jalur tadi digunakan bersama-sama secara bergantian, ini dikenal dengan konfigurasi round-robbin. Namun misalnya bila transmisi data hanya melalui network 172.16.10.0 saja, maka network 172.16.11.0 akan standby kalau sewaktu-waktu ada gangguan transmisi data pada network 172.16.10.0. Konfigurasi seperti ini dikenal sebagai active-passive (atau active-standby)
Di mesin dev01 sebagai iSCSI Initiator, saya perlu menginstal paket device-mapper-multipath :
root@dev01:~# yum install device-mapper-multipath
Supaya kernel Linux bisa melakukan proses multipathing ini, kita perlu mengaktifkan modul dm_multipath dengan perintah modprobe seperti contoh berikut ini :
root@dev01:~# modprobe dm_multipath
root@dev01:~# lsmod | grep dm_multipath
dm_multipath 17724 2 dm_round_robin
dm_mod 84209 15 dm_multipath,dm_mirror,dm_log
root@dev01:~#
Konfigurasi multipath disimpan dalam berkas /etc/multipath.conf. Kita bisa dapatkan contoh sampel berkas konfigurasinya dari /usr/share/doc/device-mapper-multipath-0.4.9/multipath.conf. Berikut ini adalah contoh berkas multipath.conf yang saya gunakan sekarang ini :
root@dev01:~# cat /etc/multipath.conf
defaults {
udev_dir /dev
polling_interval 10
path_selector "round-robin 0"
path_grouping_policy multibus
getuid_callout "/lib/udev/scsi_id --replace-whitespace --whitelisted --device=/dev/%n"
prio const
path_checker readsector0
rr_min_io 100
max_fds 8192
rr_weight priorities
failback immediate
no_path_retry fail
user_friendly_names yes
}
blacklist {
wwid *
devnode "sda"
}
blacklist_exceptions {
wwid "1IET_00010001"
}
root@dev01:~#
Beberapa detail yang perlu diketahui dari contoh konfigurasi di atas antara lain adalah :
blacklist : opsi ini dipakai untuk mendaftarkan semua harddisk yang tidak akan diikutsertakan dalam proses multipathing, seperti misalnya internal disk (boot disk). Pada contoh ini mesin dev01 memiliki boot disk /dev/sda.
blacklist_exceptions : semua disk yang dimasukkan dalam kategori ini akan ikut menggunakan konfigurasi multipathing. Dari mana kita bisa tahu nama wwid sebuah harddisk? Kita bisa lihat dari hasil perintah scsi_id berikut ini :
root@dev01:~# scsi_id -g -u -d /dev/sdb
1IET_00010001
root@dev01:~# scsi_id -g -u -d /dev/sdc
1IET_00010001
root@dev01:~#
Dalam konteks iSCSI, nama SCSI ID ini sama dengan yang kita peroleh dari perintah tgt-admin pada mesin iSCSI Target.
root@sansvr01:~# tgt-admin -s
Target 1: iqn.2014-04.localdomain:sansvr01.shared01
System information:
Driver: iscsi
State: ready
I_T nexus information:
LUN information:
LUN: 0
Type: controller
SCSI ID: IET 00010000
SCSI SN: beaf10
Size: 0 MB, Block size: 1
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
Backing store type: null
Backing store path: None
Backing store flags:
LUN: 1
Type: disk
SCSI ID: IET 00010001
SCSI SN: beaf11
Size: 524 MB, Block size: 512
Online: Yes
Removable media: No
Prevent removal: No
Readonly: No
Backing store type: rdwr
Backing store path: /dev/mapper/vg_shareddisk-shared01
Backing store flags:
Account information:
ACL information:
172.16.10.31
172.16.11.31
root@sansvr01:~#
path_selector : opsi ini dipakai untuk menentukan link mana yang akan digunakan untuk transmisi data. Bila diset sebagai round-robin 0 maka data akan ditransmisikan melalui masing-masing link yang aktif secara bergantian (looping)
--replace-whitespace : ini gunanya untuk menghapus spasi pada nama disk (dalam hal ini adalah iSCSI Disk). Untuk melihat nama (atau ID) dari iSCSI disk tadi kita bisa gunakan perintah scsi_id seperti contoh berikut ini :
root@dev01:~# scsi_id --device=/dev/sdc --whitelisted
1IET 00010001
root@dev01:~#
Tanpa opsi --replace-whitespace ID dari /dev/sdc adalah 1IET 00010001. Bandingkan hasilnya setelah kita gunakan opsi --replace-whitespace berikut ini :
root@dev01:~# scsi_id --device=/dev/sdc --whitelisted --replace-whitespace
1IET_00010001
root@dev01:~#
user_friendly_names : opsi ini memungkinkan kita untuk memberi nama yang lebih mudah dikenali untuk setiap multipath-disk. Pada contoh tadi, akan sulit mengidentifikasi nama shared disk “1IET_00010001”. Kita bisa mendaftarkan nama alias untuk setiap WWID tersebut ke dalam berkas /etc/multipath/bindings seperti contoh di bawah ini
root@dev01:~# cat /etc/multipath/bindings
# Multipath bindings, Version : 1.0
# NOTE: this file is automatically maintained by the multipath program.
# You should not need to edit this file in normal circumstances.
#
# Format:
# alias wwid
#
sansvr01_shared0 1IET_00010001
root@dev01:~#
Pada contoh di atas saya memilih untuk memberi alias iSCSI disk “1IET_00010001” menjadi “sansvr01_shared01”. Menurut saya ini jauh lebih mudah untuk diingat-ingat, jadi saya bisa langsung tahu kalau ini adalah iSCSI disk dari mesin sansvr01 dengan nama shared disk shared01.
Setelah konfigurasi tadi selesai dibuat & modul dm_multipath sudah di-load oleh kernel, kita bisa mulai aktifkan service multipathd :
root@dev01:~# service multipathd status
multipathd is stopped
root@dev01:~#
root@dev01:~# service multipathd start
Starting multipathd daemon: [ OK ]
root@dev01:~#
Penting untuk mengatur service multipathd supaya aktif otomatis saat proses booting:
root@dev01:~# chkconfig multipathd on
Kita bisa melihat hasil akhir proses multipathing dengan perintah multipath seperti contoh di bawah ini :
root@dev01:~# multipath -ll
sansvr01_shared0 (1IET_00010001) dm-2 IET,VIRTUAL-DISK
size=500M features='0' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
|- 4:0:0:1 sdb 8:16 active ready running
`- 5:0:0:1 sdc 8:32 active ready running
root@dev01:~#
Jadi sekarang yang kita “anggap” sebagai harddisk oleh mesin dev01 bukan lagi /dev/sdb atau /dev/sdc melainkan multipath disk-nya yaitu /dev/mapper/sansvr01_shared0.
root@dev01:~# fdisk -l /dev/mapper/sansvr01_shared0
Disk /dev/mapper/sansvr01_shared0: 524 MB, 524288000 bytes
255 heads, 63 sectors/track, 63 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x636c0fb3
Device Boot Start End Blocks Id System
root@dev01:~#
Langkah-langkah untuk menyiapkan filesystem pada multipath disk sama persis seperti layaknya harddisk konvensional :
- Buat partisi terlebih dulu :
root@dev01:~# fdisk /dev/mapper/sansvr01_shared0
WARNING: DOS-compatible mode is deprecated. It's strongly recommended to
switch off the mode (command 'c') and change display units to
sectors (command 'u').
Command (m for help): n
Command action
e extended
p primary partition (1-4)
p
Partition number (1-4): 1
First cylinder (1-63, default 1):
Using default value 1
Last cylinder, +cylinders or +size{K,M,G} (1-63, default 63):
Using default value 63
Command (m for help): w
The partition table has been altered!
Calling ioctl() to re-read partition table.
WARNING: Re-reading the partition table failed with error 22: Invalid argument.
The kernel still uses the old table. The new table will be used at
the next reboot or after you run partprobe(8) or kpartx(8)
Syncing disks.
root@dev01:~#
- Cek struktur partisinya :
root@dev01:~# fdisk -l /dev/mapper/sansvr01_shared0
Disk /dev/mapper/sansvr01_shared0: 524 MB, 524288000 bytes
255 heads, 63 sectors/track, 63 cylinders
Units = cylinders of 16065 * 512 = 8225280 bytes
Sector size (logical/physical): 512 bytes / 512 bytes
I/O size (minimum/optimal): 512 bytes / 512 bytes
Disk identifier: 0x636c0fb3
Device Boot Start End Blocks Id System
/dev/mapper/sansvr01_shared0p1 1 63 506016 83 Linux
root@dev01:~#
- Sebagai contoh, saya pilih filesystem
ext4 :
root@dev01:~# mkfs.ext4 /dev/mapper/sansvr01_shared0p1
mke2fs 1.41.12 (17-May-2010)
Filesystem label=
OS type: Linux
Block size=1024 (log=0)
Fragment size=1024 (log=0)
Stride=0 blocks, Stripe width=0 blocks
126976 inodes, 506016 blocks
25300 blocks (5.00%) reserved for the super user
First data block=1
Maximum filesystem blocks=67633152
62 block groups
8192 blocks per group, 8192 fragments per group
2048 inodes per group
Superblock backups stored on blocks:
8193, 24577, 40961, 57345, 73729, 204801, 221185, 401409
Writing inode tables: done
Creating journal (8192 blocks): done
Writing superblocks and filesystem accounting information: done
This filesystem will be automatically checked every 20 mounts or
180 days, whichever comes first. Use tune2fs -c or -i to override.
root@dev01:~#
- Mount partisi baru tadi :
root@dev01:~# mount /dev/mapper/sansvr01_shared0p1 /sharedstorage/
- Partisi baru
sansvr01_shared01 dengan filesystem ext4 sudah siap digunakan :
root@dev01:~# df -h
Filesystem Size Used Avail Use% Mounted on
/dev/mapper/vg_dev01-lv_root 6.7G 854M 5.5G 14% /
tmpfs 499M 0 499M 0% /dev/shm
/dev/sda1 485M 32M 428M 7% /boot
/dev/mapper/sansvr01_shared0p1 479M 11M 444M 3% /sharedstorage
root@dev01:~#