6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

OpenLDAPの同期が再開しない問題をkeepaliveの設定で回避する

6
Posted at

問題の現象

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コマンドにこっそり書いておくパターンがある事がわかったのは収穫でした。

6
5
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
6
5

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?