LinuxでのiSCSI Multipathing設定ガイド:SANの帯域幅最適化と接続冗長化

Network tutorial - IT technology blog
Network tutorial - IT technology blog

LinuxのiSCSI Multipathing:5分でできる設定手順

SANを経由してストレージを運用しているのに、接続経路が1本しかない場合、それは時限爆弾も同然です。ケーブル断線、NIC障害、スイッチ故障——どれが起きても即ダウンタイムになります。iSCSI Multipathingは、同一ストレージデバイスに対して複数のネットワーク経路を並列利用することで、この問題を根本的に解決します。

このクイックスタートは、iSCSI target(TrueNAS、Synology、またはLinux上のtargetcli)がすでに稼働しており、Linuxサーバーにストレージネットワークへ接続する2つ以上のネットワークインターフェースがあることを前提としています。

ステップ1:必要なパッケージのインストール

# Ubuntu/Debian
apt install open-iscsi multipath-tools -y

# RHEL/CentOS/Rocky
dnf install iscsi-initiator-utils device-mapper-multipath -y

ステップ2:InitiatorのIQNを確認する

cat /etc/iscsi/initiatorname.iscsi
# Output: InitiatorName=iqn.1993-08.org.debian:01:abc123def456

このIQNをコピーして、iSCSI targetのACLリストに追加してください。

ステップ3:2つのネットワーク経路でTargetをDiscoverしてログインする

# インターフェース1からDiscover(例:192.168.10.10はサーバーのストレージIP)
iscsiadm -m discovery -t st -p 192.168.100.1 -I 192.168.10.10

# インターフェース2からDiscover
iscsiadm -m discovery -t st -p 192.168.101.1 -I 192.168.11.10

# Discoverしたすべてのtargetにログイン
iscsiadm -m node --login

ステップ4:経路が正しく認識されているか確認する

iscsiadm -m session
# 2つのセッションが表示され、それぞれ異なるIPを経由していることを確認
# 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

ステップ5:Multipathを有効にする

mpathconf --enable --with_multipathd y
systemctl enable --now multipathd

# Multipathがデバイスを認識しているか確認
multipath -ll

multipath -llの出力に、2つのpathを持つデバイスが表示されれば、基本設定は完了です。


詳しく解説:iSCSIとMultipathingの仕組み

iSCSIとは何か

iSCSI(Internet Small Computer Systems Interface)は、高価なFibre Channelを使わなくても、通常のTCP/IPネットワーク経由でブロックストレージにアクセスできるプロトコルです。サーバー(initiator)はストレージサーバー(target)に接続し、ストレージデバイスをローカルディスクとして認識します。

なぜMultipathingが必要なのか

Multipath I/O(MPIO)は、同一LUNへの複数の物理経路から単一の仮想デバイスを生成します。主な利点は2つあります:

  • フェイルオーバー:1つの経路が切れても、I/Oは自動的に残りの経路に切り替わり——サービスを中断しません
  • ロードバランシング:I/Oを複数の経路に分散させることで、実効スループットを向上させます

設定ファイルの構造

cat /etc/multipath.conf

mpathconf --enable実行後のデフォルトファイル:

defaults {
    user_friendly_names yes
    find_multipaths yes
}

blacklist {
    devnode "^sda"    # OSドライブをマルチパス対象から除外
}

高度な設定

適切なロードバランシングポリシーの選択

Linuxのmultipathは複数の負荷分散モードをサポートしています。以下は私がよく使う設定です:

defaults {
    user_friendly_names yes
    path_grouping_policy multibus
    path_selector "round-robin 0"   # 各パスを均等にラウンドロビン
    failback immediate              # 復旧時にメインパスへ即座に切り戻す
    rr_weight priorities
    no_path_retry fail
}

devices {
    device {
        vendor "SYNOLOGY"           # お使いのベンダーに合わせて変更
        product "Storage"
        path_grouping_policy multibus
        path_checker tur
        features "0"
        hardware_handler "0"
        prio "const"
        rr_weight uniform
    }
}

設定を編集した後:

systemctl restart multipathd
multipath -F && multipath   # フラッシュして再Discover
multipath -ll               # 新しい状態を確認

Multipathデバイスへの固定名の割り当て

reboot後に変わる可能性がある/dev/mapper/mpathaの代わりに、WWIDに基づいてエイリアスを設定することをお勧めします:

# デバイスのWWIDを取得
multipath -ll | grep -E "^[a-z0-9]+"
# Output: 360000000000000001 dm-0 SYNOLOGY,iSCSI Storage

# /etc/multipath.confに追記
multipaths {
    multipath {
        wwid   360000000000000001
        alias  san_storage_lun0
    }
}

これにより、デバイスは常に/dev/mapper/san_storage_lun0として固定され、fstabやスクリプトで扱いやすくなります。

reboot後のiSCSI自動ログイン設定

# すべてのtargetへの自動ログインを有効化
iscsiadm -m node --op update -n node.startup -v automatic

# サービスを有効化
systemctl enable iscsid open-iscsi

# rebootして確認でテスト
iscsiadm -m session
multipath -ll

実践経験から学んだ実用的なTips

専用VLANによるストレージトラフィックの分離

iSCSIトラフィックをmanagement networkと同じネットワークで流してはいけません。私が実際に経験したケースでは、ピーク時間帯だけ間欠的にパケットロスが発生し、原因を調査してみると、iSCSIが同一インターフェース上で夜間バックアップジョブと帯域幅を奪い合っていたことが判明しました。MTU 9000(ジャンボフレーム)を設定した専用VLANに分離した後、スループットはほぼ2倍に向上し、I/Oタイムアウトも完全に解消されました。

ストレージインターフェースへのジャンボフレーム設定:

# 一時的に設定(テスト用)
ip link set eth1 mtu 9000
ip link set eth2 mtu 9000

# エンドツーエンドのMTUパスを確認
ping -M do -s 8972 192.168.100.1
# -M do: フラグメント禁止、-s 8972: 8972 + 28バイトヘッダー = 9000 MTU

# pingが成功すればネットワーク全体でジャンボフレームがサポートされている

Multipathのパスヘルスをモニタリングする

# リアルタイムで状態を確認
watch -n 2 'multipath -ll'

# パスダウンを検知してアラートを送信するスクリプト
#!/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

フェイルオーバーの実際のテスト

障害が発生するまでフェイルオーバーテストを後回しにしてはいけません。定期的に以下を実施しましょう:

# バックグラウンドで継続的にI/Oを実行
dd if=/dev/zero of=/dev/mapper/san_storage_lun0 bs=1M count=1000 &

# dd実行中に1つのパスを切断
multipath -f mpatha  # または物理インターフェースをダウン
ip link set eth1 down

# I/Oが継続しているか確認
iostat -x 2

# 復旧
ip link set eth1 up
multipath

パスが表示されない場合のトラブルシューティング

# multipathd のログを確認
journalctl -u multipathd -f

# iSCSIセッションを再スキャン
iscsiadm -m session --rescan

# それでもパスが表示されない場合はログアウト・ログインを試す
iscsiadm -m node --logout
iscsiadm -m node --login
multipath -F && multipath

2つのネットワークインターフェースを異なるサブネットに分離する

2つのインターフェースを同じストレージサブネットに接続しているのに、なぜmultipathが2経路を認識しないのかと悩む方が多くいます。同一サブネットに属している場合、LinuxはI/Oを両方の接続に対してデフォルトの1つのインターフェースでルーティングしてしまいます。解決策はポリシールーティングを使うことです:

# 2つの独立したルーティングテーブルを作成
echo '100 storage1' >> /etc/iproute2/rt_tables
echo '101 storage2' >> /etc/iproute2/rt_tables

# ルーティングルールを設定
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

その後、-IフラグでソースIPを指定してiscsiadm discoverを実行することで、multipathが実際に2つの物理経路を通るようになります。

Share: