iSCSI Multipathing trên Linux: Làm ngay trong 5 phút
Nếu bạn đang chạy storage qua SAN mà chỉ có một đường kết nối duy nhất, đó là một quả bom hẹn giờ. Dây đứt, card mạng hỏng, switch lỗi — là downtime ngay lập tức. iSCSI Multipathing giải quyết bài toán này bằng cách dùng nhiều đường mạng song song cho cùng một thiết bị storage.
Phần quick start này giả định bạn đã có iSCSI target chạy sẵn (TrueNAS, Synology, hoặc targetcli trên Linux) và server Linux với ít nhất 2 network interface kết nối vào storage network.
Bước 1: Cài đặt gói cần thiết
# Ubuntu/Debian
apt install open-iscsi multipath-tools -y
# RHEL/CentOS/Rocky
dnf install iscsi-initiator-utils device-mapper-multipath -y
Bước 2: Lấy IQN của initiator
cat /etc/iscsi/initiatorname.iscsi
# Output: InitiatorName=iqn.1993-08.org.debian:01:abc123def456
Copy IQN này và thêm vào danh sách ACL trên iSCSI target của bạn.
Bước 3: Discover và login target qua cả 2 đường mạng
# Discover từ interface 1 (ví dụ: 192.168.10.10 là IP storage của server)
iscsiadm -m discovery -t st -p 192.168.100.1 -I 192.168.10.10
# Discover từ interface 2
iscsiadm -m discovery -t st -p 192.168.101.1 -I 192.168.11.10
# Login tất cả target đã discover
iscsiadm -m node --login
Bước 4: Kiểm tra đã nhận đủ đường
iscsiadm -m session
# Phải thấy 2 session, mỗi session qua một IP khác nhau
# tcp: [1] 192.168.100.1:3260,1 iqn.2023-01.com.example:storage
# tcp: [2] 192.168.101.1:3260,1 iqn.2023-01.com.example:storage
Bước 5: Bật multipath
mpathconf --enable --with_multipathd y
systemctl enable --now multipathd
# Kiểm tra multipath đã nhận thiết bị
multipath -ll
Nếu output của multipath -ll hiện ra device với 2 path bên dưới, bạn đã xong phần cơ bản.
Hiểu rõ hơn: iSCSI và Multipathing hoạt động thế nào?
iSCSI là gì?
iSCSI (Internet Small Computer Systems Interface) cho phép truy cập block storage qua mạng TCP/IP thông thường — thay vì phải dùng Fibre Channel đắt tiền. Server của bạn (initiator) kết nối đến storage server (target) và nhìn thiết bị lưu trữ như một ổ đĩa cục bộ thông thường.
Tại sao cần Multipathing?
Multipath I/O (MPIO) tạo ra một thiết bị ảo duy nhất từ nhiều đường vật lý đến cùng một LUN. Hai lợi ích chính:
- Failover: Một đường chết, I/O tự động chuyển sang đường còn lại — không gián đoạn dịch vụ
- Load balancing: Phân tải I/O qua nhiều đường, tăng throughput thực tế
Cấu trúc file cấu hình
cat /etc/multipath.conf
File mặc định sau khi chạy mpathconf --enable:
defaults {
user_friendly_names yes
find_multipaths yes
}
blacklist {
devnode "^sda" # Không multipath ổ hệ điều hành
}
Cấu hình nâng cao
Chọn policy load balancing phù hợp
Linux multipath hỗ trợ nhiều chế độ phân tải. Đây là những cái mình hay dùng nhất:
defaults {
user_friendly_names yes
path_grouping_policy multibus
path_selector "round-robin 0" # Xoay vòng đều qua các path
failback immediate # Quay lại path chính khi phục hồi
rr_weight priorities
no_path_retry fail
}
devices {
device {
vendor "SYNOLOGY" # Adjust theo vendor của bạn
product "Storage"
path_grouping_policy multibus
path_checker tur
features "0"
hardware_handler "0"
prio "const"
rr_weight uniform
}
}
Sau khi chỉnh sửa config:
systemctl restart multipathd
multipath -F && multipath # Flush và rediscover
multipath -ll # Xem trạng thái mới
Gán tên cố định cho multipath device
Thay vì dùng /dev/mapper/mpatha (có thể đổi sau reboot), nên gán alias dựa theo WWID:
# Lấy WWID của thiết bị
multipath -ll | grep -E "^[a-z0-9]+"
# Output: 360000000000000001 dm-0 SYNOLOGY,iSCSI Storage
# Thêm vào /etc/multipath.conf
multipaths {
multipath {
wwid 360000000000000001
alias san_storage_lun0
}
}
Sau đó thiết bị luôn là /dev/mapper/san_storage_lun0 — dễ dùng trong fstab và script.
Cấu hình iSCSI tự động login sau reboot
# Bật auto login cho tất cả target
iscsiadm -m node --op update -n node.startup -v automatic
# Bật service
systemctl enable iscsid open-iscsi
# Test bằng cách reboot và kiểm tra
iscsiadm -m session
multipath -ll
Tips thực tế từ kinh nghiệm thực chiến
Cô lập storage traffic với VLAN riêng
Đừng bao giờ để iSCSI traffic chạy chung với management network. Mình đã từng gặp trường hợp intermittent packet loss chỉ xảy ra vào giờ cao điểm — debug mãi mới phát hiện ra iSCSI đang cạnh tranh băng thông với backup job chạy hàng đêm trên cùng một interface. Sau khi tách ra VLAN riêng với MTU 9000 (jumbo frames), throughput tăng gần gấp đôi và không còn I/O timeout nữa.
Cấu hình jumbo frames cho storage interface:
# Tạm thời (test)
ip link set eth1 mtu 9000
ip link set eth2 mtu 9000
# Kiểm tra MTU path end-to-end
ping -M do -s 8972 192.168.100.1
# -M do: không fragment, -s 8972: 8972 + 28 byte header = 9000 MTU
# Nếu ping thành công → network hỗ trợ jumbo frames đầu cuối
Monitor multipath path health
# Xem trạng thái real-time
watch -n 2 'multipath -ll'
# Script kiểm tra path down và gửi alert
#!/bin/bash
FAILED=$(multipath -ll | grep -c 'failed faulty')
if [ "$FAILED" -gt 0 ]; then
echo "WARNING: $FAILED multipath path(s) failed" | mail -s "Multipath Alert" [email protected]
fi
Test failover thực tế
Đừng chờ đến khi có sự cố mới test failover. Làm điều này định kỳ:
# Chạy I/O liên tục trong background
dd if=/dev/zero of=/dev/mapper/san_storage_lun0 bs=1M count=1000 &
# Trong khi dd chạy, tắt một path
multipath -f mpatha # hoặc tắt interface vật lý
ip link set eth1 down
# Xem I/O có tiếp tục không
iostat -x 2
# Bật lại
ip link set eth1 up
multipath
Troubleshooting path không xuất hiện
# Xem log của multipathd
journalctl -u multipathd -f
# Rescan iSCSI session
iscsiadm -m session --rescan
# Nếu path vẫn không lên, thử remove và add lại
iscsiadm -m node --logout
iscsiadm -m node --login
multipath -F && multipath
Tách biệt 2 network interface vào 2 subnet khác nhau
Nhiều người cắm cả 2 interface vào cùng subnet storage rồi thắc mắc tại sao multipath không nhận đủ 2 path. Linux sẽ routing I/O qua một interface mặc định cho cả 2 connection nếu chúng cùng subnet. Giải pháp là dùng policy routing:
# Tạo 2 bảng routing riêng
echo '100 storage1' >> /etc/iproute2/rt_tables
echo '101 storage2' >> /etc/iproute2/rt_tables
# Routing rules
ip rule add from 192.168.10.10 table storage1
ip rule add from 192.168.11.10 table storage2
ip route add 192.168.100.0/24 dev eth1 src 192.168.10.10 table storage1
ip route add 192.168.101.0/24 dev eth2 src 192.168.11.10 table storage2
Sau đó iscsiadm discover với -I flag chỉ định source IP — multipath mới thực sự đi qua 2 đường vật lý khác nhau.

