第 19 章 解决常见复制问题

多层次复制使用最终不一致的复制模型。这意味着在不同服务器上可以更改相同的条目。在这两个服务器之间发生复制时,目录服务器需要解决冲突的更改。主要是,根据与每台服务器上更改关联的时间戳自动进行解析。最近的更改具有优先级。然而,在某些情况下,冲突需要人工干预才能到达解决方案。

19.1. 识别和解决命名冲突

当多个供应商服务器收到一个请求来创建具有相同可分名称(DN)的条目时,每个服务器都会使用此 DN 和不同的条目唯一标识符(entry ID)创建条目。条目 ID 存储在 nsuniqueid 操作属性中。

例如,Server AServer B 收到一个请求,以创建 uid=user_name,ou=people,dc=example,dc=com 用户条目。因此,每个服务器都有自己的条目:

  • 在 Server A 中,该条目有:

    • uid=user_name,ou=people,dc=example,dc=com
    • nsuniqueid=a7f1758b-512211ec-b115e2e9-7dc2d46b
  • 在 Server B 中,该条目有:

    • uid=user_name,ou=people,dc=example,dc=com
    • nsuniqueid=643a461e-b61311e1-b23be826-4afeed5f

在复制过程中,服务器 A 复制新创建的条目 uid=user_name,ou=people,dc=example,dc=com Server B ,Server B 将新创建的条目复制到 Server A,并在每台服务器上发生命名冲突。通过比较更改序列号(CSN),每台服务器决定了之前创建的条目。例如,之前创建了 Server B 中的条目。

自动冲突解析过程会通过以下方法更改创建的最后一个条目( 服务器 A中的条目):

  • 在非唯一 DN 中添加 nsuniqueid 值。
  • 添加 nsds5replconflict 属性以及导致冲突的操作的描述。
  • 添加 ldapsubentry objectclass。

现在,两个服务器上都存在以下条目:

  • 有效的 条目包括:

    • uid=user_name,ou=people,dc=example,dc=com
    • nsuniqueid=643a461e-b61311e1-b23be826-4afeed5f
  • 冲突 条目有:

    • nsuniqueid=a7f1758b-512211ec-b115e2e9-7dc2d46b+uid=user_name,ou=people,dc=example,dc=com
    • nsuniqueid=a7f1758b-512211ec-b115e2e9-7dc2d46b

要手动解决命名冲突,请在每台服务器上执行以下步骤。

流程

  1. 列出冲突条目:

    # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict list dc=example,dc=com
    dn: nsuniqueid=a7f1758b-512211ec-b115e2e9-7dc2d46b+uid=user_name,ou=people,dc=example,dc=com
    cn: user_name
    displayName: user
    gidNumber: 99998
    homeDirectory: /var/empty
    legalName: user name
    loginShell: /bin/false
    nsds5replconflict: namingConflict (ADD) uid=user_name,ou=people,dc=example,dc=com
    objectClass: top
    objectClass: nsPerson
    objectClass: nsAccount
    objectClass: nsOrgPerson
    objectClass: posixAccount
    objectClass: ldapsubentry
    uid: user_name
    uidNumber: 99998
  2. 如果存在冲突条目,决定如何进行:

    • 要只保留有效的条目(uid=user_name,ou=people,dc=example,dc=com)并删除冲突条目,请输入:

      # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict delete nsuniqueid=a7f1758b-512211ec-b115e2e9-7dc2d46b+uid=user_name,ou=People,dc=example,dc=com
    • 要只保留冲突条目(nsuniqueid=a7f1758b-512211ec-b115e2e9-7dc2d46b+uid=user_name,ou=People,dc=example,dc=com),并删除有效的条目,请输入:

      # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict swap nsuniqueid=a7f1758b-512211ec-b115e2e9-7dc2d46b+uid=user_name,ou=People,dc=example,dc=com
    • 要保留这两个条目,请指定一个新的相对可分辨名称(RDN)来重命名冲突条目:

      # dsconf -D "cn=Directory Manager" ldap://server.example.com repl-conflict convert --new-rdn=uid=user_name_NEW nsuniqueid=a7f1758b-512211ec-b115e2e9-7dc2d46b+uid=user_name,ou=people,dc=example,dc=com

      此命令将冲突条目重命名为 uid=user_name_NEW,ou=people,dc=example,dc=com

警告

目录服务器复制在冲突条目上执行的 LDAP 操作。通常,使用原始操作条目的 nsuniqueid 而不是使用操作 dn 来复制操作以条目为目标。但是,在使用冲突条目时,行为可能会有所不同。