keepalivedのnb_get_retryの動きが不思議な#2

の続き。

今回は keepalived 1.1.17 で試してみたす。

ヘルスチェック (HTTP_GETの場合) のループ間隔に関係ありそうな設定項目はこの3つ。

  • virtual_server group
    • delay_loop (delay timer for service polling)
  • real_server HTTP_GET
    • nb_get_retry (number of get retry)
    • delay_before_retry (delay before retry)

コードレベルじゃなくて実験観察結果ですけど、まとめるとこんな感じ:

┌─────────┐
│                  ↓
│              delay_loop
│                  ↓
│                CHECK (最大connect_timeout)
│      Enable      ↓      Disable
│      <成功>───┴───<失敗>
│        ↓                  │
│ delay_before_retry         │
│        ↓                  ↓
└────┴─────────┘

文章で書くと:

  • 当該リアルサーバがアップしているときのループ間隔は delay_loop + delay_before_retry 秒になる
  • 当該リアルサーバがダウンしているときのループ間隔は delay_loop 秒になる
    • ただし、リアルサーバが即座にエラーを返すのではなく、ブロックして応答を返さない場合は、ループ間隔は connect_timeout + delay_loop 秒になる
  • ヘルスチェックに成功/失敗したら即座に IPVS の割り当てに復帰/除外される
  • よって、ヘルスチェックが失敗してから IPVS の割り当てから外れるまでには最大で connect_timeout + delay_before_retry + delay_loop 秒かかる
    • ヘルスチェック用URLが非200を返すようにして、IPVSの割り当てから外してから安全に httpd の restart を行うような運用の場合、非200を即座に返すならば connect_timeout は勘定せずに、非200を返すように指示してから delay_before_retry + delay_loop 秒待てば IPVS の割り当てから外されていることが期待できる、ということになる。

落とし穴:

  • delay_before_retryは名前と違って失敗時のretryじゃなくて成功時のループ間隔時間に影響する
  • nb_get_retry はどんな値を設定しても影響しないぽい?