7.6 パスフェールオーバーのポリシーと優先度の設定

Linuxホスト内で、ストレージコントローラへのパスが複数ある場合は、各パスが別個のブロックデバイスとして表示され、その結果、1つのLUNに複数のブロックデバイスが存在することになります。デバイスマッパーマルチパスサービスは、同じLUN IDを持つ複数のパスワードを検出し、そのIDで新しいマルチパスデバイスを作成します。たとえば、1つの非ゾーン化されたファイバチャネルのスイッチを介して2つのポートでストレージコントローラに接続した2つのHBAを持つホストは、4つのブロックデバイスを認識します(/dev/sda/dev/sdb/dev/sdc/dev/sdd)。デバイスマッパーマルチパスサービスは、1つのブロックデバイス/dev/mpath/mpath1を作成します。このデバイスは、既に示した4つのブロックデバイスを介してI/Oを再経路指定します。

このセクションでは、フェールオーバーのポリシーを指定し、パスの優先順位を設定する方法について説明します。

7.6.1 パスのフェールオーバーポリシーの設定

multipathコマンドを-pオプション付きで使用して、パスフェールオーバーポリシーを設定します。

multipath devicename -p policy 

次のポリシーオプションの1つで、policyを置き換えます。

表 7-4 multipath -pコマンドのグループポリシーオプション

ポリシーオプション

説明

failover (フェールオーバー)

優先度グループごとに1つのパス

multibus

1つの優先度グループ内にすべてのパス

group_by_serial

検出されたシリアル番号ごとに1つの優先度グループ

group_by_prio

パス優先度値ごとに1つの優先度グループ優先度は、コールアウトプログラムで決定されます。それらのプログラムは、グローバル、コントローラごと、またはマルチパスごとのオプションとして/etc/multipath.conf環境設定ファイルで指定されます。

group_by_node_name

ターゲットノード名ごとに1つの優先度グループターゲットノード 名は、 /sys/class/fc_transport/target*/node_nameにフェッチされます。

7.6.2 フェールオーバーポリシーの設定

デバイスのフェールオーバーポリシーは、手動で、/etc/multipath.confファイルに入力する必要があります。すべての設定とオプションの例は、/usr/share/doc/packages/multipath-tools/multipath.conf.annotatedファイルにあります。

優先度グループと属性の理解

優先度グループは、同じ物理LUNに属するパスのコレクションです。デフォルトでは、I/Oは、グループ内のすべてのパス全体にラウンドロビン方式で配分されます。multipathコマンドは、SANのpath_grouping_policy設定に基づいてそのSANの各LUNごとに、自動的に優先度グループを作成します。multipathコマンドは、グループ内のパス数にグループの優先度を掛け合わせて、どのグループがプライマリか決定します。計算された値が最も高いグループがプライマリグループです。プライマリグループ内のすべてのパスが失敗すると、次に値の高い優先度グループがアクティブになります。

パス優先度は、パスに割り当てられた整数値です。優先度は、値が高いほど高くなります。パスごとに優先度を割り当てるには、外部プログラムが使用されます。所定のデバイスに関して、同じ優先度のパスが同じ優先度グループに属します。

表 7-5 マルチパス属性

マルチパス属性

説明

user_friendly_names

IDを使用するか、または/var/lib/multipath/bindingsファイルを使用して永続的で固有なエイリアスを/dev/mapper/mpathN形式のマルチパスデバイスに割り当てるか指定します。

対応: 実際のIDの代わりに、マルチパスデバイスのエイリアスとして、ユーザフレンドリな名前を自動生成します。

デフォルト/dev/disk/by-id/に示されたWWIDを使用します。

blacklist

非マルチパスデバイスとして無視するデバイス名のリスト(cciss、fd、hd、md、dm、sr、scd、st、ram、raw、loopなど)を指定します。

例については、「/etc/multipath.confでの非マルチパスデバイスのブラックリスト化」を参照してください。

blacklist_exceptions

ブラックリストに含まれている場合でも、マルチパスデバイスとして扱うデバイス名のリストを指定します。

例として、/usr/share/doc/packages/multipath-tools/multipath.conf.annotatedファイルを参照してください。

failback (フェールバック)

エラーになったパスの回復を監視するかどうか指定し、パスサービス回復後のグループのフェールバックのタイミングを示します。

エラーになったパスは、回復すると、この設定に基づいてマルチパス対応パスのリストに戻されます。multipathは、優先度グループを評価し、プライマリパスの優先度がセカンダリパスのそれを超えると、アクティブな優先度グループを変更します。

immediate: パスが回復したら、ただちにパスを有効にします。

n (> 0): パスが回復したら、n秒後にパスを有効にします。0より大きい整数値を指定してください。

manual: デフォルト。エラーになったパスの回復は監視されません。管理者がmultipathコマンドを実行して、有効なパスと優先度グループを更新します。

getuid

固有のパス識別子を取得するためのコールのデフォルトプログラムと引数を指定します。絶対パスで指定してください。

/sbin/scsi_id -g -u -s

これがデフォルトの場所および引数になります。

例:

getuid "/sbin/scsi_id -g -u -d /dev/%n"

no_path_retry

パスの障害時に使用する動作を指定します。

n (> 0): multipathコマンドで待ち行列が停止し、パスがエラーになるまでの再試行数を指定します。0より大きい整数値を指定してください。

失敗: 即時失敗(待ち行列なし)を指定します。

キュー 待ち行列を停止しません(パスが復帰するまで永久に待機します)。

path_grouping_policy

所定のコントローラがホストとなるマルチパスデバイスのパスグループ化ポリシーを指定します。

フェールオーバー: 優先度グループごとに1つのパスが割り当てられるので、一度に1つのパスだけが使用されます。

multibus: (デフォルト)すべての有効なパスが1つの優先度グループに属します。トラフィックが、グループ内のアクティブなパスすべてに渡って負荷分散されます。

group_by_prio: パス優先度値ごとに、1つの優先度グループが存在します。同じ優先度のパスは同じ優先度グループに属します。優先度は外部プログラムによって割り当てられます。

group_by_serial: パスがSCSIターゲットシリアル番号(コントローラノードのWWN)でグループ化されます。

group_by_node_name: ターゲットノード名ごとに1つの優先度グループが割り当てられます。ターゲットノード名は/sys/class/fc_transport/target*/node_nameにフェッチされます。

path_checker

パスの状態を判別します。

directio: (multipath-toolsバージョン0.4.8以降でのデフォルト)。直接I/Oを持つ最初のセクタを読み込みます。DASDデバイスの場合、有用です。/var/log/messagesに障害メッセージをログ記録します。

readsector0: (multipath-tools version 0.4.7以前でのデフォルト)。デバイスの最初のセクタを読み込みます。/var/log/messagesに障害メッセージをログ記録します。

tur: デバイスに対するSCSIテストユニットレディコマンドを発行します。これはLUNによってサポートされている場合の推奨設定です。このコマンドは、障害時に、/var/log/messagesにメッセージを出力しません。

一部のSANベンダは、カスタムオプションとしてpath_checkerを提供しています。

  • emc_clariion: EMC ClariionのEVPDページ0xC0をクエリしてパスの状態を判別します。

  • hp_sw: Active/Standbyファームウェアを持つHPストレージアレイのパスの状態(アップ、ダウン、またはゴースト)をチェックします。

  • rdac: LSI/Engenio RDACストレージコントローラのパスmp状態をチェックします。

path_selector

負荷分散に使用するパスセレクタアルゴリズムを指定します。

round-robin 0: 優先度グループ内のすべてのアクティブパスに渡るトラフィックの分散に使用される負荷分散アルゴリズム(デフォルト)

SUSE Linux Enterprise Server 11以降では、次のような追加のI/O分散オプションが提供されます。

least-pending(最小保留): bioベースのデバイスマッパーマルチパスに対して、least-pending-I/O動的負荷分散ポリシーを提供します。この負荷分散ポリシーでは、パス上で保留になっている未処理のサービス要求数を考慮し、保留のサービス要求が最も少ないパスを選択します。

このポリシーは、SAN環境に異機種混合コンポーネントがある場合には特に有効です。たとえば、1台の8GB HBAと1台の2GB HBAが同じサーバに接続されている場合、このアルゴリズムを使用することで、8GB HBAを有効活用できます。

length-load-balancing(長さによる負荷分散): least-pendingオプションと同様に、パス上で実行中のI/Oの数に基づく、動的負荷分散装置。

service-time(サービス時間): 遅延に従って、パス上のI/Oを調整するサービス時間に基づく負荷分散装置。

pg_timeout

パスグループのタイムアウト処理を指定します。

なし(内部デフォルト)

prio_callout

マルチパスのprio_calloutsは、/lib/libmultipath/lib*内の共有ライブラリ内にあります。共有ライブラリを使用することで、デーモンの起動時、コールアウトがメモリにロードされます。

マルチパスマップのレイアウトを決定するプログラムと引数を指定します。

multipathコマンドでクエリされると、指定のmpath_prio_*コールアウトプログラムがマルチパスレイアウト全体との関係で所定のパスの優先度を返します。

この属性がgroup_by_prioのpath_grouping_policyとともに使用されると,同じ優先度を持つすべてのパスが1つのマルチパスグループにグループ化されます。総計の優先度が最も高いグループがアクティブグループになります。

グループ内のすべてのパスが失敗すると、総計の優先度が次に高いグループがアクティブになります。さらに、フェールオーバーコマンド(ハードウェアハンドラにより決定)がターゲットに送信されることもあります。

mpath_prio_*プログラムとして、指定のセットアップ用にベンダまたは管理者が作成したカスタムスクリプトを使用することも可能です。

コマンドライン内の%nは、/devディレクトリ内のデバイス名に展開します。

%bは、/devディレクトリ内のmajor:minor形式のデバイス番号に展開します。

%dは、/dev/disk/by-idディレクトリ内のデバイスIDに展開します。

デバイスがホットプラグ可能な場合は、%nの代わりに%dフラグを使用してください。これにより、デバイスが利用可能になった時点とudevがデバイスノード を作成した時点の間に短い時間間隔があるという問題が解決されます。

prio_callout属性を使用しない場合は、すべてのパスが同等になりますこれがデフォルトの設定です。

/bin/true: group_by_priorityを使用しない場合に使用します。

prioritizerプログラムは、multipathコマンドによってクエリされると、パス優先度を生成します。プログラム名は、mpath_prio_で開始し、後に使用するデバイスタイプまたは負荷分散の方法が続きます。現在の優先度プログラムには、次のものがあります。

mpath_prio_alua %n: SCSI-3 ALUA設定に基づいてパス優先度を生成します。

mpath_prio_balance_units: すべてのパスに同じ優先度を生成します。

mpath_prio_emc %n: EMCアレイのパス優先度を生成します。

mpath_prio_hds_modular %b: Hitachi HDS Modularストレージアレイのパス優先度を生成します。

mpath_prio_hp_sw %n: アクティブ/スタンバイモードのCompaq/HPコントローラのパス優先度を生成します。

mpath_prio_netapp %n: NetAppアレイのパス優先度を生成します。

mpath_prio_random %n: パスごとにランダムな優先度を生成します。

mpath_prio_rdac %n: LSI/Engenio RDACコントローラのパスの優先度を生成します。

mpath_prio_tpc %n: オプションとして、ベンダまたは管理者が作成したスクリプトを使用できます。このスクリプトは、各パスの優先度を指定するファイルから優先度を取得します。

mpath_prio_spec.sh %n: ユーザ作成スクリプトのパスを提供します。このスクリプトにより、2つ目のデータファイルに含まれた情報に基づくマルチパス処理の優先度が生成されます。(このパスとファイル名は、例として提供されています。ご使用のスクリプトの場所を指定してください)。このスクリプトは、ベンダまたは管理者が作成できます。スクリプトのターゲットファイルは、すべてのマルチパスデバイスの各パスを識別し、パスごとに優先度を指定します。例については、「セクション 7.6.3, スクリプトの使用によるパス優先度の設定」を参照してください。

rr_min_io

path_selector設定の指定のアルゴリズムで決定される同じパスグループ内の次のパスに切り替わる前に、パスに経路指定されるI/Oトランザクションの数を指定します。

n (>0): 0より大きい整数値を指定してください。

1000: デフォルト.

rr_weight

パスの重み付けの方法を指定します。

ユニフォーム: デフォルト. すべてのパスが同じラウンドロビン方式の重み付けを持ちます。

priorities: 各パスの重み付けは、パスの優先度にrr_min_io設定値を掛け合わせて決定します。

ラウンドロビン式負荷分散の設定

すべてのパスがアクティブです。一定の秒数または一定数のI/Oトランザクションの後で、シーケンスの次のオープンパスに移動するように、I/Oを設定します。

単一パスフェールオーバーの設定

優先度が最も高い(最も低い値の)単一パスがトランザクションに対してアクティブになります。他のパスは、フェールオーバーに使用できますが、フェールオーバーの発生までは使用されません。

ラウンドロビン式負荷分散用I/Oパスのグループ化

同じ優先度を持つ複数のパスがアクティブグループを形成します。そのグループのすべてのパスがエラーになると、デバイスが優先度の次に高いグループにフェールオーバーします。グループのすべてのパスが、ラウンドロビン方式の負荷分散で、トラフィックロードを共有します。

7.6.3 スクリプトの使用によるパス優先度の設定

デバイスマッパーマルチパス(DM-MPIO)と対話することにより、prio_callout設定のリソースとしての設定時にLUNへのパスの優先度を提供するスクリプトを作成できます。

まず、各デバイスの情報と各パスに割り当てたい優先度値をリストするテキストファイルを設定します。たとえば、ファイルを/usr/local/etc/primary-pathsと指定します。次の形式で、パスごとに1行入力します。

host_wwpn target_wwpn scsi_id priority_value

デバイス上の各パスの優先度を返します。変数FILE_PRIMARY_PATHSが各デバイスの適切なデータ(host wwpn、target wwpn、scsi_id、priority value)を含む実際のファイルに解決することを確認します。

1つのLUNに8つのパスが対応する場合、primary-pathsファイルの内容が、次のようになることがあります。

