初LVS
インフラチームのお手伝いで、LVS(Linux Virtual Server)絡みで発生している(と思われる)現象を調査してました。LVSはかなり前から気になっていたので絶好の機会とばかりに。
DSRの癖を把握するのに結構手間取りました。久しぶりにtcpdump祭りです。
現象が発生していたのは本番環境なので実験しづらいなぁ、と思い、気兼ねなく実験できる環境を探していたら、DSAS開発者の部屋:パソコン1台ではじめるロードバランサ体験でVMWare Player用の環境を配布しているのを発見。めちゃめちゃ助かりました。KLab! KLab!
VMWare Playerもすばらしすぎ。
で、問題を切り分けていったら、結局以下のような挙動にぶち当たった。
Internet │ ┌──┴─┐A.A.A.A 宛に入ってきたリクエストは B.B.B.B へ │lvs(DSR)│ └──┬─┘ │ ┌──┴─┐ │ web │B.B.B.B └────┘
上記の図は極端に単純化していますが…
通常、外からA.A.A.A宛に飛んできたリクエストをB.B.B.BにDSRで捌いている環境で、とある機能によりB.B.B.BからA.A.A.Aにリクエストが飛ぶ場合、Synに対するAckが返ってこず、パケットが破棄されている様子。
Lvsからすると、パケットの送信元(B.B.B.B)と送信先(B.B.B.B)が同一になるから破棄してるのかなぁ、とか思いつつ、sysctlのnet系の設定をゴニョゴニョやっても改善せず。
今回は、ネットワーク構成的にとっても簡単な回避策があったのでそれを提案して一先ず様子見。
でも、気になるなぁ。コード見てみようかなぁ。