Dev Study
← Webを支えるソフトウェア
レッスン 4 / 13·約 7 分·第3期 Webを支えるソフトウェア

死活監視 — 壊れた実体を外す仕組み

リクエストがアプリケーションに届くまで
  1. ブラウザURL入力
  2. DNS名前→IP
  3. ルータ経路選択
  4. ロードバランサ振り分け今ここ
  5. Nginx受け口
  6. アプリ処理
  7. DB保存

第29週で配り先の選び方を見ました。今週は候補から壊れた実体をどう外すかです。

まず結論

無償版 nginx の死活監視は in-band(パッシブ)のみで、実リクエストの失敗を数えます。定期的に監視要求を送るアクティブ監視は商用版の機能です。

既定は「10秒の間に1回失敗したら、10秒間使わない」(配り先が2台以上のとき)。同じ fail_timeout が2つの意味を兼ねているのが理解の分かれ目です。

? 読む前に予測

「nginx はサーバへ定期的にヘルスチェック要求を送り、応答が無ければ配り先から外す」——無償版の nginx について、この説明は正しいでしょうか。

当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。

抽象原理

壊れた実体を候補から外す

第29週で、届いた1件をどの実体へ配るかを見ました。しかし配り先が壊れていたら、どんなに賢く選んでも失敗します。死活監視とは、候補から壊れた実体を外す仕組みです。

問題は「壊れている」をどう知るかです。専用の監視要求を定期的に送るか、実際のリクエストの失敗を数えるか。

具体実物

既定値が語っていること

パッシブ監視の設定は、server 行の2つのパラメータです。

nginx の upstream(下の行は既定値を明示的に書いたもの)設定ファイル
upstream backend {
server backend1.example.com;
server backend2.example.com max_fails=1 fail_timeout=10s;
}

公式によれば max_fails の既定は 1、fail_timeout は 10秒。つまり「10秒の間に1回失敗したら、10秒間そのサーバを使わない」。解説記事でよく見る max_fails=3 は nginx の既定ではありません。

ただし前提があります。公式は「グループにサーバが1台しかない場合、max_fails・fail_timeout・slow_start は無視され、そのサーバが利用不能とみなされることは無い」と書いています。外す・外さないは、配り先が2台以上あるときの話です。

✓ ここまでの確認

nginx の `fail_timeout` が意味しているものはどれですか。公式ドキュメントの記述に即して選んでください。

✓ ここまでの確認

nginx で「何を失敗とみなすか」を決めているのはどれですか。

⇄ 2つを見比べる
具体例 A

TCPの再送タイマ(第23週)

RFC 6298 が規定します。RTTを実測して RTO を算出し、経路の状態に自動追従します。失敗時はRTOを2倍にする指数バックオフがMUSTです。

値の出どころ表
規定 RFC 6298(標準)
算出 RTTの実測から動的に計算
失敗時 RTO を 2 倍(指数バックオフ)
具体例 B

LBの死活監視(今週)

規定する一次ソースはありません。静的な設定値で動き、人間がチューニングします。バックオフは無く、fail_timeout が過ぎればそのまま復帰を試します。

値の出どころ表
規定 無し(実装依存)
算出 静的な設定値。人間が決める
失敗時 バックオフなし。時間経過で復帰

TCPの再送タイマとLBの死活監視。どちらも「応答しない相手」を扱いますが、値の決まり方はどう違い、運用に何をもたらすでしょうか。

「誰がその値を決めたか」「状況が変わったとき追従するか」に注目してください。

この章のまとめ

  • 無償版 nginx の死活監視は in-band(パッシブ)のみ。専用の監視要求は送らない。
  • アクティブ監視(health_check)は商用版。公式が明記している。
  • 既定は max_fails=1 / fail_timeout=10秒。ただしサーバが1台だけのグループでは両方とも無視され、外されることは無い。
  • fail_timeout は2つの意味を兼ねる。 失敗を数える窓の長さと、切り離しておく時間。
  • 「何を失敗とみなすか」は max_fails では決まらない。 proxy_next_upstream 等が定義する。
  • TCPの再送(第23週)は規定があり動的、LBの死活監視は規定が無く静的。

自分の現場で確かめる

読んだだけでは身につきません。手元の環境で実際に見てみてください。

環境:

理解度チェック

読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。

問題 1 / 2正解: 0

nginx の `max_fails` と `fail_timeout` の既定値の組み合わせはどれですか。

用語集(4語)
in-band(パッシブ)監視
実際の要求を転送してみて失敗を数える方式。専用の監視要求は送らない。公式によれば nginx が含むのはこれ。
アクティブ監視(health_check)
定期的に監視専用の要求を送る方式。ngx_http_upstream_hc_module が提供し、公式が商用版と明記している。
max_fails
利用不能とみなすまでの失敗回数。既定は1。何を失敗とみなすかは proxy_next_upstream 等が定義する。
fail_timeout
既定10秒。失敗を数える窓の長さと、切り離しておく時間の2つを兼ねる。