Sun Java System Directory Server Enterprise Edition 6.1 管理指南

解决常见复制冲突

多主复制使用宽松的一致性复制模型。这意味着可以在不同服务器上同时修改相同条目。在两个服务器之间发送更新时,必须解决所有冲突的更改。大多数情况下系统都可以自动解决冲突。例如,将使用最近的更改解决与每个服务器上的更改相关联的时间戳。但是,某些更改冲突需要手动介入才能解决。

本部分包含以下主题:

使用 DSCC 解决复制冲突

解决复制冲突的最简单方法是使用 DSCC。有关信息,请参见 DSCC 联机帮助。

使用命令行解决复制冲突

可以使用命令行解决复制冲突。存在更改冲突(无法由复制过程自动解决)的条目将包含操作属性 nsds5ReplConflict 作为冲突标记。

要查找存在冲突的条目,请定期搜索包含此属性的条目。例如,您可以使用以下 ldapsearch 命令查找存在冲突的条目:


$ ldapsearch -h host2 -p 1389 -D cn=admin,cn=Administrators,cn=config \
 -w - -b "dc=example,dc=com" "(nsds5ReplConflict=*)"

请注意,默认情况下将为 nsds5ReplConflict 编制索引。

解决命名冲突

如果在服务器相互复制更改之前创建具有相同 DN 的条目,则可能会在不同的主服务器上创建这些条目。在复制时,冲突解决机制将自动对所创建的第二个条目进行重命名。

存在 DN 命名冲突的条目将通过以下方式进行重命名:在该条目的 DN 中包含其唯一标识符(由操作属性 nsuniqueid 提供)。

例如,如果在两个主服务器上同时创建条目 uid=bjensen,ou=People,dc=example,dc=com,则复制之后这两个主服务器上都将具有以下两个条目:

必须为第二个条目提供有用的 DN。您可以删除冲突的条目,然后使用不冲突的名称再次添加该条目。但是,重命名条目将确保其内容不会发生更改。重命名过程取决于命名属性是单值属性还是多值属性。请参见以下过程。

Procedure对包含多值命名属性的冲突条目进行重命名

您可以使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。

  1. 在保留旧 RDN 值的同时重命名条目,例如:


    $ ldapmodify -h host2 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
    Enter bind password:
    dn: nsuniqueid=66446001-1dd211b2-66225011-2ee211db+uid=bjensen,dc=example,dc=com
    changetype: modrdn
    newrdn: uid=bj66446001
    deleteoldrdn: 0
    ^D

    您无法在此步骤中删除旧 RDN 值,因为它还包含无法删除的 nsuniqueid 操作属性。

  2. 删除命名属性的旧 RDN 值和冲突标记属性,例如:


    $ ldapmodify -h host2 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
    Enter bind password:
    dn: uid=bj66446001,dc=example,dc=com
    changetype: modify
    delete: uid
    uid: bjensen
    -
    delete: nsds5ReplConflict
    ^D

Procedure使用单值命名属性重命名冲突条目

如果重复条目中的命名属性是单值属性,例如 dc(domain component,域组件),则不能简单地将此条目重命名为同一属性的其他值。您必须为此条目提供一个临时名称。

您可以使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。

  1. 使用其他命名属性对条目进行重命名,并保留旧的 RDN,例如:


    $ ldapmodify -h host2 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
    Enter bind password:
    dn: nsuniqueid=66446001-1dd211b2-66225011-2ee211db+dc=HR,dc=example,dc=com
    changetype: modrdn
    newrdn: o=TempHREntry
    deleteoldrdn: 0
    ^D

    您无法在此步骤中删除旧 RDN 值,因为它还包含无法删除的 nsuniqueid 操作属性。

  2. 将所需的命名属性更改为唯一的值,并删除冲突标记属性,例如:


    $ ldapmodify -h host2 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
    Enter bind password:
    dn: o=TempHREntry,dc=example,dc=com
    changetype: modify
    replace: dc
    dc: NewHR
    delete: nsds5ReplConflict
    ^D
  3. 将条目重命名为预期的命名属性,例如:


    $ ldapmodify -h host2 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
    Enter bind password:
    dn: dc=NewHR,dc=example,dc=com
    changetype: modrdn
    newrdn: dc=HR
    deleteoldrdn: 1
    ^D

    通过将 deleteoldrdn 属性值设置为 1,删除临时属性值对 o=TempHREntry。如果要保留此属性,请将 deleteoldrdn 属性值设置为 0

解决孤立条目冲突

复制删除操作时,如果使用方服务器发现要删除的条目具有子条目,则冲突解决过程将创建紧附条目,以免目录中出现孤立条目。

同样,复制添加操作时,如果使用方服务器找不到父条目,则冲突解决过程将创建代表父条目的紧附条目,以免新条目成为孤立条目。

紧附条目是包含对象类 glueextensibleObject 的临时条目。可以使用多种方法创建紧附条目:

解决潜在的互操作性问题

如果需要与依赖于属性唯一性的应用程序(如邮件服务器)进行交互操作,您可能需要限制对包含 nsds5ReplConflict 属性的条目的访问权限。如果不限制对这些条目的访问权限,则只需要一个属性的应用程序将同时获得原始条目和包含 nsds5ReplConflict 的冲突解决条目,并且操作将会失败。

要限制访问权限,需要使用以下命令修改授予匿名读取访问权限的默认 ACI。


$ ldapmodify -h host2 -p 1389 -D cn=admin,cn=Administrators,cn=config -w -
Enter bind password:
dn: dc=example,dc=com
changetype: modify
delete: aci
aci: (target ="ldap:///dc=example,dc=com")
 (targetattr !="userPassword"
 (version 3.0;acl "Anonymous read-search  access";
 allow (read, search, compare)(userdn = "ldap:///anyone");)
-
add: aci
aci: (target="ldap:///dc=example,dc=com")
 (targetattr!="userPassword")
 (targetfilter="(!(nsds5ReplConflict=*))")(version 3.0;acl
 "Anonymous read-search access";allow (read, search, compare)
 (userdn="ldap:///anyone");)
^D

新的 ACI 可阻止在搜索结果中返回包含 nsds5ReplConflict 属性的条目。