Active Directory 域服务中的程序员复制模型

下面是 Active Directory 域服务的复制模型的说明。

对 Active Directory 域控制器(DC)的所有更新都使用创建、修改或删除每个请求的一个对象的 LDAP 请求来执行。 单个请求可以设置或修改对象上的多个属性。

更新请求在一些 DC 上作为原子事务进行处理。 整个更新都会发生,或者没有任何更新发生。 如果请求者收到对更新请求的成功响应,则整个请求已成功(已提交)。 这称为“发起写入”。不能将多个 LDAP 请求分组到单个更大的事务中。

在原始写入中,DC 会为每个新的或修改的属性值计算一个“stamp”,并将此标记附加到值,以便在复制值时复制该标记。 新标记是唯一的,在更新时,新标记大于该 DC 上旧值的图章。

有时,DC 会选择自上次 DC 执行复制以来已更改的对象集。 然后,对于每个对象,它会向所有其他 DC 发送一条消息,其中包含自上次复制对象以来更改的属性的所有当前值。 复制消息可靠且按顺序传递,但可能需要更多时间才能传递。

当一个 DC 从另一个 DC 接收复制消息时,它会按如下方式处理它:对于每个修改的属性,如果复制消息中的值上的标记大于当前值的标记,则 DC 将应用更新;否则,DC 将放弃更新。 每个复制消息都作为原子事务应用,就像原始写入一样。

这是 Active Directory 域服务复制模型。 此模型的关键属性包括:

  • 对单个对象的发起写入是原子的。
  • 复制更改时,将发送原始写入所做的所有更改,或者不会发送任何更改。
  • 对单个对象的复制写入是原子的,但冲突是按属性解析的。

模型不能保证对不同对象所做的更改的复制顺序。 不要编写假定更改按发起写入顺序复制的应用程序。 模型不保证如果对象的属性更改了两次,则会复制这两个值:复制仅在复制时发送当前值。

该模型与现实不同,有多种方式仅影响性能。 例如,Active Directory 服务器发送包含对多个对象的更改的复制消息,但处理此类多对象消息的内容,就好像它是一系列单对象消息一样。 Active Directory 服务器不按模型中所述执行点到点复制,而是执行更复杂的更高效的可传递复制,在功能上等同于模型。