SCore-D の自動運転と自動復旧

sc_watch コマンドを用いると、SCore-D の自動運転が可能になります。まず、 sc_watch は scout 環境を生成し、次に SCore-D を scout 環 境内で起動します。その後、sc_watch は SCore-D からの応答 を watch-dog 方式で監視します。SCore-D が数分間応答しなくなると、 sc_watch はクラスタになんらかの障害が発生したものとみなし、 システムのリブートを初めから試みます。

sc_watch プログラムは障害を検知した場合に Unix コマンドや シェルスクリプトを呼び出すことができます。例えば Unix の mail コマンドで管理者へメールを送るようなシェルスクリプト を指定しておけば、システムがダウンした場合に管理者がその通知をメールで 受け取れるようになります。 sc_watch がシステム障害を検知した場合、副作用のクリーンアッ プ用に scout コマンドを呼び出すこともできます。

以下に sc_watcu の実行例を示します:

# sc_watch -g pcc scored
[14/Sep/2001,16:31:43] SC_WATCH (4.1) started.
[14/Sep/2001,16:31:43] Interval is set to 10 minutes.
[14/Sep/2001,16:31:43] Local Action  = (none)
[14/Sep/2001,16:31:43] Remote Action = (none)
[14/Sep/2001,16:31:43] Abort action  = (none)
[14/Sep/2001,16:31:43] Boot Retry Max. = 10
[14/Sep/2001,16:31:43] Booting System: scored 
SCOUT: Spawning done.    
14/Sep/2001 16:31:51 SYSLOG: /opt/score/deploy/scored
14/Sep/2001 16:31:51 SYSLOG: SCore-D 4.1 $Id: init.cc,v 1.63 2001/09/07 09:10:26 hori Exp $
14/Sep/2001 16:31:51 SYSLOG: Compile option(s): 
14/Sep/2001 16:31:51 SYSLOG: SCore-D network: myrinet/myrinet2k
14/Sep/2001 16:31:51 SYSLOG: Cluster[0]: (0..15)x2.i386-redhat7-linux2_4.i686.800
14/Sep/2001 16:31:51 SYSLOG:   Memory: 501[MB], Swap: 259[MB], Disk: 3027[MB]
14/Sep/2001 16:31:51 SYSLOG:   Network[0]: myrinet/myrinet2k
14/Sep/2001 16:31:51 SYSLOG:   Network[1]: ethernet/ethernet
14/Sep/2001 16:31:51 SYSLOG: Scheduler initiated: Timeslice = 500 [msec]
14/Sep/2001 16:31:51 SYSLOG:   Queue[0] activated,  exclusive scheduling
14/Sep/2001 16:31:51 SYSLOG:   Queue[1] activated,  time-sharing scheduling
14/Sep/2001 16:31:51 SYSLOG:   Queue[2] activated,  time-sharing scheduling
14/Sep/2001 16:31:51 SYSLOG: Session ID: 0
14/Sep/2001 16:31:51 SYSLOG: Server Host: comp00.pccluster.org
14/Sep/2001 16:31:51 SYSLOG: Backup Host: comp0f.pccluster.org
14/Sep/2001 16:31:51 SYSLOG: Operated by: root
14/Sep/2001 16:31:51 SYSLOG: SCore-D Watcher (server.pccluster.org:46514)
14/Sep/2001 16:31:51 SYSLOG: --------- SCore-D (4.1) bootup --------
...
システム障害が検知されると、sc_watch は SCore-D を終了 し、システムのリブートを試みます。
[14/Sep/2001 16:41:22] System failure detected.
SCOUT: session done
[14/Sep/2001 16:41:24] System has been shutdown.
[14/Sep/2001 16:41:30] Booting System: scored
SCOUT: Spawn done.    
14/Sep/2001 16:41:51 SYSLOG: /opt/score/deploy/scored
14/Sep/2001 16:41:51 SYSLOG: SCore-D 4.1 $Id: init.cc,v 1.63 2001/09/07 09:10:26 hori Exp $
...
他の多くの SCore コマンドと異なり、sc_watch は scout 環境 の「外側」で呼び出されなければなりません。これは sc_watch がクラスタ上で動作している SCore-D プロセスを scout を介 して kill するためです。

SYSLOG 出力の最後の行に、SCore-D が、ユーザによって起動された sc_watch プロセスとの接続に成功した、というメッセージがあ ります。この TCP 接続を通じて sc_watch が SCore-D を監視 します。 sc_watch プロセスは SCore-D が正常にシャットダウンされた とき、あるいは ^C(SIGINT)により終了します。

