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 mesindev01
memiliki boot disk/dev/sda
.blacklist_exceptions
: semua disk yang dimasukkan dalam kategori ini akan ikut menggunakan konfigurasi multipathing. Dari mana kita bisa tahu namawwid
sebuahharddisk
? Kita bisa lihat dari hasil perintahscsi_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 sebagairound-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 perintahscsi_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
adalah1IET 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 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
sansvr01
dengan 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_shared01
dengan filesystemext4
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:~#
Maaf mas agak oot, itu buat topologinya pake apps apa ya? :))
@ Aryulianto Saputro : saya pakai OmniGraffle di Mac
wah pantes keren mas, tapi sayang saya gak pake mac :(( makasih infonya