SAP HANA 運用管理の基礎」の4回目、プロセスの構成と監視です。

HANAインスタンスはnameserver、indexserver、その他プロセスで構成されます。また、ダイナミックティアリングやスマートストリームプロセッシングなどのオプションは、多くの場合独立したプロセスとして実装されています。

今回は、この内、基本インストール(BASE EditionでXSA以外を全部インストールの場合)で起動されるプロセスに絞って、プロセスの役割や監視方法について考えてみたいと思います。

SAP HANA.png

HANAインスタンスを構成するプロセス

基本インストールで利用可能なサービスプロセスとその役割は以下のようになります。

尚、名称は、SAP HANA Administration Guideに則り、プロセス名(サーバーコンポーネント名、サービス名)と記述し、文中では原則サービス名を使いますが

、必要に応じてプロセス名(=OSプロセス名)を使っています。

プロセス名(サーバーコンポーネント名、サービス名)

役割
hdbindexserver(Index server, indexserver)

データベースプロセスの本体

  • SQLポートにSQLインターフェースを提供
  • テーブルなどのDBオブジェクトを管理
  • SQLクエリーを処理
hdbnameserver (Name Server, nameserver)
  • HANAトポロジーを管理する
  • スケールアウト構成の管理
  • マルチテナントデータベースの管理
  • バックアップの管理
hdbxsengine(XS Classic Server, xsengine)

データベースカーネルと統合された開発プラットホーム

  • サーバーサイドJavaScript
  • Odataサービス、XMLA
  • SAPUI5によるインターフェース(HTML5)開発
  • アプリケーション定義
hdbwebdispatcher(Web Dispatcher, webdisptcher)
  • httpリクエストの受付、ルーティング
hdbcompileserver(Compile Server, compileserver)
  • ストアドプロシージャのコンパイルのプロセスの内、特定のステップを実行する
hdbpreprocessor(Preprocessor, preprocessor)
  • テキストサーチ/テキスト分析非構造化データの処理
  • フルテキストインデックスの作成
  •   Tokenization, Normalization, Stemming, Extraction
hdbstatisticsserver(Statistics Server, staticsserver)
  • 統計情報サービス(SPS07index server , Name serverに統合)
hdbscriptserver(Script Server, scriptserver)

Application Function Library関連のサービスで必要(オプション)

  • Pridoctive Application Library, Business Function Library, etc


上記サービスプロセスの他に以下のようなスタートアップ用プロセスがあります。

プロセス名(サーバーコンポーネント名、サービス名) 役割
sapstartsrv(Sap Start Service, sapstartsrv) SAP HANAインスタンスの起動・停止
sapstart(-, sapstart) SAP HANAインスタンスの起動・停止

hdb.sap<SID>_HDB<xx>(Daemon, daemon)

<SID>=英数字3桁のシステムID、<xx>=数字2桁のインスタンス番号

サービスプロセスの起動・停止・監視

  • Ÿhdbdaemon.iniで制御可能



XSAやその他のオプションによるプロセスについては、SAP HANA Administration Guideを参照ください


実行中のプロセス

一般的に、管理者が現在稼働中のプロセスを見るには、HANA StudioのSystem Console>Landscapeを使うことが多いと思われます。

赤い枠の部分がサービス名ですが、マルチテナントデータベース環境、ダイナミックティアリング(拡張ストレージ)環境、スケールアウト環境などでは、同じ名前のサービス名が複数表示されることもあるため、常にHost、Portと併せて読む必要があります。

/wp-content/uploads/2016/06/studio_lamdscape_969144.png

サービス名は、SYS.M_SERVICESから得ることもできます。

/wp-content/uploads/2016/06/m_services_969145.png


プロセスのブートシーケンス

運用管理者の方は、実行中のプロセスを確認するためにHDB infoコマンドの出力を多用することが多いかもしれません。

Screenshot 2016-05-24 13.16.26.png

こちらはLinuxのpsコマンドの出力を編集しているようです。従って、サービス名ではなくプロセス名が表示されています。

このHDB infoの出力はよく見ると、ある程度Unix/Linuxを知った人にとって気持ち悪い部分というかしっくりこない部分がいくつかあります。

分かりやすくするためにプロセスID(PID)、親プロセスID(PPID)、プロセス名から呼び出しの順番をチャート化してみました。

/wp-content/uploads/2016/06/proc_boot_flow_969236.png

左端はLinuxのinitプロセスです。気持ち悪い部分というのは、initに続くsapstartsrv、sapstart、hdb.sapHDB_HDB00が何をしているのか、なぜサービスプロセスを直接呼び出さないのか、なぜsapstartsrvは孤立しているのか、がわからないという点です。

すでに前出の表で説明している通り、sapstartsrv、sapstart、daemon(hdb.sapHDB_HDB00)はスタートアップ用プロセスですが、プロセスの起動シーケンスを理解することはプロセスの監視上重要ですので、このHDB infoの出力例で説明することにします。

sapstartsrvとsapstartの関係

HDB stopコマンドでインスタンスをシャットダウンするとわかるのですが、上記チャート内のプロセスの中で唯一の常駐プロセスがsapstartsrvです。

