7.4. 一意の数値属性値の割り当ておよび管理

エントリー属性によっては、uidNumbergidNumber などの一意の番号が必要です。Directory Server は、DNA (Distributed Numeric Assignment) プラグインを使用して、指定された属性に一意の番号を自動的に生成して提供できます。
注記
属性の一意性 は、DNA プラグインで維持されるとは限りません。プラグインは、オーバーランディングの範囲のみを割り当てますが、管理属性に手動で割り当てる数字を許可し、手動で割り当てられた数字が一意であることを検証せず、必要とされません。
一意の数字を割り当てる問題は、数字の生成ではなく、レプリケーションの競合を回避することで問題となります。DNA プラグインは、単一 のバックエンド全体に一意の番号を割り当てます。マルチプライヤーレプリケーションの場合、各プライヤーがローカル DNA プラグインインスタンスを実行しているときに、各インスタンスが真に一意の番号セットを使用していることを確認する方法が必要です。これは、割り当てる各サーバーに異なる 範囲 を割り当てることで行われます。

7.4.1. 動的番号の割り当ての概要

サーバーの DNA プラグインは、そのインスタンスが発行することのできる利用可能な数字の範囲を割り当てます。範囲の定義は非常にシンプルで、サーバーの次に利用可能な番号 (範囲の下限) と最大値 (範囲の最後) の 2 つの属性で設定されます。初期の下限範囲は、プラグインインスタンスを設定する際に設定されます。その後、下部の値はプラグインによって更新されます。利用可能な数を各レプリカの複数の範囲に分割することで、サーバーはすべて、互いに重複することなく、継続的に番号を割り当てることができます。

7.4.1.2. 範囲および割り当て番号

Directory Server が属性値の生成を処理する方法は複数あります。
  • 最も単純なケースでは、属性がない場合に、unique-number 属性を必要とするオブジェクトクラスを持つディレクトリーにユーザーエントリーが追加されます。管理属性に値を持たないエントリーを追加すると、DNA プラグインによる値の割り当てが発生します。このオプションは、一意の値を 1 つの属性に割り当てるように DNA プラグインが設定されている場合に限り機能します。
  • 同様の管理可能なオプションは、マジック番号 を使用することです。このマジックナンバーは、マネージド属性のテンプレート値であり、サーバーの範囲外のもの、数字、または単語でさえあり、プラグインは新しい割り当て値に置き換える必要があると認識します。マジック値でエントリーが追加され、エントリーが設定された DNA プラグインの範囲およびフィルター内にある場合は、プラグインでマジック番号を使用した新しい値の生成が自動的に発生します。下の例では、ldapmodify の使用に基づいて、0 をマジックナンバーとして追加します。
    dn: uid=jsmith,ou=people,dc=example,dc=com
     changetype: add
     objectClass: top
     objectClass: person
     objectClass: posixAccount
     uid: jsmith
     cn: John Smith
     uidNumber: 0
     gidNumber: 0
     ....
    DNA プラグインは、新規の一意の値のみを生成します。DNA プラグインが制御する属性に特定の値を使用するためにエントリーを追加または変更した場合には、指定した番号が使用されます。DNA プラグインは、その番号を上書きしません。

7.4.1.3. 同じ範囲の複数の属性

DNA プラグインは、1 つの属性タイプに、または 1 つの範囲の一意の番号から複数の属性タイプに一意の番号を割り当てることができます。
これにより、属性に一意の数字を割り当てるためのオプションが複数提供されます。
  • 一意の番号の 1 つの範囲から、1 つの属性タイプに割り当てられた 1 つの番号。
  • 1 つのエントリーの 2 つの属性に割り当てられた同じ一意の番号。
  • 2 つの異なる属性は、同じ範囲の一意の数字から 2 つの異なる数字を割り当てていました。
多くの場合は、属性タイプごとに一意の番号を割り当てるだけで十分です。新しい従業員エントリーに employeeID を割り当てる際には、各従業員エントリーに一意の employeeID が割り当てられます。
ただし、同じ範囲の数字から複数の属性に一意の番号を割り当てることが役に立つ場合もあります。たとえば、uidNumbergidNumberposixAccount エントリーに割り当てると、DNA プラグインは同じ数を両方の属性に割り当てます。これを行うには、マジック値を指定して、両方の管理属性を変更操作に渡します。ldapmodify の使用:
#  ldapmodify -D "cn=Directory Manager" -W -x

dn: uid=jsmith,ou=people,dc=example,dc=com
changetype: modify
add: uidNumber
uidNumber: 0
-
add:gidNumber
gidNumber: 0
DNA プラグインで複数の属性を処理する場合は、オブジェクトクラスが 1 つしか許可されない場合、プラグインはこれらの属性の 1 つにのみ一意の値を割り当てることができます。たとえば、posixGroup オブジェクトクラスは uidNumber 属性を許可しませんが、gidNumber を許可します。DNA プラグインが uidNumbergidNumber の両方を管理する場合は、posixGroup エントリーが作成されると、gidNumber の一意の番号が uidNumber および gidNumber 属性と同じ範囲から割り当てられます。プラグインが管理するすべての属性に同じプールを使用すると、一意の数字の割り当てを維持し、異なるエントリーの uidNumbergidNumber が異なる範囲から割り当てられ、同じ 一意 の番号になる状況を防ぐことができます。
複数の属性が DNA プラグインで処理される場合は、1 つの変更操作のエントリーで指定の管理属性のすべてに同じ値が割り当てられます。同じ範囲から の数字を割り当てるには、別の変更操作を実施する必要があります。以下の例では、ldapmodify を使用してこれを行います。
# ldapmodify -D "cn=Directory Manager" -W -x
dn: uid=jsmith,ou=people,dc=example,dc=com
changetype: modify
add: uidNumber
uidNumber: 0
^D

# ldapmodify -D "cn=Directory Manager" -W -x
dn: uid=jsmith,ou=people,dc=example,dc=com
changetype: modify
add: employeeId
employeeId: magic
重要
DNA プラグインが一意の数字を複数の属性に割り当てるように設定する場合は、一意の番号を必要とする各属性にマジック値を指定する必要があります。1 つの属性に一意の番号を提供するように DNA プラグインが設定されている場合には、これは必須ではありませんが、複数の属性に必要です。エントリーが範囲に対して定義された各タイプの属性を許可しない場合や、さらに重要なことに、定義されたすべての属性タイプをエントリーが許可しますが、属性のサブセットのみが一意の値を必要とする場合があります。

例7.6 DNA および一意の銀行口座番号

銀行の例では、顧客の primaryAccount 属性および customerID 属性に同じ一意の番号を使用します。銀行の例の管理者は、DNA プラグインが同じ範囲から両方の属性に一意の値を割り当てるよう設定していました。
また、銀行では、顧客 ID とプライマリーの口座番号と同じ範囲のセカンダリー口座に番号を割り当てますが、これらの数字をプライマリーの口座番号と同じにすることはできません。銀行の例の管理者は、DNA プラグインも secondaryAccount 属性を管理するように設定しますが、エントリーの作成、secondaryAccount 属性および primaryAccount 属性の割り当ての にのみ customerID 属性を追加します。これにより、primaryAccount および customerID は、同じ一意の番号を共有し、secondaryAccount 番号は完全に一意ですが、それでも同じ範囲の番号からのものです。

7.4.2. DNA プラグイン構文の確認

DNA プラグイン自体は、パスワードストレージスキームプラグインと同様のコンテナーエントリーです。DNA プラグインエントリーの下にある各 DNA エントリーは、DNA プラグインの新しい管理範囲を定義します。
DNA プラグインの新しい管理範囲を設定するには、コンテナーエントリーの下にエントリーを作成します。
最も基本的な設定は、1 台のサーバーで分散数値の割り当てを設定することです。つまり、その範囲はサーバー間で共有されず、転送されません。基本的な DNA 設定エントリーでは、以下の 4 つの項目を定義します。
  • 値が管理される属性で、dnaType 属性に設定されます。
  • dnaScope 属性に設定される、エントリーを検索するためのベースとして使用するエントリー DN
  • dnaFilter 属性に設定される、管理するエントリーの特定に使用する検索フィルター
  • dnaNextValue 属性に設定される、次に割り当てることができる値 (エントリーの作成後、プラグインにより処理される)
