删除具有许多链接的 Active Directory 对象会导致复制失败

本文为删除包含许多转发链接的 Active Directory 对象时出现的问题提供了解决方法。

适用于: Windows Server 2012 R2
原始 KB 编号: 3149779

摘要

本文讨论删除包含许多转发链接的 Active Directory 对象时出现的问题。 下面是一些常见示例:

  • (成员属性) 的组成员身份
  • 漫游用户凭据 (ms-PKI-AccountCredentials 属性)
  • 只读域控制器 (RODC) mds-revealedusers 属性 (公开的用户链接)

开始出现问题的链接数可能低至 50,000 个。 在单个对象上,可能有数百万个链接。

本文中讨论的注册表项应仅应用于域控制器 (DC) 和轻型目录服务 (LDS) 遇到“症状”一节中所述的问题的服务器。 此问题可能发生在 Windows Server 2012、Windows Server 2012 R2 和 Windows Server 2016 DC 上。 按照此处提供的建议操作,可以降低 Active Directory 复制性能,但提高正确处理删除此类大型对象的可靠性。

症状

删除包含许多转发链接的 Active Directory 对象时,可能会遇到复制失败。 例如,删除具有大型成员身份集的组,或者降级并删除具有许多链接的 RODC 计算机帐户,这些帐户指向在 RODC 上公开了密码的用户帐户。

以下条件是此解决方案适用于该问题的关键指标:

  • 林功能级别为 Windows Server 2003 或更高版本的 Windows Server,因此使用链接值复制。

  • 事件 2094 (复制延迟) 多次发生,引用同一已删除的对象。

  • 事件 1083 和 1955 (写入冲突) 记录在与引用同一已删除对象的 2094 事件的日志记录接近的时间。

  • 受影响的域控制器 (DC) 也可能报告版本存储已用尽 (事件 ID 623) 。 在这种情况下,版本存储的耗尽并不总是发生。 增加版本存储耗尽可能性的其他因素包括对 Active Directory 对象(本地和复制)的更改率较高,以及其他长时间运行的操作(如深层查询)。

  • Active Directory 复制失败,出现错误 8409、错误“发生数据库错误”或其他事件引用下表中提到的相关状态代码:

    十六进制 小数 符号 友好
    000020D9 8409 ERROR_DS_DATABASE_ERROR 发生数据库错误

    如果启用了 Active Directory 回收站,则删除对象后 (删除对象生存期) ,复制错误可能不会在 60 到 180 天内发生。 当对象从已删除状态转换为已回收状态时,会出现这些问题。

事件日志条目

发生此问题时,会记录以下事件:

日志名称:目录服务
来源:Microsoft-Windows-ActiveDirectory_DomainService
事件 ID:2094
任务类别:复制
级别:警告
关键字:经典
说明:性能警告:复制在对以下对象应用更改时延迟。 如果此消息频繁出现,则表明复制发生缓慢,服务器可能难以跟上更改。
对象 DN: <对象名称>
对象 GUID: <对象 GUID>
分区 DN:DC=contoso,DC=com
服务器:xxxx-xxxx-xxxx-xxxx-xxxxxxx._msdcs.contoso.com
运行时间 (秒) :11
用户操作
看到此延迟的一个常见原因是,此对象在其值的大小或值数方面都特别大。 应首先考虑是否可以更改应用程序以减少存储在对象上的数据量或值数。 如果这是一个大型组或通讯组列表,则可以考虑将林功能级别提高到 Windows Server 2003 或更高版本,因为这将使复制能够更高效地工作。 应评估服务器平台是否在内存和处理能力方面提供足够的性能。 最后,可以考虑通过将数据库和日志移动到单独的磁盘分区来优化Active Directory 域服务数据库。
如果想要更改警告限制,下面将包含注册表项。 值为零将禁用检查。
其他数据
警告限制 (秒) :10
限制注册表项:System\CurrentControlSet\Services\NTDS\Parameters\Replicator 最大等待更新对象 (秒)
日志名称:目录服务
来源:Microsoft-Windows-ActiveDirectory_DomainService
事件 ID:1083
任务类别:复制
级别:警告
关键字:经典
说明:
Active Directory 域服务无法使用从以下网络地址的目录服务收到的更改更新以下对象,因为Active Directory 域服务正忙于处理信息。
对象: <对象名称>
网络地址:xxxxx-xxxx-xxxx-xxxx-xxxxxxx._msdcs.contoso.com
稍后将再次尝试此操作。
日志名称:目录服务
来源:Microsoft-Windows-ActiveDirectory_DomainService
事件 ID:1955
任务类别:复制
级别:信息
关键字:经典
用户:匿名登录
说明:Active Directory 域服务将复制的更改应用于以下对象时遇到写入冲突。
对象: <对象名称>
时间(秒):48
此条目前面的事件日志条目将指示是否已接受更新。
写入冲突可能是由于同时更改同一对象,或者同时更改具有引用此对象的属性的其他对象。 当 对象表示具有多个成员的大型组,并且林的功能级别设置为 Windows 2000 时,通常会发生这种情况。 此冲突触发了更新的其他重试。 如果系统显示速度较慢,可能是因为正在进行这些更改的复制。
用户操作
使用较小的组进行此操作,或者将林功能级别提高到 Windows Server 2003。