Screenshot 2016-06-07 17.09.12.png

ということは、sapstartsrvには何かの役目があるはずで、それがHANAインスタンスの起動・停止になります。実際にはsapstartを起動します。この時、sapstartはデーモンとして起動されるため親プロセスはinitとなります。(これは、デーモン化のためによく使われるdouble forkというコーディングらしい。)

つまり、起動順序としては、

/wp-content/uploads/2016/06/start_seq_a_969387.png

なのですが、プロセスの親子関係は、

/wp-content/uploads/2016/06/start_seq_b_969388.png

となり、この事が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は実行後にプロセスは消滅し常駐プロセスにはなりません。)

/wp-content/uploads/2016/06/start_seq_to_daemon_971131.png

daemon

次に、daemon(hdb.sapHDB_HDB00)です。このプロセスは何をやっているのでしょうか?

答えは、後続の各プロセスの起動、停止、監視です。ブートシーケンスの中で、daemonは4つのプロセスグループを順番に起動します。最初が、nameserver、2番目がcompileserverとpreprocessor、3番目がindexserverとxsengine、最後がwebdispatcherです。

/wp-content/uploads/2016/06/start_seq_fro_daemon_971146.png

(何となくですが、全体を管理するプロセス→DBがなくて起動が早いプロセス→DBありのプロセス→ネットワークリスナー、というようなポリシーがあって、それぞれのプロセスにまとめてシグナルを送るためにこのようなグループ構成にしてるような気がします。想像です。


daemonは、起動後も定期的に各サービスプロセスを監視し、プロセスが死んでいる場合にはを再起動をかけインスタンスを維持しようとします。さらに、daemonが死ぬと、その子プロセスであるサービスプロセス全てが死んでサービスが停止してしまいます。

ですので、daemonは重要な監視対象プロセスになります。

HANAインスタンスの中でのdaemonの生死は、nameserverが監視しトレースファイルに記録します。


サービスプロセス(nameserver, indexserver, etc )

nameserverを始めとするサービスプロセス群は、ブートシーケンスに於いては最下層のプロセスなので、他を起動したりすることはありません。

サービスプロセスはHANAの各種サービスを提供していますので全て監視する必要があります。HANA内部では、daemonが各プロセスの生死を監視しており、プロセスが死ぬと再起動をかけトレースファイルに記録します。また、nameserverと他のサービスプロセスとの間の通信の可否を監視しており、不通になると5分間のリトライ後やはりトレースファイルに障害の記録をします。


SIGKILL/SIGSTOP時の反応と検出方法

完璧な監視体制を築くことは不可能ですが、わかっている(または起こり得る)障害に対しては検知方法と最低限の対応を事前に検討する必要があります。

以下のデータは、HANAを更生する各プロセスに対してシグナルSIGKILL/SIGSTOPを送った時の反応、影響、検出方法、リカバリ方法を整理したものです。

SIGKILLはプロセスが死んだ時の想定であり、SIGSTOPはプロセスがストールした(つまり応答なしになった)時の想定です。ストールに関しては、SIGSTOPの送信だけでHANAのストールのケースを網羅できるものではありませんが、だんまり状態にどう対処するかの第一歩として参考にしてください。



SIGKILL送信時の結果

プロセス名

観察事項/検討事項

説明

sapstrtsrv
(<
sid>admオーナー)

受信時の動作

プロセスが消失

インスタンスへの影響

特にサービスには影響無し。

インスタンス停止の時、HDB stopが失敗する

> HDB stop

hdbdaemon will wait maximal 300 seconds for NewDB services finishing.

Stopping instance using: /usr/sap/HDB/SYS/exe/hdb/sapcontrolprot 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”


消失プロセスのトレースファイル
<servicename>_<hostname>.3xxvv.000.trc メッセージが出力される

例.

indexserver_mo-3b221850b.30003.000.trc

==== Starting hdbindexserver, version 1.00.120.00.1462275491

監視の例

各サービスプロセスのトレースファイルから下記メッセージを検出する

process <processname> with pid 99999 exited

リカバリー方法

プロセスが自動的に再起動

SIGSTOP送信時の結果

プロセス名

監視方法

リカバリ方法

sapstatrsrv
(<sid>adm)

http://host:5xx13, https://host:5xx14で接続を試みる

STOP状態ならばレスポンスなし

システムシャットダウンの際、HDB TermまたはHDB kill

sapstart

インスタンス停止でHDB stopを使用する

STOP状態ならばレスポンスなし

hdb.sap<sid>_HDBxx

hdbsqli 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

hdbnsutilpingNameserver –local
STOP状態ならばレスポンスなし

HANA Studio
Administration Console >
landscapeで該当するサービスプロセスstopまたはkill

または、

kill -9Daemonによる再起動を促す

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

実際にお客様の本番システムを監視する場合には、監視目的に合っているかを検討の上、十分にテストを行ってください。

以上

To report this post you need to login first.

Be the first to leave a comment

You must be Logged on to comment or reply to a post.

Leave a Reply