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:~#