障害が発生したホストの代替

sc_watchscoreboard および sceptic プログ ラムは障害が発生したホストを代替ホストに自動的に切替えます。 最初にすべきことは、代替ホストの指定です。代替ホストは scorehosts.db ファイルに記述します。ホストレコードに spare 属性があった場合、かつ、そのホストが scoreboard コマンドの -defects オプションで示さ れたファイルに記述されていた場合、そのホストは spare 属性の値 であるホスト名に置き換えられます。この場合、代替ホストは被代替ホストと 同じプロセッサ、OS、ネットワーク属性を持っている必要があります。 ここで、replace.sh という名前のファイルが sc_watch のローカルコマンド用のスクリプトとして存在すると仮定しましょう。その内 容は以下のようなものになります。
host_group=pcc
install_root=/opt/score
#
$install_root/bin/sceptic -g $host_group >> /opt/score/etc/scorehosts.defects
echo defected hosts
cat /opt/score/etc/scorehosts.defects
echo new host list
$install_root/bin/scorehosts -r $host_group
/etc/rc.d/init.d/scoreboard stop
/etc/rc.d/init.d/scoreboard start
echo scoreboard is restarted.
sceptic コマンドは、host_group シェル変数で指定 されたホストグループに属するホストが正常に動作しているかどうかを調べま す。異常と判断されたホストは scorehosts.defects ファイルに出力 されます。

sceptic コマンドの scorehosts.defects への出力は常に アペンドでなければなりません。そうでないと困った事態を引き起こします。 あるホストが故障してそれが直ったとしましょう。その後別なホストが故障し ました。すると、結果的に一度に2つのホストが置き換えられてしまうことに なります。SCore 4.1 のチェックポイントではチェックポイントファイルにパ リティブロックを持っています。これによりひとつのホストのチェックポイン トファイルが失われても、他のホストのパリティブロックにより失われたファ イルを復旧することができます。しかしながら、ふたつ以上のホストが置き換 えられると復旧が不可能になる場合が生じるのです。

次に行なうべき事は、/etc/rc.d/init.d/scoreboard スクリプトファ イルの変更です。そのファイルには以下のような関数が記述してあるはずです。

startsccoreboard() {
	pid=`pidofproc scoreboard`
        [ -n "$pid" ] && ps h $pid >/dev/null 2>&1 && return
	ulimit -c 0
	su nobody -c "$INSTALL_ROOT/sbin/scoreboard -file /opt/score/etc/scorehosts.db -pid" > /var/run/scoreboard.pid && success
}
この関数を次のように変更します。この変更により scoreboard コマンドが故障したホストのリストを記述したファイル を読むようになります。
startsccoreboard() {
	pid=`pidofproc scoreboard`
        [ -n "$pid" ] && ps h $pid >/dev/null 2>&1 && return
	ulimit -c 0
	su nobody -c "$INSTALL_ROOT/sbin/scoreboard -file /opt/score/etc/scorehosts.db -defects /opt/score/etc/scorehosts.defects -pid" > /var/run/scoreboard.pid && success
}
最後に、sc_watch コマンドを以下のようにサーバホスト( scoreboard プロセスが走行している)で起動します。
# sc_watch -g pcc -l replace.sh scored
[14/Sep/2001,16:31:43] SC_WATCH (4.1) started.
[14/Sep/2001,16:31:43] Interval is set to 10 minutes.
[14/Sep/2001,16:31:43] Local Action  = replace.sh
[14/Sep/2001,16:31:43] Remote Action = (none)
[14/Sep/2001,16:31:43] Abort action  = (none)
[14/Sep/2001,16:31:43] Boot Retry Max. = 10
[14/Sep/2001,16:31:43] Booting System: scored 
SCOUT: Spawning done.    
...
SCore-D がクラッシュすると、sceptic コマンドが計算ホストが故 障していないかどうか調べます。故障したホストが見つかると、ファイルに記 録し、scoreboard プロセスを再起動します。これにより故障したホ ストは scorehosts.db に記述してある代替ホストに置き換わります。 最後に SCore-D が sc_watch コマンドにおより再起動されます。ユー ザプロセスがチェックポイントを行なっていた場合、故障したホスト上の失わ れたファイルはパリティブロックにより復旧され、ユーザプロセスの実行は、 チェックポイントまで遡って再開されます。

See Also

sc_watch(8), scored(8), scoreboard(8), scorehosts.db(5), sceptic(1) scrun(1),


CREDIT
This document is a part of the SCore cluster system software developed at PC Cluster Consortium, Japan. Copyright (C) 2003 PC Cluster Consortium.