7.4. 分配和管理唯一属性值

有些条目属性需要有一个唯一的数字,如 uidNumbergidNumber。目录服务器可以使用分布式数字分配(DNA)插件为指定属性自动生成并提供唯一数字。
注意
在 DNA 插件中,属性一致性不一定会保留。该插件只分配非重叠范围,但它允许为受管属性手动分配数字,而且不会验证或要求手动分配的数字是唯一的。
分配唯一数字的问题不会生成数字,而是有效地避免复制冲突。DNA 插件 在单个 后端之间分配唯一数字。对于多层次复制,当每个供应商都运行本地 DNA 插件实例时,必须有一种方法来确保每个实例都使用一组实际唯一的数字。这可以通过为每个服务器分配不同的 数字范围 来完成。

7.4.1. 关于动态数字分配

服务器的 DNA 插件分配了实例可能会发布的一系列可用数字。范围定义非常简单,由两个属性设置:服务器的下一个可用数字(范围的低端)和其最大值(范围顶部)。配置插件实例时,会设置初始底部范围。之后,底部值由插件更新。通过将可用数字分成每个副本上的独立范围,服务器可以持续分配数字,而不会相互重叠。

7.4.1.2. 范围和分配号

Directory 服务器有多种方法来处理生成属性值:
  • 在最简单的情形中,用户条目添加到具有对象类的目录中,该对象类需要 unique-number 属性,但没有属性 present。为 managed 属性添加没有值的条目会触发 DNA 插件分配值。只有在配置了 DNA 插件时,此选项才能为单个属性分配唯一值。
  • 类似且更易管理的选项是使用普通 数字。这个音量号是 managed 属性的模板值、服务器范围之外的内容、数字甚至一个单词,插件可识别它需要替换为新分配的值。当使用 magic 值添加条目,且该条目位于配置的 DNA 插件的范围和过滤器中,则使用 magic 号自动触发插件来生成新值。以下示例基于使用 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 插件可以分配唯一数字到单个属性类型,或者从单个范围唯一数字的多个属性类型分配。
这为属性分配唯一数字的几个选项:
  • 从单一唯一数字范围内分配给单个属性类型的单个数字。
  • 对于一个条目,分配给两个属性的唯一数字相同。
  • 分配了两个不同的属性,与相同范围的唯一数字不同。
在很多情况下,每个属性类型分配了唯一的数字就足够了。当为新的员工条目分配 employeeID 时,务必要为每个员工条目分配一个唯一的 employeeID
然而,在有些情况下,从相同数量分配唯一数字到多个属性可能很有用。例如,当将 uidNumbergidNumber 分配给 posixAccount 条目时,DNA 插件将为这两个属性分配相同的数字。为此,请将两个受管属性传递给修改操作,并指定 magic 值。使用 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 插件处理多个属性时,如果对象类只允许其中一个属性,则插件只能为其中一个属性分配唯一值。例如,posixGroup 对象类不允许 uidNumber 属性,但它允许 gidNumber。如果 DNA 插件同时管理 uidNumbergidNumber,那么当创建 posixGroup 条目时,从 uidNumbergidNumber 属性分配唯一的 gidNumber 号。对插件管理的所有属性使用相同的池可保持分配唯一数字,并防止不同条目上的 uidNumbergidNumber 从不同范围分配,并导致相同的 唯一数字
如果多个属性由 DNA 插件处理,则相同值将分配给单个修改操作中的条目中的所有给定受管属性。要从同一范围 分配不同的 数字,您必须执行单独的修改操作。以下示例使用 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 插件配置为为多个属性分配唯一数字时,需要为每个需要唯一数字的属性指定 magic 值。虽然当 DNA 插件被配置为为单个属性提供唯一数字时,这不是必要的,但多个属性需要这样做。可能存在实例,其中条目不允许为范围定义的每种属性类型,或者更重要,条目允许定义所有属性类型,但只有属性的子集需要唯一的值。

