問題の現象
OpenLDAPの障害試験を行っていて、ネットワークが切断されたとき、
TCPコネクションが残ってしまうことで、同期リトライが行われない現象があった。
ネットワークの落ちる頻度が高くなければ、さほど問題にはならないのですが。
拠点間でVPNを張っていて、細いおかげでよく切れるとか・・・。
そういうことも考えられなくはないので、回避策を備忘として残しておきたいと思います。
OpenLDAPの同期方法
OpenLDAPにはいくつか同期の方法がありますが、
今回想定しているのは「refreshAndPersist」という同期方法をとっている場合のお話になります。
refreshAndPersist はTCPコネクションを維持して、
プロバイダからコンシューマへ更新情報を即時通知する同期方法です。
回避策
keepalive設定の書式は以下のとおりです。
syncrepl ディレクティブの中に書く設定になっています。
keepalive <idle>:<probes>:<interval>
idle ・・・無操作だと判断するまでの時間(秒)
probes ・・・再送回数 keepaliveパケットが届かなかった時の再送
interval・・・keepaliveパケットが届かず、再送するまでの間隔(秒)
syncrepl rid=001
provider=ldap://10.0.0.200:389
type=refreshAndPersist
retry="60 +"
keepalive 30:1:3
searchbase="dc=example,dc=com"
bindmethod=simple
binddn="cn=Manager,dc=example,dc=com"
credentials=secret
設定例では、
idle・・・・・・ 30秒間 エントリ操作がなかったら keepaliveパケットを送信する
probe・・・・・・ keepaliveパケットが到達しなかった場合、1回再送する
interval・・・ keepaliveパケットが到達しなかった場合、再送するまでの間隔を3秒あける
解説
OpenLDAPの同期設定中にkeepaliveの設定を書くと
何も操作していないとき、keepaliveパケットを送って接続が維持されているか確認できる
keepaliveパケットが到達しなかった場合、再送する
届かなくなったことがわかった時点でTCP接続を切ってくれるので、
TCPコネクションが残ったままの状況に陥らずにすむ
まとめ
OpenLDAPの同期設定で使うkeepaliveの設定は、
ネット上の情報にはほとんど設定されていなかったため、
発見するのに大変苦労した。
発見したきっかけはslapd.conf の man でした。
よく知らないプロダクトの設定を書くとき、マニュアルの確認は必須ですが、
公式マニュアルには同期設定の例にも書いていなかったために完全に見落としていました。
manコマンドにこっそり書いておくパターンがある事がわかったのは収穫でした。