OpenLDAPのindex
こんにちは。秋からミラクルに引っ越してきましたanaitoです。
今日は、OpenLDAPのチューニングについて書きたいと思います。まずは基本的なところからということでindexについて設定して行きたいと思います。(そもそもそんなに迷うほど設定項目は多く無いのですけどね)
OpenLDAPも最近ではMTA連携だったりSamba連携だったりと情報が溢れており導入ハードルも下がっているのではないでしょうか?しかし、自宅サーバにありがちな人の設定をコピ&ペーストではいざという時に困ったりするのでキチンと理解しつつindexを設定出来るように順に説明して行きたいと思います。
まずはログをファイルに出力するようにしましょう。標準出力に出してもいいのですが出力も多いのでファイルの方が追いやすいでしょう。
OpenLDAPはdefaultはファシリティlocal4を使いますので/etc/syslog.confに以下を追加します。
local4.* /var/log/ldap.log
※一応丁寧にファイルを作成して再起動
# touch /var/log/ldap.log; chown ldap:ldap /var/log/ldap.log
# service syslog restart
次にslapdのloglevelを設定します。/etc/openldap/slapd.confにloglevelディレクティブを追加します。デフォルトは256ですが「検索フィルタ処理」の32も出力させたいので
loglevel 288
とします。余談ですがパフォーマンスを考えた場合、最終的にはloglevel 0(ゼロ)とした方が良いですね。ログが出力されないので一番速いです。注意としてはコメントアウトはダメです。defaultの256が生きてしまいます。例えファイル出力しなくても負荷がありますので必ず明示的に指定して下さい。(あくまでパフォーマンス第一に考えた場合です。ログがなければ当然困ることもありますよん)
# service ldap restart
あとは自分が使いたいサービスを動かしてみてログからindex対象を拾います。
例えば
# ldapsearch -x -b "dc=example,dc=com"
あたりだと以下のようなログが出力されます。(※バックエンドDBによって違いがあります)
slapd[2416]: conn=0 op=1 SRCH base="dc=example,dc=com" scope=2 deref=0 filter="(objectClass=*)"
slapd[2416]: AND
slapd[2416]: DN SUBTREE
slapd[2416]: OR
slapd[2416]: EQUALITY
slapd[2416]: PRESENT
slapd[2416]: => test_filter
slapd[2416]: PRESENT
slapd[2416]: <= test_filter 6
- snip -
slapd[2416]: conn=0 op=1 SEARCH RESULT tag=101 err=0 nentries=18 text=
K&Rやった人にはなつかしいポーランド記法です。
そうするとアスタリスクを用いたフィルタはPRESENT(存在)で検索している事が分かります。その前のEQUALITYは暗黙的に(ObjectClass=NULL)のfilterが入っているため出力されています。(この辺りまでログ出力させるにはloglevel -1でどうぞ)つまり
(dc=example,dc=comのサブツリー検索) AND { (ObjectClass=NULL) OR (ObjectClass=*)}
ということで導き出されるindexは
index objectClass pres,eq
ということになります。
次はauthconfigコマンドでユーザ認証にldapを追加するとsuなんかした時にこんなのが出てきます。
slapd[2416]: conn=2 op=1 SRCH base="dc=example,dc=com" scope=2 deref=0 filter="(&(objectClass=posixAccount)(uid=root))"
slapd[2416]: AND
slapd[2416]: DN SUBTREE
slapd[2416]: OR
slapd[2416]: EQUALITY
slapd[2416]: AND
slapd[2416]: EQUALITY
slapd[2416]: EQUALITY
slapd[2416]: conn=2 op=1 SEARCH RESULT tag=101 err=0 nentries=0 text=
この場合、ORの後のEQUALITYは前回と同様でプラスその後ろということで
index objectClass, uid eq
となります。
さらに、ThunderbirdのLDAPアドレス帳を使った場合を見てみましょう。
slapd[2344]: conn=5 op=1 SRCH base="ou=users,dc=example,dc=com" scope=2 deref=0 filter="(|(mail=*test*)(cn=*test*)(givenName=*test*)(sn=*test*))"
slapd[2344]: AND
slapd[2344]: DN SUBTREE
slapd[2344]: OR
slapd[2344]: EQUALITY
slapd[2344]: OR
slapd[2344]: SUBSTRINGS
slapd[2344]: SUBSTRINGS
slapd[2344]: SUBSTRINGS
slapd[2344]: SUBSTRINGS
slapd[2344]: => test_filter
slapd[2344]: OR
slapd[2344]: => test_filter_or
slapd[2344]: => test_filter
slapd[2344]: SUBSTRINGS
slapd[2344]: begin test_substrings_filter
slapd[2344]: end test_substrings_filter 1
slapd[2344]: <= test_filter 5
slapd[2344]: => test_filter
- snip -
slapd[2344]: conn=5 op=1 SEARCH RESULT tag=101 err=0 nentries=1 text=
メールアドレスをtestで検索した場合4つの属性でSUBSTRINGS(部分文字列)検索をしていることがわかります。
この場合のindexは
index mail, cn, givenName, surname sub
index objectClass eq
ということになります。
主立った3パターンを試してみましたが如何でしょうか?イメージ出来ましたでしょうか?
最後に・・・
パフォーマンスを考えれば使わないindexは張らない方が良いでしょう。indexは参照には有効ですが更新には足かせとなります。特にSUBSTRINGSはindexが大きくなりますので気をつけて下さい。あとは
index objectClass eq
は指定した方が良いでしょうね。次はチューニング結果を試すためのツールなんかを紹介出来ればいいと思っています。



















最近のコメント