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 mesindev01memiliki boot disk/dev/sda.blacklist_exceptions: semua disk yang dimasukkan dalam kategori ini akan ikut menggunakan konfigurasi multipathing. Dari mana kita bisa tahu namawwidsebuahharddisk? Kita bisa lihat dari hasil perintahscsi_idberikut 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-adminpada 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 sebagairound-robin 0maka 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 perintahscsi_idseperti contoh berikut ini :root@dev01:~# scsi_id --device=/dev/sdc --whitelisted 1IET 00010001 root@dev01:~#
Tanpa opsi
--replace-whitespaceID dari/dev/sdcadalah1IET 00010001. Bandingkan hasilnya setelah kita gunakan opsi--replace-whitespaceberikut 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/bindingsseperti contoh di bawah iniroot@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
sansvr01dengan nama shared diskshared01.
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_shared01dengan filesystemext4sudah 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:~#
