2017年3月3日金曜日

iSCSIでmultipath

さて、試してみたいことはたくさんある。
その内の1つが、iSCSIストレージでmultipathは使えるのか?だ。

ストレージ装置(SAN/iSCSI等)とサーバ間の接続を、冗長構成を考慮して複数のパスを用意した場合、ディスクデバイスが複数個に見えてしまう。
同一のディスクデバイスに対して、複数のデバイスファイルが見えてしまうと、管理上めちゃくちゃ面倒くさい。
同一のディスクデバイスに対して、1つの仮想デバイスファイルを用意して、ボリューム管理をそのデバイスファイルに対して行えるようにする、というのがmultipathだ。
下の図だと、パスが2系統有る。この場合、同一の領域(LUN)に対して、OSは2つのデバイスファイル(例えば、/dev/sdgと/dev/sdh)を作成する。
が、この両方を操作するのは面倒くさい。
multipathを使うと、これを1つの仮想デバイス(例えば、/dev/mapper/mpathc等)に紐付けられる。
ディスクに対する操作(parted等)は、その/dev/mapper/mpathcに対して行うことになる。

仕事では、FC接続の場合でこのmultipathを使うことは多かった。(iSCSIでmultipathは実装したことが無い。)

更に、ウチの環境ではiSCSIこそあれど、パスはシングルだ。
シングルパスの場合、multipathを用いるメリットは殆ど無いのだが、iSCSIでmultipathが使えるのかどうか、試してみたいと思っていた。

とりあえず、gemini/cancerというゲストマシンがあるので、この2つとiSCSIストレージを使って、iSCSIディスクが使えるように環境を整える。
手順は、「iSCSIを利用しようその1」等に従えばいい、はずだ。

今回は、iSCSIターゲットは1つで、そのiSCSIターゲットに対して、gemini/cancerともに接続出来るようにしておくよ。

1つだけLUN(100GB)を割り当てたら、/dev/sdaとして見えてきた。

gemini/cancerから、LUNが見える状態になったこと、iSCSIターゲットへの自動ログインが確認できたら、multipathを導入してみる。
(現時点では、LUN(/dev/sda)に対してパーティションの作成等は不要だ)
(gemini) $ sudo apt-get update
(gemini) $ sudo apt-cache search multipath

multipath-toolsっぽいな。
(gemini) $ sudo apt-get --simulate install multipath-tools
(gemini) $ sudo apt-get install multipath-tools

cancerにも。
(cancer) $ sudo apt-get update
(cancer) $ sudo apt-get install multipath-tools

導入できたら、デーモンの確認。
(gemini) $ ps -ef | grep multipath
(cancer) $ ps -ef | grep multipath
/sbin/multipathdというデーモンが動きだしたはず。

syslog見てみよう。
(gemini) $ tail -30 /var/log/syslog
エラーは特に無さそうだ。

が、multipathデバイスが出来ている様子が無い…。
多分、再起動しても無駄だと思うが…。
(gemini) $ sudo shutdown -r now

げ、再起動したら/etc/multipathディレクトリが出来上がったよ…。再起動必要なんかい!?
その中には、wwidsというファイルが出来上がっているが、中身は空(コメントのみ)。

それ以前に、multipath.confが必要なはずなんだが…。Ubuntuでは用意されてないのかな…。
(gemini) $ dpkg -L multipath-tools
サンプルっぽいのが2つある。
/usr/share/doc/multipath-tools/examples/multipath.conf.annotated.gz
/usr/share/doc/multipath-tools/examples/multipath.conf.synthetic

どちらも中身はすべて#で始まる無効行だが、前者の方がコメントがしっかり書かれている。
こちらを/etcの下に展開してしまおう。
(gemini) $ ls /etc/multipath.conf
(gemini) $ cd /usr/share/doc/multipath-tools/examples
(gemini) $ sudo bash -c "zcat multipath.conf.annotated.gz > /etc/multipath.conf"
(gemini) $ ls /etc/multipath.conf
(gemini) $ cd

(gemini) $ sudo systemctl daemon-reload
う~ん。まぁ中身が全部コメントだったから、何も変化は無いよな。

ちょっとmultipathの結果を見てみよう。
(gemini) $ sudo multipath -v 3
以下のような行が出た…。
wwid 23966323038343131 not in wwids file, skipping sda
この、239...という数字は、/dev/disk/by-id/ の中で/dev/sdaにリンクが貼られているファイルの名前と同じだ。
つまり、このディスク(/dev/sda)のuuid/wwidってことだよな…。

そして、not in wwids fileということは、逆に言うとwwidsファイルに記載したら何か起きるのか?

書き込んでみよう。
なんか、wwidsファイルにwwidを書く時は、/で囲わないといけないっぽい。
(gemini) $ sudo bash -c "echo /23966323038343131/ >> /etc/multipath/wwids"
(gemini) $ sudo cat /etc/multipath/wwids

(gemini) $ sudo multipath -v 3
お、変化が出た。
色々メッセージが出たけど、その中に
create: 23966323038343131 undef ASUSTOR,iSCSI Storage
というのが出てきた。