更多信息

默认情况下,删除具有大量向前和向后链接的 Active Directory 对象时,一次会删除 10,000 个链接。 在此期间,如果其他线程更新这些链接的目标对象,链接删除事务将暂停,直到对象再次可用。 此挂起可能会导致整个删除事务需要很长时间才能完成。 在此期间,此长时间运行的任务会保留其他复制任务。 例如,你可能会注意到密码和组成员身份更新在整个林中没有进行。

当此更新处于挂起状态时,管理员可能会看到写入冲突和事务失败事件。 此外,随着复制处理其他对象,分配的版本存储越来越多,因为挂起的大型事务在删除事务完成之前不会释放其分配的版本存储。 这可能会导致版本存储错误和复制警告事件。

注意

  • 垃圾回收与组成员身份链接删除的处理无关。
  • 减少 TSL 不是加速链接删除的有效方法。
  • 链接进程批大小的旧值在 Windows Server 2008 R2 之前的版本中为 1,000。 在更高版本中,批大小将增加到 10,000,以提高启用回收站的林中取消删除的性能。
  • 检查 链接进程批大小 参数的值。 如果该值为非默认值,请将该值设置回默认值或更小的值,例如 1,000 或 100。

较小的值通过每次删除较少的对象数来减少版本存储的使用,从而减少执行单个删除事务的总时间。 这在增加准确反映目录中的组成员身份所需的时间的同时,会减少版本存储和写入冲突的时间范围,从而产生积极的副作用。

以下注册表项的 Active Directory 服务检查。

对于 AD DS:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\NTDS\Parameters\Links process batch size

对于 AD LDS:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\<adam instance>\Parameters\Links process batch size
类型:DWORD
最小值:100
最大值:10000

此值将默认值 10,000 替代为一次处理的原子链接数。 无需重启 NTDS 或 LDS 实例服务,也不必重启计算机以使设置生效。

每次原子操作后,都会释放相应的版本存储。 仅在继续处理同一对象的下一个原子操作期间重新获取版本存储。 你可能对在很大程度上降低链接批大小有第二个想法。 可以将其与 ESE 版本存储的增加相结合。 如果可能出于增加版本存储的原因,你可能会决定增加版本存储一些更多或不减少 链接进程批大小 值。

有关详细信息,请参阅以下文章:

解决方法

若要解决此问题,请将 链接进程批大小 的值设置为小于 10,000。 这会降低发生对象访问冲突的可能性。 通过执行此操作,可使大型对象删除的复制过程更加可靠。 此外,现在完成整个事务需要更长的时间。 这也有助于避免版本存储耗尽。

数据收集

如果需要 Microsoft 支持方面的帮助,建议按照 使用 TSS 收集 Active Directory 复制问题的信息中所述的步骤收集信息。

References

有关详细信息,请参阅以下文章: