AD DS是如何处理复制冲突的?

因为AD DS支持多主机复制模式,所以有可能会出现复制冲突的情况,一般会有三种可能的冲突:

  1. 在两台不同的DC上同时修改同一个对象的相同属性的值

  2. 在一台DC上新增或者修改一个对象,而同一时间在另外一台DC上这个对象所在的容器被删除了

  3. 在不同的DC上向同一个容器中新增了一个有相同的相关可分辨名的对象,比如在DC1和DC2上同时新增了一个账号,DC1上新增的是张珊,DC2上新增的是张山,但是他们的可分辨名称DN都是CN=zhangshan,CN=Users,DC=contoso,DC=com,这样就会出现冲突问题了。

为了最小化上述的冲突发生,林中所有DC基于属性或值来记录和复制那些变更的对象,而不是基于对象。因此在不同DC上同时变更对象的两个不同属性是不会产生冲突的,比如在两台不同的DC上,一台变更了用户密码,另一台变更了邮政编码,这样的情况下是不会有冲突问题。当DC上有对象发生了一个变更操作后,这个变更会和一个签章一起传递给其他的DC,签章中含有以下的组件:

  1. 版本号。每个对象属性的版本号都是从1开始,每次更改属性后都版本号会自动加1.当对象属性进行了一次修改后,现有的版本号会比之前的版本号大1

  2. 时间戳。时间戳表示更新的发起时间和日期,它参照的是发生变更的DC上系统时钟的时间。

  3. 服务器全局唯一标示符。服务器的全局唯一标示符用来标示出发起更新的那台DC,也就是数据变更的源DC。


下面我们看看AD DS如何解决我们上述的3种冲突问题

  1. 属性值冲突

    如果版本号的数值是一样的,但是对象的属性值不同,那么会去评估时间戳。谁的时间戳值高,就会应用谁的变更数据,如果时间戳也一样,那么就会通过服务器GUID来判断,谁的GUID值越小,谁的变更数据就会被应用。

  2. 在已删除的容器中更新数据

    在所有DC上,执行了删除动作的容器会被删除,但是容器内对象的变更会保存在目录分区中的LostAndFound容器中,这个过程中不会涉及到签章的对比。

  3. 新增对象时使用了相同的相关可分辨名称。参照属性值冲突的判断方法后,只会有一个对象使用这个相关可分辨名称,然后ADDS会让DC指派给另一个对象一个唯一的相关可分辨名称,这个相关可分辨名称的命名规则是 相关可分配名称+CNF:+ *(一个保留字符)+对象的GUID,这种命名规则保证了新生成的名称不会和其他的对象名称发生冲突。


复制拓扑是如何生成的?

复制拓扑指的是复制数据在网络中传递时的路由。要创建复制拓扑,AD DS必须确定那台DC会和其他的DC进行数据的复制。AD DS根据AD DS中包含的信息创建复制拓扑,因为每一个ADDS分区都可能被复制到站点的其他不同DC中,所以架构分区、配置分区、域分区和应用程序分区它们的复制拓扑都是不同的。

因为林中的所有DC共用一个架构和配置分区,所以ADDS会将架构分区和配置分区复制到所有的DC中。同一个域中的DC则会使用相同的域分区,另外拥有应用程序分区的DC之间也会互相复制它们的应用程序分区。为了优化这些复制的流量,对于不同的分区一台DC可能会有多个复制伙伴。在单站点环境中,复制拓扑具有容错和冗余功能,如果站点中有两台以上的DC,每一台DC至少会有两个复制伙伴。

架构分区的复制方式:

架构分区和配置分区的复制过程其他分区的复制过程是一样的,但是这两个分区是林范围的,所以在任意的两台DC上都有用于复制这两个分区的连接对象,不论这些DC所属的域是什么。说的更直白一点,就是林中所有的DC都会包含在这两个分区的复制拓扑中。

全局目录(GC)对复制的影响:

配置分区包含了整个林中的站点拓扑和所有域的全局数据,ADDS通过正常的林范围的复制方式,将配置分区复制到素有的DC上,每台GC通过连接某个域中的一台DC,然后从这台DC上获取域中对象的部分属性信息,每台GC都对自身域中的域分区拥有完全访问权限,因此它不需要请求获得自身域中的对象的部分属性。配置分区还会向DC提供一个林中GC服务器的列表,GC会在林的根域DNS区域注册DNS的记录,这些记录也只会在林的根域DNS区域被注册,它们会用来帮助林中的客户端和服务器找到GC服务器,让客户端和服务器能够正常的登陆使用。


RODC是如何进行复制的?

前面我们有提到,DC会通过从其他DC上拉取变更数据进行数据复制,但是RODC是不允许任何非主动的复制写入到它的数据库中,比如DC1有数据变更,但是它没有通知RODC有数据变更要进行复制操作,RODC是不能从DC1上拉取这些变更数据到自己的数据库的,另外RODC也不会向其他DC复制数据,也就是说RODC是只进不出的复制。由于RODC自己是无法更改数据的,那么其他的DC就不需要从RODC上拉取变更数据。限制RODC对数据库的写入,可以防止恶意的用户或应用程序变更或篡改数据库内容,并通过正常的复制过程将错误的数据复制到林中其他的DC。

当用户或应用程序试图在RODC上对数据库执行一个写入请求的时候,会触发下面列举行为中的某一种行为:

  1. RODC将写入的请求转发给一台可写的DC,然后可写DC将变更了的数据复制给RODC,这种行为的例子有:密码变更,SPN更新,计算机或域成员的属性变更。

  2. RODC会回应客户端并提供一个可写DC引用给客户端,然后应用程序能够直接与可写DC通信。LDAP就是一种RODC引用。

  3. 写入操作失败,因为RODC没有转发也没有提供可写DC的引用。

当你部署了一台RODC,KCC会检测到这台DC配置的是一个只读的副本,因此KCC会从一台或者多台DC建立一条单向的连接对象,因为RODC是windows 2008及以上版本才引入的新功能,所以这些DC的操作系统必须是windows 2008以上的版本。

针对某些任务,RODC会使用单对象复制的操作来执行传入复制,这个操作不是按照标准的复制计划进行的,它是根据需求发起的复制。这些任务包括:

密码变更请求

客户端通过RODC引用的一个可写DNS服务器进行DNS更新,RODC会尝试使用单对象复制操作来将更新的DNS数据拉取到自己的DNS中,这个情况仅允许在使用了AD集成DNS区域的环境中操作。

更新多个客户端属性,包括计算机名,DNS主机名,操作系统名称,操作系统版本信息,可支持的加密类型和最近登录时间属性。


AD DS的SYSVOL文件夹是如何复制的?

SYSVOL是一个文件和文件夹的集合,每台DC都有这个文件夹,它连接到每台DC的%systemroot%\sysvol位置。SYSVOL中包含了登录脚本和组策略相关的对象,例如组策略模板。SYSVOL文件夹中的内容会利用连接对象拓扑和KCC的复制计划,将内容复制到域内的每台DC上。

SYSVOL的变更在DC之间复制是依赖于DC的操作系统版本,域的功能级别,SYSVOL的迁移状态,FRS或者DFS复制方式来决定的,Windows Server使用的主要是FRS复制方式。

2003R2和更旧版的域结构中,FRS在容量和性能上都有限制,所以引入了DFS复制。在域功能级别为2012R2的域中,2012R2的DC不再使用FRS复制数据。如果林功能级是windows server 2008R2或以上版本,那么将会使用DFS复制。Server 2012R2的DFS复制有一个新功能:DFS数据库克隆,不过这个功能不能用在AD的SYSVOL文件夹复制上,SYSVOL复制必须使用DFS初始复制。(林功能级可以低于域功能级,但是域功能级一定不能低于林功能级,比如林是2008R2级,域可以是2008R2以上的级别,但是不允许是2008R2以下的级别)

在Windows2008和更高级别的域中,你可以使用DFS复制去对SYSVOL文件夹的内容进行复制,DFS复制支持计划复制和带宽控制,而且它可以结合远程差分压缩功能,在执行DFS复制的时候只复制文件中增量数据,降低了复制过程中的带宽使用率。如果在SYSVOL中有文件发生了变化,DFS复制会自动的将文件变化的地方复制到其他DC的SYSVOL文件夹中。

注意:你可以使用dfsrmig.exe工具去将SYSVOL复制方式从FRS更改成DFS复制,但是必须在域功能级别至少是Windows2008的情况下才可以迁移成功。