0x10000000c95ebeb4 0x200200a0b8122c6e 2:0:0:0 sdb 3600a0b8000122c6d00000000453174fc 50
0x10000000c95ebeb4 0x200200a0b8122c6e 2:0:0:1 sdc 3600a0b80000fd6320000000045317563 2
0x10000000c95ebeb4 0x200200a0b8122c6e 2:0:0:2 sdd 3600a0b8000122c6d0000000345317524 50
0x10000000c95ebeb4 0x200200a0b8122c6e 2:0:0:3 sde 3600a0b80000fd6320000000245317593 2
0x10000000c95ebeb4 0x200300a0b8122c6e 2:0:1:0 sdi 3600a0b8000122c6d00000000453174fc 5
0x10000000c95ebeb4 0x200300a0b8122c6e 2:0:1:1 sdj 3600a0b80000fd6320000000045317563 51
0x10000000c95ebeb4 0x200300a0b8122c6e 2:0:1:2 sdk 3600a0b8000122c6d0000000345317524 5
0x10000000c95ebeb4 0x200300a0b8122c6e 2:0:1:3 sdl 3600a0b80000fd6320000000245317593 51

表 7-5」に示された例を続行するには、/usr/local/sbin/path_prio.shという名前のスクリプトを作成します。パスとファイル名は任意に指定できます。スクリプトは、次の処理を実行します。

  • multipathからのクエリ時に、/usr/local/etc/primary-pathsファイルからデバイスとそのパスをグレップ検索します。

  • multipathに戻り、ファイル内のそのエントリの最後のカラムにある優先度値を使用します。

7.6.4 ALUAの設定 (mpath_prio_alua)

mpath_prio_alua(8)コマンドは、Linux multipath(8)コマンドの優先度コールアウトとして使用されます。このコマンドが返す番号をDM-MPIOが使用して、同じ優先度を持つSCSIデバイスをグループ化します。このパス優先度ツールは、ALUA (Asynchronous Logical Unit Access)をベースとしています。

構文

mpath_prio_alua [-d directory] [-h] [-v] [-V] device [device...] 

必要条件

SCSIデバイス

オプション

-dディレクトリ

デバイスノード名の一覧を見つけることのできるLinuxディレクトリパスを指定します。デフォルトディレクトリは、/devです。このオプションを使用する際には、管理するデバイスのデバイスノード名(sdaなど)だけを指定します。

-h

このコマンドのヘルプを表示して、終了します。

-v

詳細出力をオンにして、読みやすい形式でステータスを表示します。指定のデバッガーが属するポートグループやその現在の状態に関する情報が表示されます。

-V

このツールのバージョン情報を表示して、終了します。

device [device...]

管理するSCSIデバイス(または複数のデバイス)を指定します。ターゲットポートグループの報告コマンド(sg_rtpg(8))をサポートするSCSIデバイスを指定してください。デバイスノード名には、次の形式の1つを使用します。

  • 完全なLinuxディレクトリパス(/dev/sdaなど)-dオプションとは併用しないでください。

  • デバイスノード名のみ(sdaなど)。-dオプションの使用で、ディレクトリパスを指定します。

  • スペース無しでコロンで区切ったデバイスのメジャーおよびマイナー番号(8:0など)この形式を使用すると、/devディレクトリに、tmpdev-<major>:<minor>-<pid>形式の名前で、一時デバイスノードが作成されます。(たとえば、/dev/tmpdev-8:0-<pid>)。

戻り値

成功すると、0値とグループの優先度値が返ります。「表 7-6」は、mpath_prio_aluaコマンドが返す優先度値を示しています。

表 7-6 デバイスマッパーマルチパスのALUA優先度

優先度値

説明

50

デバイスはアクティブで最適化されたグループに属します。

10

デバイスは、アクティブだが最適化されていないグループに属します。

1

デバイスはスタンバイグループに属します。

0

他のすべてのグループ。

multipathコマンドでの処理方法により、値の間隔は大きくとられています。multipathコマンドは、グループ内のパス数とグループの優先度の値を掛け合わせた結果の値が最も高いグループを選択します。たとえば、非最適化パスグループが6つのパスを持ち(6 x 10 = 60)、最適化パスグループが1つのパスを持つ(1 x 50 = 50)場合は、非最適化グループが一番高い値を持つので、multipathは、非最適化グループを選択します。デバイスに対するトラフィックは、グループ内の6つのパスすべてを、ラウンドロビン方式で使用します。

エラーが発生すると、コマンドの失敗原因を示す、1〜5の値が返ります。詳細については、mpath_prio_aluaのマニュアルページを参照してください。

7.6.5 ターゲットパスグループの報告

SCSIターゲットポートグループの報告(sg_rtpg(8))コマンドを使用します。詳細については、sg_rtpg(8)のマニュアルページを参照してください。