5.6. 关于动态分配唯一数量值

有些条目属性需要具有唯一数字,如 uidNumbergidNumber。目录服务器可使用分布式 Numeric Assignment(DNA)插件为指定属性自动生成和提供唯一数字。
很多情况需要一个唯一的数字属性,如 UID/GID 号或 PIN 编号。服务器使用 DNA 插件实例指定生成数字的属性,因此每当将该属性添加到条目时,都可分配唯一的值。
注意
在 DNA 插件中,属性一致性不一定会保留。该插件只分配非重叠范围,但它允许为受管属性手动分配数字,而且不会验证或要求手动分配的数字是唯一的。

5.6.1. 目录服务器管理唯一数字的方式

分配唯一数字的问题没有生成数字,但实际上管理数字,在复制条目时不会与其他分配数字冲突,并且每个服务器都有足够数量的分配数字。
服务器的 DNA 插件分配实例可以发出的一系列可用数字。范围定义非常简单,由两个属性设置:服务器的下一个可用数字(范围较低)及其最大值(范围最顶层)。在配置了插件实例时,会设置初始底部范围。之后,底部值由插件更新。通过将可用数字拆分为范围,服务器可以持续分配数字,而不会相互重叠。
服务器在内部执行排序搜索,以查看是否已获取下一个指定范围,这要求 managed 属性具有等同顺序匹配规则的索引。
对于多层次复制,每个供应商都可以配置阈值,以便在其范围内从数字开始运行,可以请求来自其他供应商的其他范围。每个供应商都在单独的配置条目中保持其当前范围的跟踪。配置条目将复制到所有其他供应商,因此每个供应商都可以检查配置以查找要联系新范围的服务器。
在各个服务器和范围配置条目上设置的范围是目录服务器高效分配数字的项。
DNA 插件可以分配唯一数字到单个属性类型,或者从单个范围唯一数字的多个属性类型分配。
这提供了为属性分配唯一数字的多个选项:
  • 从单一唯一数字范围内分配给单个属性类型的单个数字。
  • 对于一个条目,分配给两个属性的唯一数字相同。
  • 分配了两个不同的属性,与相同范围的唯一数字不同。
在很多情况下,为每个属性类型分配唯一的数字就足够了。为新的员工条目分配 employeeID 时,务必要为每个员工条目分配一个唯一的 employeeID
然而,在有些情况下,从相同数量分配唯一数字到多个属性可能很有用。例如,当将 uidNumbergidNumber 分配给 posixAccount 条目时,可将 DNA 插件配置为为这两个属性分配相同的数字。
DNA 插件将始终应用于目录树的特定区域(scope)以及该子树中的特定条目类型( filter)。
通常,完全不同的用户存储在目录树的不同分支中。例如,托管服务可能在 ou=Example Corp. 分支中有一个客户端的用户,在 ou=Acme Company 分支中另一个客户端的用户。在这种情况下,分配的数字必须在 子树中唯一, 但不一定在整个目录中是唯一的。在这种情况下,ou=Example Corp. 分支中的 Barbara Jensen 都正确,在她的条目中有 uidNumber:5,对于 ou=Acme Company 分支中的 John Smith,在其条目中有 uidNumber:5,因为这些是单独的机构。将范围应用到特定的子树在 DNA 范围内设置,如 dnaScope: ou=people,dc=example,dc=com
唯一数字也可以通过使用前缀来识别不同类型的用户条目来区分不同的范围。例如,如果将 DNA 前缀设置为 acme,则 Acme Company 分支中的唯一数字在数字前面有 acme,如 uid: acme5

5.6.2. 使用 DNA 分配值到属性

Directory 服务器可以处理生成属性值的不同方法。
在最简单的情形中,用户条目会添加到具有对象类的目录中,它要求 unique-number 属性,但没有属性。在不使用值的情况下添加受管属性(或需要)将触发 DNA 插件来分配值。添加条目时,该插件会根据插件的范围和过滤器,检查条目是否与定义的范围匹配。如果条目与范围匹配,并且添加条目中缺少该范围管理的属性,那么 DNA 插件将分配下一个值。只有在已经配置了 DNA 插件来为单个属性分配唯一值时,这个选项才起作用。
例如,posixAccount 对象类需要 uidNumber 属性。如果 uidNumber 属性由 DNA 插件管理,并且添加用户条目时没有过滤器范围内的 uidNumber 属性,那么服务器会检查新条目,查看它需要 managed uidNumber 属性,并使用自动分配的值添加属性。
 ldapmodify -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

 dn: uid=jsmith,ou=people,dc=example,dc=com
 objectClass: top
 objectClass: person
 objectClass: posixAccount    
 uid: jsmith
 cn: John Smith
 ....
该插件处理缺少的属性,从服务器请求下一个可用数量,并提供该条目的值。
相似且更可管理的选项是使用一个 魔法号。这个音量号是 managed 属性的模板值、服务器范围之外的内容、数字甚至一个单词,插件可识别它需要替换为新分配的值。当使用该数字添加条目时,该条目位于配置的 DNA 插件的范围和过滤中,然后使用 magic number 自动触发插件来生成新值。
当 DNA 插件被配置为为 uidNumbergidNumber 都分配相同的唯一数字到 posixAccount 条目,DNA 插件将为这两个属性分配相同的数字。为此,请将两个受管属性传递给修改操作,指定数量。例如:
 ldapmodify -a -D "cn=Directory Manager" -W -p 389 -h server.example.com -x

 dn: uid=jsmith,ou=people,dc=example,dc=com
 objectClass: top
 objectClass: person
 objectClass: posixAccount
 uid: jsmith
 cn: John Smith
 uidNumber: magic    
 gidNumber: magic    
 ....
Magic number 对于从 LDIF 导入条目或触发 DNA 插件来为多个不同属性生成唯一数字,这个数字非常有用。
DNA 插件仅生成新的、唯一的值。如果向条目添加或修改为 DNA 插件控制的属性使用特定值,则会使用指定的数字; DNA 插件不会覆盖它。
注意
在 DNA 插件中,属性一致性不一定会保留。该插件只分配非重叠范围,但它允许为受管属性手动分配数字,而且不会验证或要求手动分配的数字是唯一的。

5.6.3. 使用带有复制的 DNA 插件

使用多层次复制时,服务器会引用两个条目:
  • DNA 插件的受管范围
  • 保存服务器可用范围信息的共享配置条目
创建插件实例时,DNA 插件会自动在带有供应商配置的共享配置条目下创建一个条目。例如:
dn: dnaHostname=ldap1.example.com+dnaPortNum=389,cn=Account UIDs,ou=Ranges,dc=example,dc=com
objectClass: extensibleObject
objectClass: top
dnahostname: ldap1.example.com
dnaPortNum: 389
dnaSecurePortNum: 636
dnaRemainingValues: 1000
当服务器需要新的数量时,它会搜索容器条目下的配置条目。当服务器找到可用范围最高的服务器时,它会发送扩展操作请求,使其具有为其分配的范围的一部分。如果第二个服务器同意,第二服务器会向请求服务器发送新范围分配。