例 7.6. DNA 和唯一过期帐户号

人员希望客户 primaryAccountcustomerID 属性使用相同的唯一数字。Example the administrator 配置 DNA 插件,以从同一范围内为这两个属性分配唯一值。
公司还希望从与客户 ID 和主帐户号相同的范围为次要帐户分配数字,但这些数字不能与主帐户号相同。Example Bank 管理员配置 DNA 插件也会管理 secondaryAccount 属性,但仅在条目被创建、primaryAccountcustomerID 被分配,才会将 secondaryAccount 属性添加到条目中。这样可确保 primaryAccountcustomerID 共享相同的唯一数字,任何 次要Account 号都完全是唯一的,但仍然来自相同的数字。

7.4.2. 查看 DNA 插件语法

DNA 插件本身是一个容器条目,类似于 Password Storage Schemes 插件。DNA 插件条目下的每个 DNA 条目都定义了 DNA 插件的新受管范围。
要为 DNA 插件设置新的受管范围,请在容器条目下创建条目。
最基本的配置是在单一服务器上设置分布式数字分配,这意味着不会在服务器之间共享或传输范围。基本 DNA 配置条目定义了四个内容:
  • 正在管理的属性,在 dnaType 属性中设置
  • 用作基础的条目 DN 搜索条目,在 dnaScope 属性中设置
  • 用于识别要管理的条目的搜索过滤器,在 dnaFilter 属性中设置
  • 要分配的下一个可用值,在 dnaNextValue 属性中设置(在创建条目后,这由插件处理)
有关 cn=DNA_config_entry,cn=Distributed Numeric Assignment Plugin,cn=plugins,cn=config 条目 支持的属性列表,请查看红帽目录服务器配置、命令和文件参考
为单个属性类型在单一服务器上配置分布式数字分配:
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 秒。
  • 在所有供应商服务器之间共享的配置条目 DN,它存储每个供应商的范围信息,在 dnaSharedCfgDN 属性中设置。
服务器可分配的特定数字范围在 dnaNextRange 属性中定义。这显示了下一个可用的传输范围,并由插件自动管理,因为范围由服务器分配或使用。这个范围只是"on deck"。 它尚未分配给另一台服务器,仍可用于其本地目录服务器。
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,则从此 deck 中分配下一个值( 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 插件。详情请查看 第 1.10.2 节 “启用和禁用插件”

7.4.3.2. 使用命令行配置唯一数字分配

注意
任何分配了唯一数字的属性都必须为其设置相等索引。服务器必须在内部执行排序的搜索,以查看是否已经使用了 dnaNextvalue,这需要整数属性上的相等索引,具有正确的排序匹配规则。
第 13.2 节 “创建标准索引” 中描述了创建索引。
注意
在每个供应商服务器上设置 DNA 插件,并且小心不要重叠数字范围值。
  1. 创建插件的新实例。请参阅 第 7.4.3.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. 创建插件的新实例。请参阅 第 7.4.3.1 节 “创建 DNA 插件的新实例”
  2. 在 web 控制台中打开 Directory Server 用户界面。请参阅 第 1.4 节 “使用 Web 控制台登录到目录服务器”
  3. 选择实例。
  4. 打开 Plugins 菜单。
  5. 选择 DNA 插件。
  6. 将状态更改为 ON 以启用插件。
  7. 单击 Add Config
  8. 填写字段并启用配置。

7.4.4. 分布式数字分配插件性能备注

可以动态更改 DNA 配置的问题,以便访问 DNA 配置的新操作(如 DNA 任务或 DNA 配置的其他更改)将访问旧的配置,因为新配置的线程尚未发布。这可能导致操作使用旧配置,或者只是导致操作挂起。
要避免这种情况,请在 35 秒的动态 DNA 配置更改之间保留间隔。这意味着 DNA 配置更改和任何目录条目更改之间具有睡眠或延迟,这些更改将触发 DNA 插件操作。