Active Directory
的复制拓扑
在前面的博文中我们在域中部署了额外域控制器,而且我们已经知道每个域控制器都有一个内容相同的
Active Directory
数据库,今天我们要讨论一下额外域控制器在进行
Active Directory
复制时所使用复制拓扑。
在
NT4
的时代,域控制器被分为两类,
PDC
和
BDC
。
PDC
是主域控制器的缩写,
BDC
是备份域控制器的缩写。每个域中只能有一个
PDC
,
BDC
可以有多个,
BDC
的目录数据是从
PDC
复制而来。只有
PDC
才可以更改域中的用户账号,计算机账号等目录数据,
BDC
的内容是只读的!这种复制模型我们称为单主复制,这种模型我们并不陌生,类似于
DNS
服务器的辅助服务器和主服务器的关系。单主复制模型比较简单,管理难度不大,但较容易构成单点故障。
从
Win2000
开始,
Active Directory
开始使用多主复制的模型,也就是说每个域控制器都可以自主地修改
Active Directory
的内容,域中不再有
PDC
和
BDC
的区别了。
Win2003
使用了和
Win2000
同样的多主复制模型,而
Win2008
则在多主复制的基础上又增加了一个
RODC
,也就是只读域控制器,可以看出
Win2008
试图在多主复制模型中增加一些单主复制的元素,因为
RODC
的设计理念显然和
BDC
是有些关联的。
现在我们知道了
Win2003
的
Active Directory
中使用了多主复制的模型,也就是任何一个域控制器都可以修改
Active Directory
。为了维护
Active Directory
的权威性,显然所有域控制器上的
Active Directory
内容应该都相同。那么,如果一个域控制器修改了自己的
Active Directory
,修改的的内容是如何复制到其他域控制器上的呢?这就是我们今天要讨论的内容,
Active Directory
的复制拓扑!
Active Directory
的复制拓扑是一个比较复杂的问题,今天我们只讨论在同一域中域控制器之间的复制拓扑。当域中的域控制器数量发生变化,例如增加或减少了域控制器,域控制器上的进程
KCC
就会进行
Active Directory
复制拓扑的计算。
KCC
被翻译为知识一致性验证器,我们在任务管理器的进程列表中看不到
KCC
,因为它属于
LSACC
进程的一部分。
KCC
可以自动计算出域控制器进行复制时所使用的拓扑,当域控制器数量较少时,
KCC
倾向于在域中使用环形拓扑进行
Active Directory
复制,也就是说当一个域控制器的
Active Directory
内容发生变化时,这个更改不会同时传递给其他所有的域控制器,而是要沿着
KCC
设计的环形拓扑一一传递下去。而且为了实现冗余以及提高效率,
KCC
设计的拓扑还是双环拓扑,下图就是一个域控制器的复制拓扑示意图,从图中可以看到,每个域控制器都有两个复制伙伴,
Active Directory
的复制沿着顺时针和逆时针两个方向进行。
域控制器复制
Active Directory
时,一般会使用“带通知的拉复制”,也就是说,当
DC1
修改了
Active Directory
后,
DC1
会在
5
分钟内通知自己的复制伙伴
DC2
,“快来,我的
AD
中有些新内容”。
DC2
收到通知后,会启动一个
Active Directory
的复制请求,以增量复制的方式从
DC1
把
Active Directory
复制到
DC2
。如果
Active Directory
中发生了一些紧急事件,例如用户口令被修改,那么此时域控制器将不受
5
分钟的时间限制,而是在最短时间内把
Active Directory
复制给
PDC
操作主机。如果一个域控制器在一个小时之内都没有收到复制伙伴发来的通知,它就会向复制伙伴发出一个查询,询问复制伙伴是否在线。
我们通过一个实例来观察一下域控制器的复制拓扑,
Adtest.com
域中有
Florence
,
Firenze
和
Berlin
三个额外域控制器,我们在
Florence
打开
Active Directory
站点和服务,可以看到每个域控制器的复制伙伴。如下图所示,
Florence
的复制伙伴是
Berlin
和
Firenze
。
而
Firenze
的复制伙伴是
Florence
和
Berlin
。
Berlin
的复制伙伴是
Florence
和
Firenze
。
看完三个域控制器的复制伙伴,我们很容易勾勒出
Active Directory
的复制拓扑,这是一个标准的双环拓扑,拓扑如下图所示。
双环拓扑非常优美,但并非适合所有场合!在域控制器较多的网络中,标准的环形拓扑就不太合适,因为域控制器复制
Active Directory
时有个严格的限制,那就是从源域控制器到目标域控制器不能超过三个域控制器的间隔。具体来说就是如果
DC1
的
Active Directory
发生了变化,那么
DC1
可以复制给
DC2
,
DC2
可以接着复制给
DC3
,
DC3
还可以复制给
DC4
,但
DC4
就不能再复制给
DC5
了!因为这时从
DC1
到
DC5
中间间隔的域控制器已经超过了三个。微软进行这个限制,估计是为了避免在大型网络中进行
Active Directory
复制时环形拓扑导致的延迟问题,试想一下,如果一个大型网络中有
100
个域控制器,域控制器复制的平均间隔为
5
分钟,那么从第一个域控制器复制到最后一个域控制器可能需要大约
500
分钟!这种延迟是不可接受的,因此在大型网络中
KCC
会使用网状拓扑,网状拓扑就不像环形拓扑那样有规律了,每个域控制器可能会有多个复制伙伴,看起来并不像环形拓扑那样有规律。域控制器的复制拓扑最好由
KCC
来规划,当然,也可以自己指定域控制器的复制伙伴,例如我们想指定
Florence
的复制伙伴,我们可以如下图所示,在
Florence
上选择“新建
Active Directory
连接”。
如下图所示,
Florence
可以从域控制器列表中选择自己的复制伙伴。这样一来,我们就完成了对
Florence
复制伙伴的手工指定。
域控制器的复制拓扑最好由
KCC
来自动计算,域控制器一旦复制拓扑出现问题,处理时需要相当的耐心,而且要结合
DNS
的
SRV
记录来进行排错,可能还需要对
Active Directory
数据进行手工处理。以后有机会我们会介绍一些
Active Directory
排错的高级工具以及实际案例供大家参考,希望大家都能够处理好这个问题。