16. 代理キャッシュエンジン
LDAP サーバは典型的に DIT の1つ以上のサブツリーを保持します。複製(またはシャドウ)サーバは、1つ以上のマスタサーバが保持するエントリのシャドウコピーを保持します。変更はマスタサーバから複製(スレーブ)サーバへ LDAP 同期または slurpd(8) を用いて伝播されます。 LDAP キャッシュは特殊な複製であり、サブツリーの代わりに検索フィルタに該当するエントリを保持します。
16.1. 概要
slapd の代理キャッシュ拡張は ldap バックエンドと meta バックエンドの応答を改善するよう設計されています。検索要求(問合せ)の処理では、まずキャッシュされている検索フィルタに含まれているかを判定します。含まれている要求の場合には、代理キャッシュのローカルデータベースから応答します。その他の要求は基盤の ldap バックエンドあるいは meta バックエンドに渡され、普通どおりに処理されます。
たとえば (shoesize>=9) は (shoesize>=8) に含まれ、(sn=Richardson) は (sn=Richards*) に含まれます。
問合せの格納のための条件式の比較には正しい照合規則と属性構文を使います。問合せの格納についての問題を単純化するために、サーバの設定においてキャッシュ可能「テンプレート」を指定します。問合せがテンプレートのどれかに属している場合にのみキャッシュあるいは応答が行われます。キャッシュされた問合せに該当するエントリは代理キャッシュのローカルデータベースに格納され、関連するメタ情報(フィルタ、スコープ、ベース、属性)は主メモリに格納されます。
テンプレートは、LDAP 検索要求を生成するためのプロトタイプです。テンプレートは、プロトタイプ検索フィルタとテンプレートから生成された問合せで必要となる属性のリストから成ります。プロトタイプフィルタの表記法は RFC 2254 と同じですが、条件式中の値は省略します。たとえばプロトタイプフィルタは (sn=),(&(sn=)(givenname=)) はそれぞれ (sn=Doe) と (&(sn=Doe)(givenname=John)) によって実体化されます。
キャシュ置換ポリシは LRU (Least Recently Used) 問合せとその問合せに属するエントリを除去します。問合せは存続最大時間(maximum time to live:TTL)だけキャッシュに残れるようにすることで、弱一貫性(weak consistency)を実現しています。バックグラウンドのタスクは定期的にキャッシュの検査を行い、問合せの失効とその除去を行います。
代理キャッシュの論文 (http://www.openldap.org/pub/kapurva/proxycaching.pdf) には設計と実装の詳細についての情報を載せています。
16.2. 代理キャッシュの設定
以下に記述するキャッシュの設定に関するディレクティブは、サーバの slapd.conf(5) ファイルの overlay proxycache ディレクティブの後にある "database meta" あるいは database ldap セクションの中になければなりません。
16.2.1. キャッシュパラメータの指定
proxyCache <DB> <maxentries> <nattrsets> <entrylimit> <period>
このディレクティブは代理キャッシュを有効にし、一般的なキャッシュパラメータを指定します。パラメータ <DB> はキャッシュしたエントリを保持するために使う基盤のデータベースを指定します。これに指定できるのは bdb, hdb, ldbm のいずれかです。パラメータ <maxentries> はキャッシュに保持できるエントリの最大数を指定します。パアメータ <nattrsets> は属性セット(proxyAttrSet ディレクティブで指定)の最大数を指定します。パラメータ <entrylimit> は、キャッシュする問合せにおけるエントリの最大数を指定します。パラメータ <period> は一貫性検査の間隔を指定します(秒単位)。この検査において、期限切れの TTL を持つ問合せは削除されます。
16.2.2. 属性セットの定義
proxyAttrset <index> <attrs...>
属性セットをインデックスに関連づけます。属性セットのそれぞれは、 0 から <numattrsets>-1 までのインデックス番号に関連づけられます。これらのインデックスは proxyTemplate ディレクティブでキャッシュ可能テンプレートを定義するために利用されます。
16.2.3. キャッシュ可能テンプレートの指定
proxyTemplate <prototype_string> <attrset_index> <TTL>
キャッシュ可能テンプレートと、テンプレートに属する問合せの "time to live" (秒単位) <TTL> を指定します。テンプレートの記述は、プロトタイプフィルタ文字列と <attrset_index> で識別される要求属性セットから成ります。
16.2.4. 設定例
ldap.example.com にある "dc=example,dc=com" の代理となるキャッシュサーバの slapd.conf(5) データベースセクションの例を以下に示します。
database ldap suffix "dc=example,dc=com" rootdn "dc=example,dc=com" uri ldap://ldap.example.com/dc=example%2cdc=com overlay proxycache proxycache bdb 100000 1 1000 100 proxyAttrset 0 mail postaladdress telephonenumber proxyTemplate (sn=) 0 3600 proxyTemplate (&(sn=)(givenName=)) 0 3600 proxyTemplate (&(departmentNumber=)(secretary=*)) 0 3600 cachesize 20 directory ./testrun/db.2.a index objectClass eq index cn,sn,uid,mail pres,eq,sub
16.2.4.1. キャッシュ可能な問合せ
LDAP 検索の問合せは、フィルタが "proxyTemplate" ディレクティブに定義したテンプレートのいずれかに一致し、該当する属性セットに指定した属性だけを参照する場合にキャシュ可能となります。先の設定例で、属性セット番号 0 は、その後の proxyTemplate について属性 mail postaladdress telephonenumber だけがキャッシュ可能であることを定義しています。
16.2.4.2. 設定例:
フィルタ: (&(sn=Richard*)(givenName=jack)) 属性: mail telephoneNumber
この問合せはキャッシュ可能です。テンプレート (&(sn=)(givenName=)) に一致しており、属性が proxyAttrset 0 に含まれています。
フィルタ: (&(sn=Richard*)(telephoneNumber)) 属性: givenName
この問合せはキャッシュできません。テンプレートに一致しませんし、属性が givenName はキャッシュしないことになっています。
Filter: (|(sn=Richard*)(givenName=jack)) Attrs: mail telephoneNumber
この問合せはキャッシュできません。テンプレートに一致しません (論理積 "&" ではなく論理和 "|" になっています)。