cn=DNA_config_entry,cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config エントリーでサポートされる属性の一覧は、Red Hat Directory Server Configuration, Command, and File Referenceを参照してください。
1 つの属性タイプに対して、1 台のサーバーに分散数値割り当てを設定するには、以下を実行します。
dn: cn=Account UIDs,cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config
objectClass: top
objectClass: dnaPluginConfig
cn: Account UIDs
dnatype: uidNumber
dnafilter: (objectclass=posixAccount)
dnascope: ou=people,dc=example,dc=com
dnaNextValue: 1
複数のサプライヤーが分散数値の割り当てに設定されている場合は、エントリーに範囲を転送するために必要な情報が含まれます。
  • サーバーが割り当てることができる最大数。これにより、範囲の上限が設定されます。これは、複数のサーバーが番号を割り当てるときに論理的に必要です。これは dnaMaxValue 属性で設定されます。
  • dnaThreshold 属性に設定された範囲転送を発生させるのに範囲が十分低いしきい値です。これが設定されていない場合、デフォルト値は 1 になります。
  • dnaRangeRequestTimeout 属性に設定される、サーバーが転送を待ってハングしないようにするためのタイムアウト期間。これを設定しないと、デフォルト値は 10 (10 秒) になります。
  • dnaSharedCfgDN 属性に設定した各サプライヤーの範囲情報を保存するすべてのサプライヤーサーバー間で共有される設定エントリー DN。
サーバーで割り当て可能な特定の数字の範囲は、dnaNextRange 属性で定義されます。これは、次に利用可能な範囲を表示し、サーバーが範囲が割り当てられているか、使用しているため、プラグインにより自動的に管理されます。この範囲はデッキ上にあります。 別のサーバーには割り当てられておらず、ローカルの Directory Server が使用する場合は引き続き利用できます。
dn: cn=Account UIDs,cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config
objectClass: top
objectClass: dnaPluginConfig
cn: Account UIDs
dnatype: uidNumber
dnafilter: (objectclass=posixAccount)
dnascope: ou=People,dc=example,dc=com
dnanextvalue: 1
dnaMaxValue: 1300
dnasharedcfgdn: cn=Account UIDs,ou=Ranges,dc=example,dc=com
dnathreshold: 100
dnaRangeRequestTimeout: 60
dnaNextRange: 1301-2301
dnaNextRange 属性は、個別の特定範囲を他のサーバーに割り当てる必要がある場合にのみ明示的に設定する必要があります。dnaNextRange 属性に設定した範囲は、重複を避けるために、他のサーバーで利用可能な範囲から一意でなければなりません。他のサーバーからの要求がなく、dnaNextRange が設定されているサーバーが設定 dnaMaxValue に到達した場合は、次に値 (dnaNextRange の一部) がこのデッキから割り当てられます。
dnaNextRange 割り当ては、DNA 設定に設定されている dnaThreshold 属性によっても制限されます。dnaNextRange 用に別のサーバーに割り当てられる範囲は、範囲が dnaNextRange のデッキで利用可能であっても、サーバーのしきい値に違反できません。
注記
dnaNextRange 属性が明示的に設定されていない場合は、内部的に処理されます。自動的に処理される場合、dnaMaxValue 属性は次の範囲の上限として機能します。
各サプライヤーは、範囲およびその接続設定に関する情報を含む、現在の範囲を別の設定エントリーで追跡します。このエントリーは、dnasharedcfgdn の場所の子です。設定エントリーは他のすべてのサプライヤーに複製されるため、各サプライヤーが設定を確認して、新しい範囲で問い合わせるサーバーを見つけることができます。以下に例を示します。
dn: dnaHostname=ldap1.example.com+dnaPortNum=389,cn=Account UIDs,ou=Ranges,dc=example,dc=com
objectClass: dnaSharedConfig
objectClass: top
dnahostname: ldap1.example.com
dnaPortNum: 389
dnaSecurePortNum: 636
dnaRemainingValues: 1000