これは…
(gemini) $ sudo multipath -ll
23966323038343131 dm-2 ASUSTOR,iSCSI Storage
size=100G features='0' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
`- 8:0:0:0 sda 8:0 active ready running
出来てる!

(gemini) $ ls -l /dev/mapper
数字の羅列のデバイスファイルが出来上がってるぞ。

これ、ディスク操作とかに使えるのかな?
(gemini) $ sudo parted /dev/mapper/23966323038343131 print
出来た。

しかしこれではちょっと見にくい。
なにせ名前が数字の羅列だ。
というわけで、分かりやすい名前に変更する方法を確認。
multipath.confのuser_friendly_nameというのが該当の設定項目だ。
さっそく変更しよう。
(gemini) $ sudo vi /etc/multipath.conf
--ココから
10行目付近
#defaults {
↓先頭の#を削除
defaults {

215行目付近
# user_friendly_names no
↓先頭の#を削除し、no→yesへ書き換え
user_friendly_names yes

341行目付近
#}
↓先頭の#を削除
}
--ココまで

設定の再読込み
(gemini) $ sudo systemctl reload multipathd.service

確認
(gemini) $ sudo multipath -ll
mpatha (23966323038343131) dm-2 ASUSTOR,iSCSI Storage
size=100G features='0' hwhandler='0' wp=rw
`-+- policy='round-robin 0' prio=1 status=active
`- 8:0:0:0 sda 8:0 active ready running
mpathaと表示された!

(gemini) $ ls -l /dev/mapper
数字のデバイスファイルが消えて、mpathaが作成された。

(gemini) $ sudo parted /dev/mapper/mpatha print
ディスク認識OK。

(gemini) $ sudo cat /etc/multipath/bindings
wwidsとmpathaを紐付けるファイルが出来上がっている。

(gemini) $ lsblk /dev/sda
sdaからmpathaが作られている、ということが分かる。

これで最低限の設定は出来た。
パフォーマンスチューニング等、/etc/multipath.confを手直しすることになるんだけど、そこまで実施はしない。
(本当に複数パスで繋いでいる場合、パス分散ルールを変えることでパフォーマンス向上が期待できるけど、自分の構成ではシングルパスでしか繋いでいないので意味が無い…。)

さて、もう1つだけ実験しておこう。
デバイス名が/dev/mapper/mpathaになったけど、この名前を変更できるのだろうか?
なんとなく、/etc/multipath/bindingsファイルを書き換えれば実現できそうだ。
試してみよう。
(gemini) $ sudo vi /etc/multipath/bindings
以下のように修正
--ココから
mpatha 23966323038343131

ocfs2-001 23966323038343131
--ココまで
今回、iSCSIストレージ装置側で作成した100GBのLUNの名前を、ocfs2-001としておいた。
サーバ側でも同じ名前だと管理が楽かもしれない。
ということでこの名前が使えるかを試してみる。

変更したら、一旦マルチパスデバイスを消して…
(gemini) $ sudo multipath -F /dev/sda
(gemini) $ sudo multipath -ll
消えたのを確認したら、デバイス再読込み…
(gemini) $ sudo multipath -r /dev/sda
で、ocfs2-001という名前で作られるようだ。

(gemini) $ sudo multipath -ll
出来上がった。

念のためデバイスファイルの確認
(gemini) $ ls -l /dev/mapper
ocfs2-001に変わっている。

ディスク確認
(gemini) $ sudo parted /dev/mapper/ocfs2-001 print
きちんと読み込める。(パーティション情報が一切ないので、ラベルが認識できない等のエラーになるが、無視してOK。)

さて、途中からgeminiにのみ設定を施していたので、cancer側も同じ設定を施しておく。
geminiとは若干順番が変わっているが気にしないでいい。

まずはmultipath.confファイルの作成。
(cancer) $ ls /etc/multipath.conf
(cancer) $ cd /usr/share/doc/multipath-tools/examples
(cancer) $ sudo bash -c "zcat multipath.conf.annotated.gz > /etc/multipath.conf"
(cancer) $ ls /etc/multipath.conf
(cancer) $ cd

multipath.confのカスタマイズ
(cancer) $ sudo vi /etc/multipath.conf
--ココから
10行目付近
#defaults {
↓先頭の#を削除
defaults {

215行目付近
# user_friendly_names no
↓先頭の#を削除し、no→yesへ書き換え
user_friendly_names yes

341行目付近
#}
↓先頭の#を削除
}
--ココまで
(cancer) $ sudo systemctl reload multipathd.service

まだwwidsファイルは出来上がってないと思うので、一旦OS再起動。
(cancer) $ sudo shutdown -r now

wwidsファイル変更(geminiの時は直接編集したが、今回はmultipathコマンドで編集)
(cancer) $ ls -ld /etc/multipath
(cancer) $ sudo ls -l /etc/multipath
(cancer) $ sudo cat /etc/multipath/wwids
(cancer) $ sudo multipath -a /dev/sda
(cancer) $ sudo cat /etc/multipath/wwids

multipathデバイスの認識。
(cancer) $ sudo multipath -ll /dev/sda
(cancer) $ sudo multipath -r /dev/sda
(cancer) $ sudo multipath -ll /dev/sda

デバイスファイル名の修正
(cancer) $ sudo vi /etc/multipath/bindings
以下のように修正
--ココから
mpatha 23966323038343131

ocfs2-001 23966323038343131
--ココまで

(cancer) $ sudo multipath -ll /dev/sda
(cancer) $ sudo multipath -F /dev/sda
(cancer) $ sudo multipath -ll /dev/sda
(cancer) $ sudo multipath -r /dev/sda
(cancer) $ sudo multipath -ll /dev/sda

とりあえず、これでiSCSIボリュームをmultipathd管理にすることは完了。

0 件のコメント:

コメントを投稿