「SAP HANA 運用管理の基礎」の4回目、プロセスの構成と監視です。
HANAインスタンスはnameserver、indexserver、その他プロセスで構成されます。また、ダイナミックティアリングやスマートストリームプロセッシングなどのオプションは、多くの場合独立したプロセスとして実装されています。
今回は、この内、基本インストール(BASE EditionでXSA以外を全部インストールの場合)で起動されるプロセスに絞って、プロセスの役割や監視方法について考えてみたいと思います。
基本インストールで利用可能なサービスプロセスとその役割は以下のようになります。
尚、名称は、SAP HANA Administration Guideに則り、プロセス名(サーバーコンポーネント名、サービス名)と記述し、文中では原則サービス名を使いますが
、必要に応じてプロセス名(=OSプロセス名)を使っています。
プロセス名(サーバーコンポーネント名、サービス名) | 役割 |
---|---|
hdbindexserver(Index server, indexserver) | データベースプロセスの本体
|
hdbnameserver (Name Server, nameserver) |
|
hdbxsengine(XS Classic Server, xsengine) | データベースカーネルと統合された開発プラットホーム
|
hdbwebdispatcher(Web Dispatcher, webdisptcher) |
|
hdbcompileserver(Compile Server, compileserver) |
|
hdbpreprocessor(Preprocessor, preprocessor) |
|
hdbstatisticsserver(Statistics Server, staticsserver) |
|
hdbscriptserver(Script Server, scriptserver) | Application Function Library関連のサービスで必要(オプション)
|
上記サービスプロセスの他に以下のようなスタートアップ用プロセスがあります。
プロセス名(サーバーコンポーネント名、サービス名) | 役割 |
---|---|
sapstartsrv(Sap Start Service, sapstartsrv) | SAP HANAインスタンスの起動・停止 |
sapstart(-, sapstart) | SAP HANAインスタンスの起動・停止 |
hdb.sap<SID>_HDB<xx>(Daemon, daemon) <SID>=英数字3桁のシステムID、<xx>=数字2桁のインスタンス番号 | サービスプロセスの起動・停止・監視
|
XSAやその他のオプションによるプロセスについては、SAP HANA Administration Guideを参照ください。
一般的に、管理者が現在稼働中のプロセスを見るには、HANA StudioのSystem Console>Landscapeを使うことが多いと思われます。
赤い枠の部分がサービス名ですが、マルチテナントデータベース環境、ダイナミックティアリング(拡張ストレージ)環境、スケールアウト環境などでは、同じ名前のサービス名が複数表示されることもあるため、常にHost、Portと併せて読む必要があります。
サービス名は、SYS.M_SERVICESから得ることもできます。
運用管理者の方は、実行中のプロセスを確認するためにHDB infoコマンドの出力を多用することが多いかもしれません。
こちらはLinuxのpsコマンドの出力を編集しているようです。従って、サービス名ではなくプロセス名が表示されています。
このHDB infoの出力はよく見ると、ある程度Unix/Linuxを知った人にとって気持ち悪い部分というかしっくりこない部分がいくつかあります。
分かりやすくするためにプロセスID(PID)、親プロセスID(PPID)、プロセス名から呼び出しの順番をチャート化してみました。
左端はLinuxのinitプロセスです。気持ち悪い部分というのは、initに続くsapstartsrv、sapstart、hdb.sapHDB_HDB00が何をしているのか、なぜサービスプロセスを直接呼び出さないのか、なぜsapstartsrvは孤立しているのか、がわからないという点です。
すでに前出の表で説明している通り、sapstartsrv、sapstart、daemon(hdb.sapHDB_HDB00)はスタートアップ用プロセスですが、プロセスの起動シーケンスを理解することはプロセスの監視上重要ですので、このHDB infoの出力例で説明することにします。
sapstartsrvとsapstartの関係
HDB stopコマンドでインスタンスをシャットダウンするとわかるのですが、上記チャート内のプロセスの中で唯一の常駐プロセスがsapstartsrvです。
ということは、sapstartsrvには何かの役目があるはずで、それがHANAインスタンスの起動・停止になります。実際にはsapstartを起動します。この時、sapstartはデーモンとして起動されるため親プロセスはinitとなります。(これは、デーモン化のためによく使われるdouble forkというコーディングらしい。)
つまり、起動順序としては、
なのですが、プロセスの親子関係は、
となり、この事がsapstartsrvが何をやっているかわからない気持ち悪さを招いていたのでした。けれども、ブートシーケンスを理解することにより、sapstartsrvが無ければ起動停止がうまくいかなさそうだ、という監視上のポイントが見えてきます。
この辺りは、sapstartsrv関連のマニュアル(SAP Start Service - Architecture of the SAP NetWeaver Application Server - SAP Library)にも書いてありますのでごらんください。(どうもsapinitからsapstartまでがSAP製品共通のブートシーケンスのようで、おそらく製品によるブート方法の違いはsapstartが吸収していると思われます。個人的には1階層多いのでは?と思うのですが、、。)
また、sapstartsrvは起動・停止のリクエストをWebサービス(port:5xx13/5xx14)で受け付けることができます。これはsapcontrolコマンドからリクエストすることが可能で、HDB start/stopもこのコマンドを使用しています。
以上をまとめると、daemonまでの起動シーケンスは以下のようになります。(sapcontrolは実行後にプロセスは消滅し常駐プロセスにはなりません。)
次に、daemon(hdb.sapHDB_HDB00)です。このプロセスは何をやっているのでしょうか?
答えは、後続の各プロセスの起動、停止、監視です。ブートシーケンスの中で、daemonは4つのプロセスグループを順番に起動します。最初が、nameserver、2番目がcompileserverとpreprocessor、3番目がindexserverとxsengine、最後がwebdispatcherです。
(何となくですが、全体を管理するプロセス→DBがなくて起動が早いプロセス→DBありのプロセス→ネットワークリスナー、というようなポリシーがあって、それぞれのプロセスにまとめてシグナルを送るためにこのようなグループ構成にしてるような気がします。想像です。)
daemonは、起動後も定期的に各サービスプロセスを監視し、プロセスが死んでいる場合にはを再起動をかけインスタンスを維持しようとします。さらに、daemonが死ぬと、その子プロセスであるサービスプロセス全てが死んでサービスが停止してしまいます。
ですので、daemonは重要な監視対象プロセスになります。
HANAインスタンスの中でのdaemonの生死は、nameserverが監視しトレースファイルに記録します。
nameserverを始めとするサービスプロセス群は、ブートシーケンスに於いては最下層のプロセスなので、他を起動したりすることはありません。
サービスプロセスはHANAの各種サービスを提供していますので全て監視する必要があります。HANA内部では、daemonが各プロセスの生死を監視しており、プロセスが死ぬと再起動をかけトレースファイルに記録します。また、nameserverと他のサービスプロセスとの間の通信の可否を監視しており、不通になると5分間のリトライ後やはりトレースファイルに障害の記録をします。
完璧な監視体制を築くことは不可能ですが、わかっている(または起こり得る)障害に対しては検知方法と最低限の対応を事前に検討する必要があります。
以下のデータは、HANAを更生する各プロセスに対してシグナルSIGKILL/SIGSTOPを送った時の反応、影響、検出方法、リカバリ方法を整理したものです。
SIGKILLはプロセスが死んだ時の想定であり、SIGSTOPはプロセスがストールした(つまり応答なしになった)時の想定です。ストールに関しては、SIGSTOPの送信だけでHANAのストールのケースを網羅できるものではありませんが、だんまり状態にどう対処するかの第一歩として参考にしてください。
プロセス名 | 観察事項/検討事項 | 説明 |
---|---|---|
sapstrtsrv | 受信時の動作 | プロセスが消失 |
インスタンスへの影響 | 特にサービスには影響無し。 インスタンス停止の時、HDB stopが失敗する > HDB stop hdbdaemon will wait maximal 300 seconds for NewDB services finishing. Stopping instance using: /usr/sap/HDB/SYS/exe/hdb/sapcontrol -prot NI_HTTP -nr 00 -function Stop 400 31.05.2016 04:28:27 Stop FAIL: NIECONN_REFUSED (Connection refused), NiRawConnect failed in plugin_fopen() | |
ログ出力 | 無し | |
監視の例 | ps –U <sid>adm | grep sapstartsrv | |
リカバリー方法 | インスタンス停止の際、savepoint実行後、HDB killコマンドで終了 |
sapstart | 受信時の動作 | プロセスが消失 |
インスタンスへの影響 | 特にサービスには影響無し。 HDB stopが機能しない(ノーレスポンス) | |
ログ出力 | 無し | |
監視の例 | ps –U <sid>adm | grep sapstart | |
リカバリー方法 | インスタンス停止の際、savepoint実行後、HDB killコマンドで終了 |
hdb.sap<sid>_HDBxx | 受信時の動作 | プロセスが消失 |
インスタンスへの影響 | 全てのサービスプロセスが消失し、インスタンスが停止 | |
ログ出力 | nameserver_alert<hostname>.trc、及びnameserver_<hostname>.3xx01.000.trcにメッセージが出力される hdbdaemon was terminated | |
監視の例 | トレースファイルから上記メッセージを検出する | |
リカバリー方法 | インスタンス再起動 |
hdbnameserver hdbindexserver hdbxsengine hdbwebdispatcher hdbcompileserver hdbpreprocessor | 受信時の動作 | プロセスが消失後、再起動 |
インスタンスへの影響 | プロセス再起動後、通常サービス | |
ログ出力 | daemon_<hostname>.3xx00.000.trcに消失したプロセスに関するメッセージが出力される "process hdbnameserver with pid xxxxx exited because it caught signal 9”
例. indexserver_mo-3b221850b.30003.000.trc ==== Starting hdbindexserver, version 1.00.120.00.1462275491 | |
監視の例 | 各サービスプロセスのトレースファイルから下記メッセージを検出する process <processname> with pid 99999 exited | |
リカバリー方法 | プロセスが自動的に再起動 |
プロセス名 | 監視方法 | リカバリ方法 |
---|---|---|
sapstatrsrv | http://host:5xx13, https://host:5xx14で接続を試みる STOP状態ならばレスポンスなし | システムシャットダウンの際、HDB TermまたはHDB kill |
sapstart | インスタンス停止でHDB stopを使用する STOP状態ならばレスポンスなし | |
hdb.sap<sid>_HDBxx | hdbsql -i 00 -n localhost:30000 -u system -p xxxxxxxで接続を試みる STOP状態ならばレスポンスなし 通常状態の時は以下のようなメッセージが出力されるため、無視する * -10709: Connection failed (RTE:[89006] System call 'recv' failed, rc=104:Connection reset by peer {127.0.0.1:30000} (localhost:30000)) | HDB stop/start または HDB restart |
hdbnamesever | hdbnsutil –pingNameserver --local | HANA Studio または、 kill -9でDaemonによる再起動を促す |
hdbindexserver | nameserver_hostname.3xx01.xxx.trcから左記メッセージを検出 [4045]{-1}[-1/-1] 2015-12-07 17:51:59.513445 e TrexNet Channel.cpp(00412) : active channel 72 from 39941 to x.x.x.x:99999 with method __nsWatchdog with id 7186 on host hana01 from process hdbnameserver with service port 3xx01, pid xxxx and tid xxxx from parent host and parent process with parent service port , parent pid 0 and parent tid 0: reading failed with timeout error; timeout=180000ms elapsed | |
hdbxsengine | ||
hdbwebdispatcher | ||
hdbcompileserver | ||
hdbpreprocessor |
実際にお客様の本番システムを監視する場合には、監視目的に合っているかを検討の上、十分にテストを行ってください。
以上