インデックスの管理
インデックスの最適化による検索パフォーマンスの向上
概要
Red Hat Directory Server に関するフィードバックの提供 リンクのコピーリンクがクリップボードにコピーされました!
Red Hat のドキュメントおよび製品に関するご意見をお待ちしております。ドキュメントの改善点があればお知らせください。改善点を報告する場合は、以下のように行います。
Jira を通じて Red Hat Directory Server ドキュメントに関するフィードバックを送信する場合 (アカウントが必要):
- Red Hat Issue Tracker にアクセスしてください。
- Summary フィールドにわかりやすいタイトルを入力します。
- Description フィールドに、ドキュメントの改善に関するご意見を記入してください。ドキュメントの該当部分へのリンクも追加してください。
- ダイアログの下部にある Create をクリックします。
Jira を通じて Red Hat Directory Server 製品に関するフィードバックを送信する場合 (アカウントが必要):
- Red Hat Issue Tracker にアクセスしてください。
- Create Issue ページで、 をクリックします。
- Summary フィールドに入力します。
- Component フィールドでコンポーネントを選択します。
Description フィールドに以下の内容を入力します。
- 選択したコンポーネントのバージョン番号。
- 問題を再現するための手順、または改善のための提案。
- Create をクリックします。
第1章 新規に作成されたすべてのデータベースに適用されるデフォルトインデックスの定義 リンクのコピーリンクがクリップボードにコピーされました!
Directory Server のデフォルトのインデックスでは、インデックスを作成する属性のセットが定義されています。新しいデータベースを作成すると、Directory Server はデフォルトのインデックス属性を cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config エントリーからデータベース固有の cn=index,cn=database_name,cn=ldbm database,cn=plugins,cn=config エントリーにコピーします。
Directory Server は、デフォルトのインデックスの変更を既存のデータベースに適用しません。
1.1. インデックスの種類 リンクのコピーリンクがクリップボードにコピーされました!
Directory Server は、インデックス付きの各属性のインデックスを、インスタンスのデータベースディレクトリー内の個別のデータベースファイルに保存します。たとえば、sn 属性のインデックスは、/var/lib/dirsrv/slapd-instance_name/db/database_name/sn.db ファイルに格納されています。Directory Server が 1 つの属性に対して異なるインデックスを維持している場合、各インデックスファイルには複数のインデックスタイプを含めることができます。
Directory Server は以下のインデックスタイプをサポートしています。
-
存在インデックス (
pres) は、特定の属性を含むエントリーのリストです。たとえば、attribute=mailのようにクライアントが頻繁に検索を行う場合はこのタイプを使用します。 -
等価インデックス (
eq) により、特定の属性値を含むエントリーの検索が改善されます。たとえば、cn属性に等価インデックスを設定すると、cn=first_name last_nameの検索を高速に行うことができます。 -
近似インデックス (
approx) は、効率的な近似検索や音符のような検索を可能にします。たとえば、cn~=first_name last_name、cn~=first_name、またはcn~=first_nam(スペルに注意) は、cn=first_name X last_nameというエントリーが返されます。Directory Server の metaphone 表音アルゴリズムは US-ASCII 文字のみをサポートします。したがって、近似インデックスは、英語の値でのみ使用してください。 -
部分文字列インデックス (
sub) は、維持するためのコストがかかるインデックスですが、エントリー内の部分文字列に対して効率的な検索が可能になります。部分文字列のインデックスは、各エントリーの最小 3 文字に制限されます。たとえば、telephoneNumber=*555*と検索すると、telephoneNumber属性に555を含む値を持つディレクトリー内のすべてのエントリーが返されます。 - 国際インデックスは、国際ディレクトリー内の情報の検索を迅速化します。国際インデックスの作成プロセスは、通常のインデックスを作成するプロセスと似ています。ただし、オブジェクト識別子 (OID) をインデックス化する属性に関連付けることで一致するルールを適用する点が異なります。
1.2. インデックスのメリットとのバランス リンクのコピーリンクがクリップボードにコピーされました!
新しいインデックスを作成する前に、インデックスを維持することのメリットとコストのバランスを考えてみます。
- 近似インデックスは、通常、数字を含む属性 (電話番号など) には効率的ではありません。
- 部分文字列のインデックスはバイナリー属性では機能しません。
- イメージなど、大きな値を含む属性の等価インデックスは回避してください。
- 検索で一般的に使用されない属性のインデックスを維持すると、検索パフォーマンスを向上させることなくオーバーヘッドが増加します。
- インデックス化されていない属性は、検索要求で依然として使用できますが、検索のタイプによっては検索パフォーマンスが大幅に低下する可能性があります。
インデックスは、非常に時間がかかります。たとえば、Directory Server が追加操作を受け取った場合、Directory Server はインデックス属性を調べて、属性値に対してインデックスが維持されているかどうかを判断します。作成された属性値がインデックス化されている場合、Directory Server は新しい属性値をインデックスに追加し、その後、実際の属性値がエントリーに作成されます。
例1.1 ユーザーがエントリーを追加する際に Directory Server が行うインデックス作成手順
Directory Server が以下のインデックスを維持していると仮定します。
-
cnおよびsn属性の等値性、近似性、および部分文字列インデックス。 -
telephoneNumber属性の等価および部分文字列のインデックス。 -
description属性の部分文字列インデックス。
たとえば、ユーザーが次のようなエントリーを追加したとします。
ユーザーがエントリーを追加すると、Directory Server は以下のステップを実行します。
-
JohnおよびJohn Doeのcn等価インデックスエントリーを作成します。 -
JohnおよびJohn Doeの適切なcnの近似インデックスエントリーを作成します。 -
JohnおよびJohn Doeのcn部分文字列インデックスエントリーを作成します。 -
Doeのsn等価インデックスエントリーを作成します。 -
Doeに対するsn近似インデックスエントリーを作成します。 -
Doeのsn部分文字列インデックスエントリーを作成します。 -
408 555 8834のtelephoneNumber等価インデックスエントリーを作成します。 -
408 555 8834のtelephoneNumber部分文字列インデックスエントリーを作成します。 -
Manufacturing leadのdescription部分文字列インデックスエントリーを作成します。
この例は、大規模なディレクトリーのデータベースを作成および保守するために必要なアクションの数が、非常に多くのリソースを消費する可能性があることを示しています。
Directory Server のパフォーマンスに影響を与える可能性があるため、メンバーシップ属性 (member、uniquemember など) の部分文字列インデックスを定義しないでください。メンバーを追加または削除する場合 (たとえば、多数のメンバーを持つグループに uniquemember を追加する場合)、uniquemember の部分文字列インデックスの計算では、追加または削除された値だけでなく、すべての uniquemember 値を評価する必要があります。
1.3. デフォルトのインデックス属性 リンクのコピーリンクがクリップボードにコピーされました!
Directory Server は、デフォルトのインデックス属性を、cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config エントリーに格納します。インデックスタイプを含めて表示するには、次のように入力します。
ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -b "cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config" -s one -o ldif-wrap=no
# ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -b "cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config" -s one -o ldif-wrap=no
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表に記載されている属性 (システムインデックス) をデータベースのインデックスから削除すると、Directory Server のパフォーマンスに大きな影響を与える可能性があります。
1.4. デフォルトインデックスの維持 リンクのコピーリンクがクリップボードにコピーされました!
Directory Server は、デフォルトのインデックス属性を、cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config エントリーに格納します。なお、デフォルトのインデックス属性を維持できるのは、LDIF ステートメントを使用した場合のみです。
手順
たとえば、インデックスタイプが
eqとsubのデフォルトインデックスにroomNumber属性を追加するには、次のように入力します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 以下は、LDIF ステートメントの説明です。
-
objectClass: nsIndex: このエントリーがインデックスエントリーであることを定義します。 -
objectClass: top: このオブジェクトクラスは、インデックスエントリーで追加的に必要となります。 -
cn: インデックスに属性の名前を設定します。 -
nsSystemIndex: インデックスが Directory Server の運用に必須であるかどうかを示します。 -
nsIndexType: この多値属性は、インデックスタイプを指定します。
-
たとえば、
roomNumber属性のデフォルトのインデックス属性にpresインデックスタイプを追加するには、次のように入力します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow たとえば、
roomNumber属性のデフォルトのインデックス属性からpresインデックスタイプを削除するには、次のように入力します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow たとえば、デフォルトのインデックスから
roomNumber属性を削除するには、次のように入力します。ldapdelete -D "cn=Directory Manager" -W -H ldap://server.example.com -x cn=roomNumber,cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config
# ldapdelete -D "cn=Directory Manager" -W -H ldap://server.example.com -x cn=roomNumber,cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=configCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
デフォルトのインデックス属性をリスト表示して、変更を確認します。
ldapsearch -H ldap://server.example.com:389 -D "cn=Directory Manager" -W -b "cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config" -x -s one -o ldif-wrap=no
# ldapsearch -H ldap://server.example.com:389 -D "cn=Directory Manager" -W -b "cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config" -x -s one -o ldif-wrap=noCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第2章 特定のデータベースのインデックスを維持する リンクのコピーリンクがクリップボードにコピーされました!
Directory Server の各データベースには、それぞれインデックスがあります。インデックスの作成、更新、削除は、dsconf ユーティリティーや Web コンソールを使用して行うことができます。
2.1. インデックスの種類 リンクのコピーリンクがクリップボードにコピーされました!
Directory Server は、インデックス付きの各属性のインデックスを、インスタンスのデータベースディレクトリー内の個別のデータベースファイルに保存します。たとえば、sn 属性のインデックスは、/var/lib/dirsrv/slapd-instance_name/db/database_name/sn.db ファイルに格納されています。Directory Server が 1 つの属性に対して異なるインデックスを維持している場合、各インデックスファイルには複数のインデックスタイプを含めることができます。
Directory Server は以下のインデックスタイプをサポートしています。
-
存在インデックス (
pres) は、特定の属性を含むエントリーのリストです。たとえば、attribute=mailのようにクライアントが頻繁に検索を行う場合はこのタイプを使用します。 -
等価インデックス (
eq) により、特定の属性値を含むエントリーの検索が改善されます。たとえば、cn属性に等価インデックスを設定すると、cn=first_name last_nameの検索を高速に行うことができます。 -
近似インデックス (
approx) は、効率的な近似検索や音符のような検索を可能にします。たとえば、cn~=first_name last_name、cn~=first_name、またはcn~=first_nam(スペルに注意) は、cn=first_name X last_nameというエントリーが返されます。Directory Server の metaphone 表音アルゴリズムは US-ASCII 文字のみをサポートします。したがって、近似インデックスは、英語の値でのみ使用してください。 -
部分文字列インデックス (
sub) は、維持するためのコストがかかるインデックスですが、エントリー内の部分文字列に対して効率的な検索が可能になります。部分文字列のインデックスは、各エントリーの最小 3 文字に制限されます。たとえば、telephoneNumber=*555*と検索すると、telephoneNumber属性に555を含む値を持つディレクトリー内のすべてのエントリーが返されます。 - 国際インデックスは、国際ディレクトリー内の情報の検索を迅速化します。国際インデックスの作成プロセスは、通常のインデックスを作成するプロセスと似ています。ただし、オブジェクト識別子 (OID) をインデックス化する属性に関連付けることで一致するルールを適用する点が異なります。
2.2. インデックスのメリットとのバランス リンクのコピーリンクがクリップボードにコピーされました!
新しいインデックスを作成する前に、インデックスを維持することのメリットとコストのバランスを考えてみます。
- 近似インデックスは、通常、数字を含む属性 (電話番号など) には効率的ではありません。
- 部分文字列のインデックスはバイナリー属性では機能しません。
- イメージなど、大きな値を含む属性の等価インデックスは回避してください。
- 検索で一般的に使用されない属性のインデックスを維持すると、検索パフォーマンスを向上させることなくオーバーヘッドが増加します。
- インデックス化されていない属性は、検索要求で依然として使用できますが、検索のタイプによっては検索パフォーマンスが大幅に低下する可能性があります。
インデックスは、非常に時間がかかります。たとえば、Directory Server が追加操作を受け取った場合、Directory Server はインデックス属性を調べて、属性値に対してインデックスが維持されているかどうかを判断します。作成された属性値がインデックス化されている場合、Directory Server は新しい属性値をインデックスに追加し、その後、実際の属性値がエントリーに作成されます。
例2.1 ユーザーがエントリーを追加する際に Directory Server が行うインデックス作成手順
Directory Server が以下のインデックスを維持していると仮定します。
-
cnおよびsn属性の等値性、近似性、および部分文字列インデックス。 -
telephoneNumber属性の等価および部分文字列のインデックス。 -
description属性の部分文字列インデックス。
たとえば、ユーザーが次のようなエントリーを追加したとします。
ユーザーがエントリーを追加すると、Directory Server は以下のステップを実行します。
-
JohnおよびJohn Doeのcn等価インデックスエントリーを作成します。 -
JohnおよびJohn Doeの適切なcnの近似インデックスエントリーを作成します。 -
JohnおよびJohn Doeのcn部分文字列インデックスエントリーを作成します。 -
Doeのsn等価インデックスエントリーを作成します。 -
Doeに対するsn近似インデックスエントリーを作成します。 -
Doeのsn部分文字列インデックスエントリーを作成します。 -
408 555 8834のtelephoneNumber等価インデックスエントリーを作成します。 -
408 555 8834のtelephoneNumber部分文字列インデックスエントリーを作成します。 -
Manufacturing leadのdescription部分文字列インデックスエントリーを作成します。
この例は、大規模なディレクトリーのデータベースを作成および保守するために必要なアクションの数が、非常に多くのリソースを消費する可能性があることを示しています。
Directory Server のパフォーマンスに影響を与える可能性があるため、メンバーシップ属性 (member、uniquemember など) の部分文字列インデックスを定義しないでください。メンバーを追加または削除する場合 (たとえば、多数のメンバーを持つグループに uniquemember を追加する場合)、uniquemember の部分文字列インデックスの計算では、追加または削除された値だけでなく、すべての uniquemember 値を評価する必要があります。
2.3. デフォルトのインデックス属性 リンクのコピーリンクがクリップボードにコピーされました!
Directory Server は、デフォルトのインデックス属性を、cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config エントリーに格納します。インデックスタイプを含めて表示するには、次のように入力します。
ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -b "cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config" -s one -o ldif-wrap=no
# ldapsearch -D "cn=Directory Manager" -W -H ldap://server.example.com -b "cn=default indexes,cn=config,cn=ldbm database,cn=plugins,cn=config" -s one -o ldif-wrap=no
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
表に記載されている属性 (システムインデックス) をデータベースのインデックスから削除すると、Directory Server のパフォーマンスに大きな影響を与える可能性があります。
2.4. コマンドラインを使用した特定のデータベースのインデックスの維持 リンクのコピーリンクがクリップボードにコピーされました!
dsconf ユーティリティーを使用して、コマンドラインでインデックスの設定を維持することができます。
手順
たとえば、
userRootデータベースのインデックスにroomNumber属性を追加するには、インデックスタイプがeqとsubの場合、次のように入力します。dsconf -D "cn=Directory Manager" ldap://server.example.com backend index add --attr roomNumber --index-type eq --index-type sub --reindex userRoot
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend index add --attr roomNumber --index-type eq --index-type sub --reindex userRootCopy to Clipboard Copied! Toggle word wrap Toggle overflow --reindexオプションを付けると、Directory Server が自動的にデータベースのインデックスを再作成します。たとえば、
userRootデータベースのroomNumber属性のインデックス設定にpresインデックスタイプを追加するには、次のように入力します。dsconf -D "cn=Directory Manager" ldap://server.example.com backend index set --attr roomNumber --add-type pres userRoot
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend index set --attr roomNumber --add-type pres userRootCopy to Clipboard Copied! Toggle word wrap Toggle overflow たとえば、
userRootデータベースのroomNumber属性のインデックス設定からpresインデックスタイプを削除するには、次のように入力します。dsconf -D "cn=Directory Manager" ldap://server.example.com backend index set --attr roomNumber --del-type pres userRoot
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend index set --attr roomNumber --del-type pres userRootCopy to Clipboard Copied! Toggle word wrap Toggle overflow たとえば、
userRootデータベースのインデックスからroomNumber属性を削除するには、次のように入力します。dsconf -D "cn=Directory Manager" ldap://server.example.com backend index delete --attr roomNumber userRoot
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend index delete --attr roomNumber userRootCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
userRootデータベースのインデックス設定をリスト表示します。dsconf -D "cn=Directory Manager" ldap://server.example.com backend index list userRoot
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend index list userRootCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.5. インスタンスのオフライン時におけるインデックスの再作成 リンクのコピーリンクがクリップボードにコピーされました!
インスタンスのオフライン時に、dsctl db2index ユーティリティーを使用してデータベース全体のインデックスを再作成できます。
前提条件
-
インデックスエントリーを作成しているか、既存の
userRootデータベースに追加のインデックスタイプを追加している。
手順
インスタンスをシャットダウンします。
dsctl instance_name stop
# dsctl instance_name stopCopy to Clipboard Copied! Toggle word wrap Toggle overflow インデックスを再作成します。
データベース内のすべてのインデックスに対して、以下を実行します。
Copy to Clipboard Copied! Toggle word wrap Toggle overflow 特定の属性インデックスの場合は、以下を実行します。
dsctl instance_name db2index userRoot --attr aci cn givenname
# dsctl instance_name db2index userRoot --attr aci cn givennameCopy to Clipboard Copied! Toggle word wrap Toggle overflow 次のコマンドは、
aci、cn、およびgivenname属性のインデックスを再作成します。データベースが指定されていない場合、コマンドはすべての属性に対してインデックスを再作成することに注意してください。
dsctl(オフライン) コマンドの詳細は、次を実行してください。dsctl instance_name db2index --help
# dsctl instance_name db2index --helpCopy to Clipboard Copied! Toggle word wrap Toggle overflow
インスタンスを起動します。
dsctl instance_name start
# dsctl instance_name startCopy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
userRootデータベースのインデックス設定をリスト表示します。dsconf -D "cn=Directory Manager" ldap://server.example.com backend index list userRoot
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend index list userRootCopy to Clipboard Copied! Toggle word wrap Toggle overflow
2.6. Web コンソールを使用した特定のデータベースのインデックスの維持 リンクのコピーリンクがクリップボードにコピーされました!
Web コンソールを使用して、Directory Server のインデックス設定を維持することができます。
前提条件
- Web コンソールでインスタンスにログインしている。
手順
→ → → → に移動します。
インデックスに属性を追加するには、以下を行います。
- をクリックします。
-
Select An Attributeフィールドに属性名を入力します。 - インデックスタイプを選択します。
-
Index attribute after creationを選択します。 - をクリックします。
属性のインデックス設定を更新するには、以下を行います。
-
属性の横にあるオーバーフローメニューをクリックし、
Edit Indexを選択します。 - インデックスの設定を必要に応じて変更してください。
-
Index attribute after creationを選択します。 - をクリックします。
-
属性の横にあるオーバーフローメニューをクリックし、
インデックスから属性を削除するには、以下を行います。
-
属性の横にあるオーバーフローメニューをクリックし、
Delete Indexを選択します。 -
Yes, I am sureを選択して、 をクリックします。 -
メニューで
Reindex Suffixを選択します。
-
属性の横にあるオーバーフローメニューをクリックし、
検証
- → → → → に移動し、インデックスの設定に変更が反映されていることを確認します。
第3章 部分文字列インデックスでの検索キーの長さの変更 リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、部分文字列インデックスの検索キーの長さは 3 文字以上にする必要があります。たとえば、ディレクトリーサーバーは文字列 abc を検索キーとしてインデックスに追加しますが、ab* は追加しません。ただし、特に多くのワイルドカード文字を含む検索のパフォーマンスを向上させるために、検索キーの長さを短くすることができます。これにより、インデックス内の検索キーの数が増加します。
ディレクトリーサーバーには、検索キーに必要な最小文字数を変更する 3 つの属性があります。
-
nsSubStrBegin: 検索キーの先頭 (ワイルドカード文字の前) の最小文字数を設定します。以下に例を示します。
abc*
abc*
-
nsSubStrMiddle: 検索キーのワイルドカード文字間の最小文字数を設定します。以下に例を示します。
*abc*
*abc*
-
nsSubStrEnd: ワイルドカード文字の後の検索キーの末尾の文字数を設定します。以下に例を示します。
*xyz
*xyz
3.1. コマンドラインを使用して部分文字列インデックスの検索キーの長さを変更する リンクのコピーリンクがクリップボードにコピーされました!
属性インデックスに新しい検索キーの長さを設定することで、検索速度を向上させることができます。
手順
新しい検索キーの長さを設定するには、
extensibleObjectオブジェクトクラスを追加してから、nsSubStrBegin、nsSubStrEnd、またはnsSubStrMiddle属性をエントリーに追加します。以下に例を示します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow 新しい設定を適用するには、インデックスを再作成します。たとえば、Directory Server インスタンスの実行中に、次のコマンドを使用して、指定した属性のインデックスを再作成します。
dsconf <instance_name> backend index reindex --attr <attribute_name> <database_name>
# dsconf <instance_name> backend index reindex --attr <attribute_name> <database_name>Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
-
cnなど、検索キーの長さを変更する属性を選択します。 cnインデックスをダンプします。Berkeley Database (BDB)を使用するインスタンスで、以下のコマンドを実行します。
dbscan -D bdb -f /var/lib/dirsrv/slapd-<instance_name>/db/database/cn.db > /tmp/default_len
# dbscan -D bdb -f /var/lib/dirsrv/slapd-<instance_name>/db/database/cn.db > /tmp/default_lenCopy to Clipboard Copied! Toggle word wrap Toggle overflow LMDB (Lightning Memory-Mapped Database)を使用するインスタンスで、以下のコマンドを実行します。
dbscan -D mdb -f /var/lib/dirsrv/slapd-<instance_name>/db/database/cn.db > /tmp/default_len
# dbscan -D mdb -f /var/lib/dirsrv/slapd-<instance_name>/db/database/cn.db > /tmp/default_lenCopy to Clipboard Copied! Toggle word wrap Toggle overflow
- セクションコマンドラインを使用して部分文字列インデックスの検索キーの長さを変更する の説明に従って、新しい検索キーの長さを設定します。
インスタンスを停止して、ディスク上のデータベースを同期します。
dsctl <instance_name> stop
# dsctl <instance_name> stopCopy to Clipboard Copied! Toggle word wrap Toggle overflow cnインデックスをダンプします。Berkeley Database (BDB)を使用するインスタンスで、以下のコマンドを実行します。
dbscan -D bdb -f /var/lib/dirsrv/slapd-<instance_name>/db/database/cn.db > /tmp/len_2
# dbscan -D bdb -f /var/lib/dirsrv/slapd-<instance_name>/db/database/cn.db > /tmp/len_2Copy to Clipboard Copied! Toggle word wrap Toggle overflow LMDB (Lightning Memory-Mapped Database)を使用するインスタンスで、以下のコマンドを実行します。
dbscan -D mdb -f /var/lib/dirsrv/slapd-<instance_name>/db/database/cn.db > /tmp/len_2
# dbscan -D mdb -f /var/lib/dirsrv/slapd-<instance_name>/db/database/cn.db > /tmp/len_2Copy to Clipboard Copied! Toggle word wrap Toggle overflow
len_2とdefault_lenファイルを比較します。diff /tmp/len_2 /tmp/default_len
# diff /tmp/len_2 /tmp/default_lenCopy to Clipboard Copied! Toggle word wrap Toggle overflow
第4章 仮想リストビューコントロールを使用して、大規模な検索結果の連続したサブセットを要求する リンクのコピーリンクがクリップボードにコピーされました!
Directory Server は、LDAP 仮想リストビューコントロールをサポートしています。この制御により、LDAP クライアントは大規模な検索結果の連続したサブセットを要求できます。
たとえば、Directory Server に 100.000 エントリーのアドレス帳を保存したとします。デフォルトでは、すべてのエントリーのクエリーはすべてのエントリーを一度に返します。これはリソースと時間のかかる操作であり、ユーザーが結果をスクロールすると一部のセットしか表示されないため、クライアントはデータセット全体を必要としないことがよくあります。
ただし、クライアントが VLV コントロールを使用する場合、サーバーはサブセットのみを返します。たとえば、ユーザーがクライアントアプリケーションでスクロールすると、サーバーはさらに多くのエントリーを返します。これにより、サーバーの負荷が軽減され、クライアントはすべてのデータを一度に保存して処理する必要がなくなります。
すべての検索パラメーターが固定されている場合、VLV はサーバーでソートされた検索のパフォーマンスも向上させます。Directory Server は、VLV インデックス内の検索結果を事前に計算します。したがって、VLV インデックスは、結果を取得してから後で並べ替えるよりもはるかに効率的です。
Directory Server では、VLV コントロールは常に利用可能です。ただし、大きなディレクトリーで使用する場合は、ブラウジングインデックスとも呼ばれる VLV インデックスを使用すると、速度が大幅に向上します。
Directory Server は、標準インデックスなどの属性の VLV インデックスを維持しません。サーバーは、エントリーに設定された属性とディレクトリーツリー内のそれらのエントリーの場所に基づいて、VLV インデックスを動的に生成します。標準エントリーとは異なり、VLV エントリーはデータベース内の特別なエントリーです。
4.1. ldapsearch コマンドでの VLV コントロールの動作 リンクのコピーリンクがクリップボードにコピーされました!
通常、LDAP クライアントアプリケーションでは仮想リストビュー (VLV) 機能を使用します。ただし、たとえばテスト目的で、ldapsearch ユーティリティーを使用して部分的な結果のみを要求できます。
ldapsearch コマンドで VLV 機能を使用するには、sss (サーバー側の並べ替え) と vlv 検索拡張機能の両方に -E オプションを指定します。
ldapsearch ... -E 'sss=attribute_list' -E 'vlv=query_options'
# ldapsearch ... -E 'sss=attribute_list' -E 'vlv=query_options'
sss 検索拡張機能の構文は次のとおりです。
[!]sss=[-]<attr[:OID]>[/[-]<attr[:OID]>...]
[!]sss=[-]<attr[:OID]>[/[-]<attr[:OID]>...]
vlv 検索拡張機能の構文は次のとおりです。
[!]vlv=<before>/<after>(/<offset>/<count>|:<value>)
[!]vlv=<before>/<after>(/<offset>/<count>|:<value>)
-
beforeは、対象のエントリーの前に返されるエントリーの数を設定します。 -
afterは、対象のエントリーの後に返されるエントリーの数を設定します。 -
index、count、およびvalueは、ターゲットエントリーの決定に役立ちます。valueを設定すると、ターゲットエントリーは、その値で始まる最初の並べ替え属性を持つ最初のエントリーになります。それ以外の場合は、countを0に設定し、ターゲットエントリーはindex値 (1 から開始) によって決定されます。count値が0より大きい場合、ターゲットエントリーはindex * number of entries / countによって決定されます。
例4.1 VLV 検索拡張機能を使用した ldapsearch コマンドの出力
次のコマンドは、ou=People,dc=example,dc=com を検索します。次に、サーバーは結果を cn 属性でソートし、70 番目のエントリーの uid 属性を、オフセットの前の 1 つのエントリーと後の 2 つのエントリーとともに返します。
4.2. 認証されていないユーザーが VLV コントロールを使用できるようにする リンクのコピーリンクがクリップボードにコピーされました!
デフォルトでは、oid=2.16.840.1.113730.3.4.9,cn=features,cn=config エントリーのアクセス制御命令 (ACI) により、認証されたユーザーのみが VLV コントロールを使用できるようになります。認証されていないユーザーも VLV コントロールを使用できるようにするには、userdn = "ldap:///all" を userdn = "ldap:///anyone" に変更して ACI を更新します。
手順
oid=2.16.840.1.113730.3.4.9,cn=features,cn=configの ACI を更新します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow
検証
バインドユーザーを指定せずに、VLV コントロールでクエリーを実行します。
ldapsearch -H ldap://server.example.com -b "ou=People,dc=example,dc=com" -s one -x -E 'sss=cn' -E 'vlv=1/2/70/0' uid
# ldapsearch -H ldap://server.example.com -b "ou=People,dc=example,dc=com" -s one -x -E 'sss=cn' -E 'vlv=1/2/70/0' uidCopy to Clipboard Copied! Toggle word wrap Toggle overflow このコマンドでは、サーバーが匿名バインドを許可する必要があります。
コマンドが成功してもエントリーが返されない場合は、バインドユーザーを使用してクエリーを再度実行し、認証の使用時にクエリーが機能することを確認します。
4.3. コマンドラインを使用して VLV インデックスを作成し、VLV クエリーの速度を向上させる リンクのコピーリンクがクリップボードにコピーされました!
この手順に従って、mail 属性を含み、objectClass 属性が person に設定されている ou=People,dc=example,dc=com 内のエントリーに対して、ブラウジングインデックスとも呼ばれる仮想リストビュー (VLV) インデックスを作成します。
前提条件
- クライアントアプリケーションは VLV コントロールを使用している。
- クライアントアプリケーションでは、大規模な検索結果の連続したサブセットに対してクエリーを実行する必要がある。
- ディレクトリーには多数のエントリーが含まれている。
手順
VLV 検索エントリーを作成します。
dsconf -D "cn=Directory Manager" ldap://server.example.com backend vlv-index add-search --name "VLV People" --search-base "ou=People,dc=example,dc=com" --search-filter "(&(objectClass=person)(mail=*))" --search-scope 2 userRoot
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend vlv-index add-search --name "VLV People" --search-base "ou=People,dc=example,dc=com" --search-filter "(&(objectClass=person)(mail=*))" --search-scope 2 userRootCopy to Clipboard Copied! Toggle word wrap Toggle overflow コマンドは、以下のオプションを使用します。
-
--nameは検索エントリーの名前を設定します。これは任意の名前にすることができます。 -
--search-baseは、VLV インデックスのベース DN を設定します。Directory Server は、このエントリーに VLV インデックスを作成します。 -
--search-scopeは、VLV インデックス内のエントリーに対して実行する検索の範囲を設定します。このオプションは、0(ベース検索)、1(1 レベル検索)、または2(サブツリー検索) に設定できます。 -
--search-filterは、ディレクトリーサーバーが VLV インデックスを作成するときに適用するフィルターを設定します。このフィルターに一致するエントリーのみがインデックスの一部になります。 -
userRootは、エントリーを作成するデータベースの名前です。
-
インデックスエントリーを作成します。
dsconf -D "cn=Directory Manager" ldap://server.example.com backend vlv-index add-index --index-name "VLV People - cn sn" --parent-name "VLV People" --sort "cn sn" --index-it userRoot
# dsconf -D "cn=Directory Manager" ldap://server.example.com backend vlv-index add-index --index-name "VLV People - cn sn" --parent-name "VLV People" --sort "cn sn" --index-it userRootCopy to Clipboard Copied! Toggle word wrap Toggle overflow コマンドは、以下のオプションを使用します。
-
--index-nameは、インデックスエントリーの名前を設定します。これは任意の名前にすることができます。 -
--parent-nameは、VLV 検索エントリーの名前を設定し、前の手順で設定した名前と一致する必要があります。 -
--sortは属性名とソート順序を設定します。属性をスペースで区切ります。 -
--index-itは、エントリーの作成後に、ディレクトリーサーバーがインデックスタスクを自動的に開始します。 -
userRootは、エントリーを作成するデータベースの名前です。
-
検証
/var/log/dirsrv/slapd-instance_name/errorsファイルで VLV インデックスが正常に作成されたことを確認します。[26/Nov/2021:11:32:59.001988040 +0100] - INFO - bdb_db2index - userroot: Indexing VLV: VLV People - cn sn [26/Nov/2021:11:32:59.507092414 +0100] - INFO - bdb_db2index - userroot: Indexed 1000 entries (2%). ... [26/Nov/2021:11:33:21.450916820 +0100] - INFO - bdb_db2index - userroot: Indexed 40000 entries (98%). [26/Nov/2021:11:33:21.671564324 +0100] - INFO - bdb_db2index - userroot: Finished indexing.
[26/Nov/2021:11:32:59.001988040 +0100] - INFO - bdb_db2index - userroot: Indexing VLV: VLV People - cn sn [26/Nov/2021:11:32:59.507092414 +0100] - INFO - bdb_db2index - userroot: Indexed 1000 entries (2%). ... [26/Nov/2021:11:33:21.450916820 +0100] - INFO - bdb_db2index - userroot: Indexed 40000 entries (98%). [26/Nov/2021:11:33:21.671564324 +0100] - INFO - bdb_db2index - userroot: Finished indexing.Copy to Clipboard Copied! Toggle word wrap Toggle overflow ldapsearchコマンドで VLV コントロールを使用して、ディレクトリーから特定のレコードのみを照会します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、
ou=People,dc=example,dc=com にuid=user001から少なくともuid=user072まで連続して名前が付けられたエントリーがあることを前提としています。
4.4. Web コンソールを使用して VLV インデックスを作成し、VLV クエリーの速度を向上させる リンクのコピーリンクがクリップボードにコピーされました!
この手順に従って、mail 属性を含み、objectClass 属性が person に設定されている ou=People,dc=example,dc=com 内のエントリーに対して、ブラウジングインデックスとも呼ばれる仮想リストビュー (VLV) インデックスを作成します。
前提条件
- Web コンソールでインスタンスにログインしている。
- クライアントアプリケーションは VLV コントロールを使用している。
- クライアントアプリケーションでは、大規模な検索結果の連続したサブセットに対してクエリーを実行する必要がある。
- ディレクトリーには多数のエントリーが含まれている。
手順
- → → → に移動します。
をクリックして、フィールドに入力します。
-
VLV Index Name: 検索エントリーの名前です。これは任意の名前にすることができます。 -
Search base: VLV インデックスのベース DN です。Directory Server は、このエントリーに VLV インデックスを作成します。 -
Search Filter: ディレクトリーサーバーが VLV インデックスを作成するときに適用されるフィルターです。このフィルターに一致するエントリーのみがインデックスの一部になります。 -
Search Scope: VLV インデックス内のエントリーに対して実行する検索の範囲です。
-
- をクリックします。
- をクリックします。
属性名を入力し、
Reindex After Savingを選択します。- をクリックします。
検証
→ → に移動し、VLV インデックスが正常に作成されたことを確認します。
[26/Nov/2021:11:32:59.001988040 +0100] - INFO - bdb_db2index - userroot: Indexing VLV: VLV People - cn sn [26/Nov/2021:11:32:59.507092414 +0100] - INFO - bdb_db2index - userroot: Indexed 1000 entries (2%). ... [26/Nov/2021:11:33:21.450916820 +0100] - INFO - bdb_db2index - userroot: Indexed 40000 entries (98%). [26/Nov/2021:11:33:21.671564324 +0100] - INFO - bdb_db2index - userroot: Finished indexing.
[26/Nov/2021:11:32:59.001988040 +0100] - INFO - bdb_db2index - userroot: Indexing VLV: VLV People - cn sn [26/Nov/2021:11:32:59.507092414 +0100] - INFO - bdb_db2index - userroot: Indexed 1000 entries (2%). ... [26/Nov/2021:11:33:21.450916820 +0100] - INFO - bdb_db2index - userroot: Indexed 40000 entries (98%). [26/Nov/2021:11:33:21.671564324 +0100] - INFO - bdb_db2index - userroot: Finished indexing.Copy to Clipboard Copied! Toggle word wrap Toggle overflow ldapsearchコマンドで VLV コントロールを使用して、ディレクトリーから特定のレコードのみを照会します。Copy to Clipboard Copied! Toggle word wrap Toggle overflow この例では、
ou=People,dc=example,dc=com にuid=user001から少なくともuid=user072まで連続して名前が付けられたエントリーがあることを前提としています。