ヘルスチェック機能の方針⚓︎
目的・背景⚓︎
ヘルスチェックの目的は、ロードバランサー(以下、 LB と記載する)がシステムの稼働状況を監視することです。 ヘルスチェック機能の実装により以下を期待できます。
-
負荷分散
各サーバーがリクエスト受付可能かどうかを確認の上、リクエストを複数のサーバーに割り振ることで負荷分散を行います。 これによりレスポンスの低下を防ぎ、サービスを継続的かつ効率的に運用できます。
-
可用性向上
ヘルスチェック機能によりサーバーやアプリケーションの稼働状況を監視することで、異常を検知できます。 サーバーの異常を検知した際、正常なサーバーに自動的に動作を引き継ぐことで、システムの運用停止を防ぎます。
基本方針⚓︎
LB が行うヘルスチェックは、使用するプロトコルレイヤーの違いによって以下のように分類できます。
| プロトコルレイヤー | 詳細 |
|---|---|
| Layer 3 | ネットワーク層で動作を監視します。 ICMP echo リクエストを送信し、 echo リプライが帰ってくるかどうかを確認します。 |
| Layer 4 | トランスポート層で動作を監視します。 TCP のハンドシェイクを行い、サーバーの動作を確認します。 |
| Layer 7 | アプリケーション層で動作を監視します。 HTTP リクエストから、サーバーの HTTP レスポンスの確認により動作を確認します。 |
Layer 3 や Layer 4 で行うヘルスチェックは、作成した Web アプリケーションの稼働状況まで確認できません。 AlesInfiny Maia では、監視対象のサーバーやアプリケーション、関連するデータベースなどのサービスを包含し、システムとしての正常性を Layer 7 で監視する方針とします。
レスポンス形式⚓︎
ヘルスチェックを確認する HTTP レスポンスとして、サーバーの正常値と異常値を表すステータスコードとレスポンスボディを定義します。
-
ステータスコード
AlesInfiny Maia では正常値を 200 、異常値を 503 で統一します。
-
レスポンスボディ
レスポンスボディの内容は、頻繁な状態監視による通信量の増加に対応するため、簡潔な形に固定する必要があります。 従って、サーバーの動作状態を表す内容のみをレスポンスボディとします。
ヘルスチェック機能の 2 種類のプローブ⚓︎
ヘルスチェック機能を実装する際、以下に示すいずれかの要素を確認することで正常に動作しているとみなすことができます。
-
活動性
アプリがクラッシュしていたり、再起動の必要性が発生したりしていないこと。
-
対応性
アプリが正常に動作していて、かつリクエストを受信する準備ができていること。
これら 2 つの要素を満たすため、 AlesInfiny Maia のサンプルアプリケーションでは活動性と対応性の状態をユーザーに渡す 2 種類のプローブを定義します。 詳細については 実装方針 に示します。
実装方針⚓︎
Spring Boot を用いた Web アプリケーションでは、 Spring Boot Actuator を利用することで比較適容易にヘルスチェック機能を実装可能です。 Spring Boot Actuator はアプリケーションレベルでサーバーを監視、管理する追加機能を提供するモジュールです。
AlesInfiny Maia ではこのモジュールを利用してヘルスチェック用のエンドポイントを作成することを推奨しています。 設定内容の詳細に関しては、サンプルアプリケーション内のプレゼンテーション層の application.properties を参照してください。
AlesInfiny Maia のサンプルアプリケーションでは、前節 で述べた通り活動性と対応性をそれぞれ満たす 2 つのプローブを実装しており、 以下のアドレスでヘルスチェックの状態を確認できます。
-
活動性のプローブ(http://localhost:8080/api/health/check)
アプリが正常に動作していることを確認するためのプローブ。
-
対応性のプローブ(http://localhost:8080/api/health/datasource)
データベースの正常動作によって、リクエストを受信する準備ができていることを確認するためのプローブ。
本ドキュメントにおける ヘルスチェックのレスポンス形式 に基づき、アクセスしたアドレスからの HTTP レスポンスは以下のように定義します。これにより、簡潔な形でサーバーの状態を把握できます。
| ステータス | ステータスコード | レスポンスボディ | 詳細 |
|---|---|---|---|
| UP | 200 | { "status": "UP"} | サーバーが正常に起動している |
| DOWN | 503 | { "status": "DOWN"} | サーバーが異常を起こし停止している |
| OUT_OF_SERVICE | 503 | { "status": "OUT_OF_SERVICE"} | サーバーが意図的にシャットダウンしている |
| UNKNOWN | 200 | { "status": "UNKNOWN"} | サーバーが定義していないステータスである |