- ブラウザURL入力
- DNS名前→IP
- ルータ経路選択
- ロードバランサ振り分け今ここ
- Nginx受け口
- アプリ処理
- DB保存
第29週で配り先の選び方を見ました。今週は候補から壊れた実体をどう外すかです。
まず結論
無償版 nginx の死活監視は in-band(パッシブ)のみで、実リクエストの失敗を数えます。定期的に監視要求を送るアクティブ監視は商用版の機能です。
既定は「10秒の間に1回失敗したら、10秒間使わない」(配り先が2台以上のとき)。同じ fail_timeout が2つの意味を兼ねているのが理解の分かれ目です。
「nginx はサーバへ定期的にヘルスチェック要求を送り、応答が無ければ配り先から外す」——無償版の nginx について、この説明は正しいでしょうか。
当てることが目的ではありません。外した予測ほど記憶に残るので、直感で選んでください。
壊れた実体を候補から外す
第29週で、届いた1件をどの実体へ配るかを見ました。しかし配り先が壊れていたら、どんなに賢く選んでも失敗します。死活監視とは、候補から壊れた実体を外す仕組みです。
問題は「壊れている」をどう知るかです。専用の監視要求を定期的に送るか、実際のリクエストの失敗を数えるか。
既定値が語っていること
パッシブ監視の設定は、server 行の2つのパラメータです。
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 で「何を失敗とみなすか」を決めているのはどれですか。
TCPの再送タイマ(第23週)
RFC 6298 が規定します。RTTを実測して RTO を算出し、経路の状態に自動追従します。失敗時はRTOを2倍にする指数バックオフがMUSTです。
規定 RFC 6298(標準)算出 RTTの実測から動的に計算失敗時 RTO を 2 倍(指数バックオフ)
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の死活監視は規定が無く静的。
自分の現場で確かめる
読んだだけでは身につきません。手元の環境で実際に見てみてください。
理解度チェック
読んだ直後は「分かった」と感じやすいものです。実際に解いて確かめてください。
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つを兼ねる。