7.4.3. 一意の番号割り当ての設定

一意の数字分散は、DNA プラグインの異なるインスタンスを作成して設定されます。

7.4.3.1. DNA プラグインの新規インスタンスの作成

複数の設定で DNA を使用するには、設定ごとにプラグインの新しいインスタンスを作成します。
注記
コマンドラインでのみ、プラグインの新しいインスタンスを作成できます。ただし、コマンドラインと Web コンソールの両方を使用して設定を編集できます。
プラグインの新しいインスタンスを作成して有効にするには、以下を実行します。
  1. たとえば、プラグインの新規インスタンスを作成するには、以下のコマンドを実行します。
    # dsconf -D "cn=Directory Manager" ldap://server.example.com plugin dna config "Account UIDs" add --type uidNumber --filter "(objectclass=posixAccount)" --scope ou=People,dc=example,dc=com --next-value 1 --max-value 1300 --shared-config-entry "cn=Account UIDs,ou=Ranges,dc=example,dc=com" --threshold 100 --range-request-timeout 60 --magic-regen magic
    で設定できる値の詳細については、--magic-regen パラメーターについては、『Configuration, Command and File Reference』 の dnaMagicRegen属性の説明。
  2. DNA プラグインを有効にするには、以下を実行します。詳細については、「プラグインの有効化および無効化」 を参照してください。

7.4.3.2. コマンドラインでの一意の番号割り当ての設定

注記
一意の番号が割り当てられている属性には、同等インデックスが設定されている必要があります。dnaNextvalue がすでに取得されているかどうかを確認するために、サーバーは、内部的にソートされた検索を実行する必要があります。これには、適切な順序のマッチングルールとともに整数属性で等価インデックスが必要であるかを確認します。
インデックスの作成については、「標準インデックスの作成」を参照してください。
注記
すべてのサプライヤーサーバーに DNA プラグインを設定し、数字の範囲の値と重複しないように注意してください。
  1. プラグインの新規インスタンスを作成します。DNA プラグインの新規インスタンスの作成」を参照してください。
  2. 複製されたサブツリーに共有コンテナーエントリーを作成します。
    # ldapmodify -D "cn=Directory Manager" -W -p 389 -h server.example.com -x
    dn: ou=Ranges,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: extensibleObject
    objectclass: organizationalUnit
    ou: Ranges
    -
    dn: cn=Account UIDs,ou=Ranges,dc=example,dc=com
    changetype: add
    objectclass: top
    objectclass: extensibleObject
    cn: Account UIDs
  3. インスタンスを再起動します。
    # dsctl instance_name restart

7.4.3.3. Web コンソールを使用した一意の番号割り当ての設定

Web コンソールを使用して DNA プラグインを有効にして設定するには、以下を行います。
  1. プラグインの新規インスタンスを作成します。DNA プラグインの新規インスタンスの作成」を参照してください。
  2. Web コンソールで Directory Server ユーザーインターフェイスを開きます。「Web コンソールを使用した Directory Server へのログイン」を参照してください。
  3. インスタンスを選択します。
  4. Plugins メニューを開きます。
  5. DNA プラグインを選択します。
  6. ステータスを ON に変更し、プラグインを有効にします。
  7. Add Config をクリックします。
  8. フィールドを入力し、設定を有効にします。
  9. インスタンスを再起動します。「Web コンソールを使用した Directory Server インスタンスの起動および停止」を参照してください。

7.4.4. Distributed Number Assignment プラグインのパフォーマンスに関する注意事項

DNA 設定が動的に変更されると、スレッドロックの問題が発生する可能性があります。そのため、新しい設定のスレッドは解放されないため、DNA 設定にアクセスする新しい操作 (DNA タスクや DNA 設定への追加の変更など) は古い設定にアクセスします。これにより、操作が古い設定を使用するか、操作がハングする可能性があります。
これを回避するには、動的 DNA 設定の変更の間隔を 35 秒に設定します。これは、DNA 設定の変更と、DNA プラグイン操作を発生させるディレクトリーエントリーの変更の両方の間にスリープ状態または遅延があることを意味します。