2012年11月10日土曜日

LifeKeeper を運用する前に覚えておきたいポイント


クラスタソフトであるLifeKeeperを運用する上で覚えておくべきことをまとめておく。


【概要】
 【構成】
 【コマンド】
 【障害時の動作と復旧方法】
 【メンテナンス方法】
 【ログ】
 【プロセス】



【構成】
以下の構成で組んでいるものとする。

物理サーバ  node1
論理リソース  app1(アプリケーションリソース)

物理サーバ  node2
論理リソース  app2(アプリケーションリソース)

データの高可用性化方式としては以下の2つがある。

① 共有ディスク構成
外部ストレージを共有ディスクとして用いる
実装には外部ストレージが必要となる。

② データレプリケーション構成
サーバ毎に接続されたローカルディスクをレプリケーションすることで、
ミラーボリュームを作成し、共有ディスクとして扱う。

ここでは②を採用したものとして説明する。
②を選んだ理由は高価な外部ストレージが必要ないということが一番のメリットとなるだろう。
サーバ毎に接続されたローカルディスクをレプリケーションすることで、
ミラーボリュームを作成し、共有ディスクとして扱う。
物理的な制約がなくなるため、遠隔地へのフェイルオーバーも可能である。

デメリットとしてはスプリットブレインが発生する可能性があることだろうか。

共有ストレージ構成の場合は、それぞれのI/Oフェンシング機能によって、
両ノードでリソースがアクティブにならないように動作する。
しかし、データレプリケーション構成の場合には、そのような仕組みが無いため、
一次ノードのリソース状態に関係無く引継ノードでリソースの起動を開始しようとする。
スプリットブレイン発生時の復旧方法は後ほど記載する。

※ スプリットブレインを防ぐために、Quorum/Witness Server Kit パッケージの
導入を検討してもいいかもしれない。
2つのモードを選択できる。
・Quorum Check
・Witness Check



【コマンド】
◆ 確認コマンド
● バージョン確認
直接確かめる手段がなかったためパッケージから確認している。
RedHat系でrpmからインスタンスしていることを前提。
$ rpm -q steeleye-lk
steeleye-lk-*.*.*


● クラスタの状態確認
下記の3プロセスが表示されれば正常に起動している。
# lktest
lcm
ttymonlcm
lcd


● フェールオーバ時の動作確認
# lcdstatus | grep strategy
The shutdown strategy is set to: switchover.

下のコマンドあたりでも確認できるだろう。
# flg_list


● リソース状況の確認
node1とnode2でクラスタを組んでおりnode1側で実行したとする。
# lcdstatus -q
-q : query

LOCAL   TAG            ID             STATE   PRIO  PRIMARY
node1   app1           application1   ISP        1  node1   ← アプリケーションリソース
node1     ip1          192.168.0.1    ISP        1  node1   ← 共有IPリソース
node1     fs1          /fs1           ISP        1  node1   ← ファイルシステムリソース
node1       datarep1   /dev/sda       ISP        1  node1   ← データレプリケーションリソース

node1   app2           application2   OSU       10  node2   ← アプリケーションリソース
node1     ip2          192.168.0.2    OSU       10  node2   ← 共有IPリソース
node1     fs2          /fs2           OSU       10  node2   ← ファイルシステムリソース
node1       datarep2   /dev/sda       OSU       10  node2   ← データレプリケーションリソース

MACHINE   NETWORK   ADDRESSES/DEVICE          STATE   PRIO
node2     TCP       192.168.1.1/192.168.1.2   ALIVE      1
node2     TCP       192.168.2.1/192.168.2.2   ALIVE      2


見方について一部説明しておく。
・リソースステータス
各種リソースのステータスである。

ISP : In Service Protected
リソースが正常に起動している状態

OSU : Out of Service Unimpaired
リソースが停止している状態

OSF : Out of Service Failed
直前にリソース停止や起動に失敗した状態


・コミュニケーションパスのステータス
ハートビートさせるネットワークのステータスである。

ALIVE
パスが接続している状態

DEAD
パスが断絶している状態

コミュニケーションパスのステータスはnode1側で確認すれば、
node2との通信状態が表示される。


・その他
ファイルシステムリソースとデータレプリケーションリソースが階層構造になっている。
データレプリケーションリソースはこのファイルシステムリソースにあるという意味である。


● データ同期の状態確認
※以後赤字は変数とする
# mirror_status データレプリケーションリソースタグ名

(例)
# mirror_status datarep1
Status: Fully Operational
[===================>] 100%     
Type: Synchronous       
Bitmap: 9193195 bits (chunks), 130385 dirty (1.4%)

フェールオーバ直後はすぐにデータレプリケーションリソースのミラーの同期ができない。
3分程度で同期できるまでそのリソースはフェールオーバをかけてはならない。

dirtyについては1chunks(クラスタ間の転送単位)中の溢れであり、
この%の高低は問題ない。


このprocファイル内でも進捗が確認できる。
# cat /proc/mdstat



● ポリシーの確認
リソース毎に障害が発生した場合のフェイルオーバ動作のポリシーを確認できる。
# lkpolicy --get-policies --verbose



◆ 操作コマンド
● クラスタの起動
# lkstart


● クラスタの停止
# lkstop


● リソースの起動
起動対象ノードにて最上位リソースを指定することで、
リソースグループ内の全てのリソースが起動する。
フェールオーバ先のノードで実行すること。
# perform_action -t リソースタグ名 -a restore
-t : tag name
-a : action name

(例)
node1側でnode1のリソースグループすべてを起動する。
# perform_action -t app1 -a restore


● 個別のリソースの起動
個別のリソースタグ名を指定し、-bオプションを付与するととそのリソースだけが起動する。
# perform_action -t ip1 -a restore -b
-b : changes this behavior

あるリソースがOSFになれば基本フェールオーバするが、
特定のリソースがOSFになってもフェールオーバさせないポリシーに
していることもあるだろう。そのような場合に利用することになる。


● リソースの停止
起動時とは異なり、指定したリソースタグ名より階層構造で上位に位置するリソースが全て停止する。
# perform_action -t リソースタグ名 -a remove

(例)
node1側でapp1のアプリケーションリソースのみを停止する。
# perform_action -t app1 -a remove

(例)
node1側で全リソースを停止する。
# perform_action -t datarep1 -a remove


● フェールオーバ
リソースの起動と同じである。
フェールオーバ先のノードで実行すること。
# perform_action -t リソースタグ名 -a restore

ログインしているノードでない場合は以下も利用できる。
# lcdremexec -d フェイルオーバ先ノード名 -- perform_action -t リソースタグ名 -a restore

(例)
node2側でnode1のリソースグループすべてを起動する。
# lcdremexec -d node2 --perform_action -t app1 -a restore



◆ 設定変更コマンド
● ポリシーの変更
両ノードで実行が必要である。
# lkpolicy --set-policy [Failover|LocalRecovery] --[on|off] tag=リソースタグ名

(例)
node1ノードのリソース共有IPリソースのフェイルオーバポリシーをオフにする。
# lkpolicy --set-policy Failover --off tag=ip1


● フェールオーバ動作の設定
フェールオーバさせる場合
# flg_create -f shutdown_switchover

フェールオーバさせない場合
# flg_remove -f shutdown_switchover



【障害時の動作と復旧方法】
● 物理故障時
node1が物理故障

node1のリソースがnode2へフェールオーバ

 クラスタサービスの停止(まだnode1が動作している場合)
# lkstop
※念のためnode1サーバもシャットダウンしておいたほうがいいだろう。

node1が復旧

クラスタサービスの起動
# lkstart

全てのデータレプリケーションリソースが同期状態であることを確認
# mirror_status datarep1

手動フェールバック
# perform_action -t app1 -a restore


● スプリットブレイン発生時
コミュニケーションパス(クラスタノード間でクラスタやリソースの
情報のやりとりを行うために使う通信経路)が切断された場合に発生する可能性がある。

最初にも書いたが、共有ストレージ構成の場合は、それぞれのI/Oフェンシング機能によって、
両ノードでリソースがアクティブにならないように動作する。

しかし、データレプリケーション構成の場合には、そのような仕組みが無いため、
一次ノードのリソース状態に関係無く引継ノードでリソースの起動を開始しようとする。

引継ノード側で起動してしまったデータレプリケーションリソースと
ファイルシステムリソースを停止する。
node1側
# perform_action -t datarep2 -a remove

node2側
# perform_action -t datarep1 -a remove

引継ノード側で起動エラーとなった共有IPリソースのステータスをOSUに戻す
node1側
# perform_action -t ip2 -a remove

node2側
# perform_action -t ip1 -a remove

コミュニケーションパスの断線を復旧させる

コミュニケーションパスが復旧したことを確認する
# lcdstatus -q
MACHINE   NETWORK ADDRESSES/DEVICE             STATE     PRIO
nodeX     TCP     192.168.1.1/192.168.1.2      ALIVE        1
nodeX     TCP     192.168.2.1/192.168.2.2      ALIVE        2

一次ノードから引継ノードにディスクの再同期が自動的に行われる

全てのデータレプリケーションリソースが同期状態であることを確認する
# mirror_status datarep1

# mirror_status datarep2


● OSFの状態からなおらずフェールオーバできない場合
状況判断:下記のようなエラーログが出力される。
※リソース名は適時読み替えること
ERROR:dr:restore:datarep1:104086:The "datarep1_data_corrupt" flag is set 
in "/opt/LifeKeeper/subsys/scsi/resources/netraid/" on system "node1". 
To avoid data corruption, LifeKeeper will not restore the resource.

OSFを含むデータレプレケーションリソースを外す。
フェールオーバ先のノード(node1)で実行する場合
# perform_action -t datarep1 -a remove

・別クラスタノード(node2)から実行する場合
# lcdremexec -d node1 -- perform_action -t datarep1 -a remove

flagファイルを削除
両ノードでできている可能性があるので両ノードで確認すること
# rm /opt/LifeKeeper/subsys/scsi/resources/netraid/<リソース名>_data_corrupt

リソース起動
・フェールオーバ先のノード(node1)で実行する場合
# perform_action -t datarep1 -a restore

・別クラスタノード(node2)から実行する場合
# lcdremexec -d node1 -- perform_action -t app1 -a restore

同期確認
# mirror_status datarep1


● データの同期が取れない場合
もし、ファイルシステムのマウントに失敗してしまった場合は、
データ同期を強制的に行うことで復旧させることができる。

# mirror_action データレプリケーションリソース force 同期元となるサーバ

(例)node1のdatarep1を強制同期する。
# mirror_action datarep1 force node1



【メンテナンス方法】
● システム全停止時の対応
node1ノードにnode2ノードで管理しているリソースをフェイルオーバさせる
node1側
# perform_action -t app2 -a restore

全てのリソースステータスがISPになっていることを確認する
# lcdstatus -e

シャットダウンストラテジーを無効にする
node1側
# flg_remove -f shutdown_switchover

node2側
# flg_remove -f shutdown_switchover

シャットダウンする
node1側
# shutdown -h now

node2側
# shutdown -h now


● システム全起動時の対応
サーバ起動
node1、node2で実施

全てのデータレプリケーションリソースが同期状態であることを確認
# mirror_status datarep1

# mirror_status datarep2

シャットダウン・ストラテジーを無効にする
node1側
# flg_create -f shutdown_switchover

node2側
# flg_create -f shutdown_switchover


● OSネットワークを再起動したい時
node1のnetworkをrestartするとする。

フェールオーバ
# lcdremexec -d node2 -- perform_action -t app1 -a restore

ネットワークを再起動するノードのクラスタ停止
# lkstop

ネットワーク再起動
# ネットワーク設定の変更

# /etc/init.d/network restart

クラスタ起動
# lkstart

 フェールバック
# lcdremexec -d node1 -- perform_action -t app1 -a restore



【ログ】
ディフォルトはここである。
# tail -f /var/log/lifekeeper.log

INFO   : 無視で問題なし
NOTIFY : 無視で問題なし
WARN   : 調査必要


調査用に必要なシステム情報を一括で取得するコマンドもある。
# lksupport
30s程度で収集が終わる。
ファイル群はtar.gzされ、/tmp/配下に保存されたことが示される。



【プロセス】
プロセス名                                 役割

プロセス停止時にシステム影響あり
/opt/LifeKeeper/bin/lcm    TCPによるハートビート通信の管理やクラスタを構成するノード間の通信についての管理を行うプロセス
/opt/LifeKeeper/bin/lcd               LifeKeeper Configuration Database (LCD) を制御するプロセス
/opt/LifeKeeper/bin/ttymonlcm   tty によるハートビート通信を監視しているプロセス
/opt/LifeKeeper/bin/lkcheck        リソースの監視を管理するプロセス

システム影響はないがログが出なくなる
/opt/LifeKeeper/bin/lk_logmgr    ログを管理するプロセス

システム影響なし(構成によって起動させていない場合もある)
/opt/LifeKeeper/bin/lkscsid        リザベーションコマンドの発行により共有ディスクの監視を行うプロセス
/opt/LifeKeeper/bin/lkvmhad      LifeKeeper を仮想環境にて使用するためのプロセス
/opt/LifeKeeper/bin/lkguiserver   lkGUIserverコマンドによって制御されるGUIサーバのプロセス
/opt/LifeKeeper/sbin/steeleye-lighttpd Web ブラウザ経由で GUI を表示するために使用するサーバ