多主复制使用宽松的一致性复制模型。这意味着可以在不同服务器上同时修改相同条目。在两个服务器之间发送更新时,必须解决所有冲突的更改。大多数情况下系统都可以自动解决冲突。例如,将使用最近的更改解决与每个服务器上的更改相关联的时间戳。但是,某些更改冲突需要手动介入才能解决。
本部分包含以下主题:
解决复制冲突的最简单方法是使用 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,则复制之后这两个主服务器上都将具有以下两个条目:
uid=bjensen,ou=People,dc=example,dc=com
nsuniqueid=66446001-1dd211b2-66225011-2ee211db+uid=bjensen,dc=example,dc=com
必须为第二个条目提供有用的 DN。您可以删除冲突的条目,然后使用不冲突的名称再次添加该条目。但是,重命名条目将确保其内容不会发生更改。重命名过程取决于命名属性是单值属性还是多值属性。请参见以下过程。
您可以使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
在保留旧 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 操作属性。
删除命名属性的旧 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 |
如果重复条目中的命名属性是单值属性,例如 dc(domain component,域组件),则不能简单地将此条目重命名为同一属性的其他值。您必须为此条目提供一个临时名称。
您可以使用 DSCC 执行此任务。有关信息,请参见目录服务控制中心界面和 DSCC 联机帮助。
使用其他命名属性对条目进行重命名,并保留旧的 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 操作属性。
将所需的命名属性更改为唯一的值,并删除冲突标记属性,例如:
$ 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 |
将条目重命名为预期的命名属性,例如:
$ 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。
复制删除操作时,如果使用方服务器发现要删除的条目具有子条目,则冲突解决过程将创建紧附条目,以免目录中出现孤立条目。
同样,复制添加操作时,如果使用方服务器找不到父条目,则冲突解决过程将创建代表父条目的紧附条目,以免新条目成为孤立条目。
紧附条目是包含对象类 glue 和 extensibleObject 的临时条目。可以使用多种方法创建紧附条目:
如果冲突解决过程发现已删除条目具有匹配的唯一标识符,则紧附条目就是该条目的再生条目。它还包含 glue 对象类和 nsds5ReplConflict 属性。
在这种情况下,可以修改紧附条目以删除 glue 对象类和 nsds5ReplConflict 属性(以便使此条目保持为普通条目),或者删除紧附条目及其子条目。
服务器创建具有 glue 和 extensibleObject 对象类的最小条目。
在这种情况下,必须修改此条目使其成为有意义的条目,或者删除此条目及其所有子条目。
如果需要与依赖于属性唯一性的应用程序(如邮件服务器)进行交互操作,您可能需要限制对包含 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 属性的条目。