catch-img

JP1 / IM3 のフェイルオーバー障害を徹底解剖!

こんにちは 

Hitachi JP1 / IM3(通称 IM3)を本番環境で運用していると、突然 「データベースが起動しない」 という痛ましい障害が頻発していました。

同僚と何度も議論し、テストを繰り返した結果、いくつかの「落とし穴」を発見。

今回の記事では、「なぜ起きたのか」、「どうやって確かめたのか」、そして 「どうすれば防げるのか」 を、ご紹介します。

この記事の対象者

JP1/IM3JP1/AJS を運用中のシステム管理者

・クラスタ構成でのフェイルオーバーに不安がある方

・「障害の根本原因を突き止めてから対策したい」方

1.現行システムの構成(ざっくり全体像)

項目

内容

サービス

JP1 /IM3(監視・ジョブ管理)

DBエンジン

PostgreSQLIM2まではHiRDB

クラスタ

CLUSTERPRO X 5.1がミラーディスク(Sync)でブロック単位ミラーリング

構成ホスト

正常系 JP1#1IM3 + AJS3)と待機系 JP1#2(同上)

ディスク

1 本のミラーディスクに PostgreSQLHiRDBDB ファイル・WAL(トランザクションログ)を格納

フェイルオーバー手段

1. clpdiskagent.exe/clpnm.exeの強制停止

2. jbs_service.exeの強制停止

3. EC2 コンソールからインスタンス停止(OS シャットダウン相当)

監視エージェント

JP1/IM‑Agent(物理/論理)でメトリック・イベントを取得、統合オペレーションビューアに可視化

課題

- DB ファイル・WAL がミラーディスクで不整合になると起動不能

- 待機系の論理IP が名前解決できず Agent が起動できない

図やイラストは省略。イメージは「正系と待機系が同じミラーディスクを共有」だと捉えておけば OK

2.想定原因(なぜが分かった瞬間)

現象

想定原因

① DB ファイル破損

→ IM3 が起動できない

ミラーディスクの ブロック単位ミラー が原因で、障害時に副系のDBファイルが不整合。

PostgreSQLcheckpoint recordを探せず起動失敗(XX000PANIC: could not locate a valid checkpoint record

② WAL(トランザクションログ)破損

起動はできてもデータがズレる

同上のミラリング不整合でWALが壊れ、復旧時に手作業が必要

③ PID/postmaster.pid 残留

次回起動で「プロセスが残っている」エラー

クラスタ障害時にプロセスが強制終了され、PIDファイルが削除されないまま残ってしまう

名前解決・ルーティング不整合

待機系 Agent Manager に接続できない

論理IPの優先順位がOSIP ソート順とずれ、待機系にバインドできず

メモリ枯渇

→ java.lang.OutOfMemoryError: Java heap space が出る

jddmain-Xmx 設定が実メモリに対して小さすぎる

ポイント

JP1 のサポートからは「クラスタ構成でもフェイルオーバーは保証しない」旨の回答がありました。つまり、設計上のリスク が根底にあるということです。

3.検証・再現テスト(実際にやってみたこと)

テストシナリオの全容

手順

何をしたか

期待結果

フェイルオーバー手段の確認

clpdiskagent.exe, clpnm.exe, jbs_service.exe をそれぞれ 強制終了

障害が起きてもリソースが自動で復帰し、IM3が継続稼働

データ負荷シナリオ

低負荷 50 mtr/ × 1

高負荷 10,000 mtr/ × 1

高負荷+長期蓄積 10,000 mtr/ × 5

データ量が増えてもDBが正常に起動し続けるか

イベント登録負荷

1 秒あたり100件以上のJP1イベントを流す

イベント処理が遅延しないか

トランザクションログ破損シミュ

DBを 短時間連続で強制停止(実施しないと判断)

Invalid primary checkpoint record が出て起動失敗が再現できるか

JP1製品併用テスト

AJS3PFM も同時に起動し、フェイルオーバー時に衝突しないか

全製品が問題なくフェイルオーバー

環境差分チェック

本番と同一の EC2r6i.xlargeWindows Server 2022)を使用

環境差異が結果に影響しないことを保証

主な結果

項目

再現可否

コメント

トランザクションログ破損

(再現できず)

本番で見た「チェックポイント欠損」までは再現できなかったが、WALの不整合は確認できた

PIDpostmaster.pid 残留

手順通りに止めると残り、手動削除が必要になることが判明

メモリ枯渇

-Xmxが足りないとOutOfMemoryErrorが出ることを再現

名前解決失敗

論理IPが待機系にバインドできず、Agentが起動しないケースを再現

フェイルオーバー成功率

(設定変更前は失敗多数

タイムアウト設定を緩和すると成功率が上がった


4. 対策案(どうやって防ぐか

 設定チューニング&仕様変更

内容

目的

予防効果

PostgreSQLの起動待ち時間60  120秒へ拡張

起動遅延に対応

起動失敗が減少

CLUSTERPROのタイムアウト60  6秒へ短縮

障害検知を早める

フェイルオーバーが速くなる

PostgreSQLWAL同期モードをAsyncへ変更(またはミラー対象外)

ミラーディスク不整合を回避

トランザクションログ破損リスク低減

注意:WAL の同期を外すと耐障害性が下がるので、運用要件と相談が必須

 DB エンジンを HiRDB に置換

メリット:HiRDBはミラーディスクでの不整合が起きにくいと実績あり

デメリット:移行工数が大きい、アプリ側の互換性確認が必要

 IM3をシングル構成+AMIリストア

  1. IM3を単体サーバ に切り替える(待機系はAJSのみ)
  2. 障害時は AMIから即時リストア → 復旧作業が自動化
  3. 復元ポイントは「週末のスナップショット」データロス最小化

メリット

デメリット

復旧手順が統一化、作業時間短縮

復元に時間がかかる(DB再セットアップが必要)

待機系AJSに影響なし

週次スナップショット以外のデータは失われる可能性あり

 自動化スクリプト

  • PID/postmaster.pid残留検知自動削除
  • DB起動失敗時にバックアップから自動リストア
  • 手順書のバッチ化 → 人的ミス削減

ポイント:スクリプトの保守が必要。誤削除を防ぐため、テスト環境で要検証。

 ネットワーク設定の見直し

  • 静的ルート・セキュリティグループ・DNS を最適化し、論理IP の優先順位を制御
  • SkipAsSource フラグで論理IP がバインド対象になるよう調整

効果

実装コスト

待機系 Agent が正しく Manager に接続できる

AWS のネットワークチームと調整が必要

5. 結論(総括)

項目

内容

根本原因

CLUSTERPROのブロック単位ミラー が PostgreSQLDBファイル・WAL を不整合にしやすく、フェイルオーバー時に起動失敗(checkpoint記録が見つからない)

再現性

本番と同様の環境で トランザクションログ破損は再現できなかった が、ミラーディスク不整合は確認済み

短期的対策

- 起動待ち時間・タイムアウト緩和

- PID/postmaster.pidの自動削除スクリプト

- ネットワーク(IPバインド)設定の調整

長期的対策

シングル化+AMIリストアで復旧作業を簡素化

- HiRDBDBエンジン変更かミラリング方式変更をJP1 サポートへ要望

次のステップ

1.設定チューニングを本番環境に適用し、効果を観測

2.自動化スクリプトを作成し、手順書を標準化

3.シングル構成・ネットワーク見直しを段階的に実装

4.将来的にDBエンジン移行を検討(サポートと協議)

PR

こちらの発言は全て個人的意見です。内容につきましては、十分注意し投稿しておりますが、誤りがあれば直接ご指導頂けますとありがたいです。

CNS Tech Blog Beyond|CNS シイエヌエス - BEYOND THE RIGHT ANSWER.: 株式会社シイエヌエス

▶ お問い合わせフォームはこちら:

https://reg34.smp.ne.jp/regist/is?SMPFORM=ofte-lerand-a156f4b7d094ddf7db06c166e8de81dd

ページトップへ戻る