Active Directory(AD)复制是如何工作的?当它不能正常运行的时候我们应该做些什么?
在这之前,你的公司已经部署了Windows 2000及Active Directory,所有的事情已经很完美地工作了一段时间,但现在你开始感觉到Windows 2000并没有完全像Microsoft所承诺的那样完美。许多管理员并没有对排除正常的目录服务逐渐变坏所产生的故障做好准备。不幸的是,AD的复制是Windows 2000中一个很少去理解的功能,现在是逐步展开理解复制的内部工作原理并发现可用的故障排除工具的时候了。
复制概述
AD是一个数据库,默认地,每个域控制器(DC)在它的“\winnt\ntds”文件夹中以ntds.dit文件形式存储这个数据库的一个副本。AD数据库从逻辑上划分为三个目录分区,又称为命名上下文(Naming Context,NC),它们分别是架构NC(Schema NC)、配置NC(Configuration NC)以及域NC(Domain NC)。森林中所有的DC都拥有同样的架构NC和配置NC,因为这些信息是在森林范围被定义的,而在一个AD域中的每个DC上拥有本域的域NC的同样的副本。如果DC被指派为全局编录(GC)服务器,那么这台DC同时包含森林中其他域的域NC的一部分副本,这部分副本包括所有来自个域中的对象,但仅仅是属性的一个子集。
复制是AD在域或森林中对拥有这些信息的所有DC之间的信息进行同步的一种机制。AD使用知识一致性检查器(Knowledge Consistency Checker ,KCC)、站点(Site)、站点链路(Site Link)和连接对象(Connection Object)来实现这个复制操作。
KCC是运行在所有DC上的一个内置进程,用来创建森林的复制拓扑。你可以使用站点来组织附近网络中被高速连接在一起的DC,你的网络与AD构架决定了一台DC是否属性高速连接,许多公司认为连接各DC的网络速度达到10M以上带宽就可称之为高速连接。站点的创建通常以子网为基础,如果多个子网高速连接在一起,你也可以把他们组织为一个站点。一个站点内DC之间的复制称为站内复制,为了建立一个站内复制拓扑,KCC自动在站点内的DC之间创建连接对象。连接对象同样也是跨站点连接DC的单向连接器。每个链路就像一条通道,表示一个从源DC到目的DC的入站链接。在站点内两台DC相互之间复制目录数据之前,你必须建立两个分离的连接对象。
如果有些DC之间没有高速连接,你就需要创建多个站点,分离的站点之间的复制称为站间复制。AD管理员使用Active Directory站点与管理控制台(MMC)管理单元来创建站点链路,它提供了站点之间进行数据复制的通道。在AD管理员建立这些通道之后,KCC在链接的站点之间创建连接对象。典型情况下,并不是所有的DC共享所有的信息(比如,各个域中的DC可能维护不同的数据)。因此,KCC可能需要建立多个连接对象来确保在整个企业中的每个NC被完全复制。在图1中显示了一个站间连接对象的例子,站点A与站点B通过一个手工创建的站点链路连接。在这个例子中,KCC已经创建了两个单向连接对象复制来自同一个域中二台DC之间的三个NC。
桥头服务器(bridgehead server)是复制拓扑中另一个组件,如果你使用过Microsoft Exchange服务器,你应该熟悉这个服务器的角色。为了增加复制的有效性,KCC不会对一个站点内所有的DC与另一个站点内所有的DC之间创建单个连接对象,相反,KCC在两台桥头服务器(每个站点中一台)之间使用存储并转发的信息复制机制。然后桥头服务器使用站内复制把信息复制到它所在站点的其余DC上。关于桥头服务器的更多信息,请参见附文《桥头服务器》。
复制得到了什么?
考虑AD对更改一个DC的目录对象的能力,AD需要一种有效的方法去判断哪一个对象已经被更改以及是否需要被复制到复制伙伴的其他DC中。AD使用更新顺序号(Update Sequence Number,USN)来跟踪什么时候目录发生变化,USN是由AD在本地每台DC指定的64位计数器。当AD、用户、管理员或者应用程序更新一个属性时,DC查看属性的当前USN值,把值增加,并且对更新的对象指定一个新的值作为它本地的USN。
在AD复制拓扑内部,复制伙伴以一种高水印(high-watermark)值的方式来保持他们对来自源DC最近更新的跟踪。当一个目的DC从源DC请求更新时,为返回更新,目的DC会把它的高水印值发送给源DC,源DC以这个高水印值作为一个基准,仅发送高水印值高于这一基准的目录对象到目的DC,因此减少了网络线路中不必要的复制数据流量。
最新矢量(Up-to-dateness Vector)与高水印值协同工作可以把复制数据量降到最小。二者的区别是高水印值考虑的是对象,最新矢量考虑的是属性。在一次复制数据交换期间,一台目的DC发送它的最新矢量到源DC,源DC使用这个值来判断目的DC对一个特定的属性是否有最新的值。如果值是最新的,源DC就会从它发送到请求数据的目的DC的数据中将这一属性过滤掉。
在你部署AD之后,你需要在你的工具百宝箱中装载解决任何存在的问题所必须的实用程序。Microsoft Windows 2000 Resource Kit中包含许多这样的工具,还可以在Windows 2000 Server CD-ROM的“\support\tools”文件夹(即Windows 2000 Server支持工具)中找到大约50个这样的程序。为了解决可能的复制问题,你有时需要同时使用这些工具中的其中几个。
事件查看器。Windows默认的事件查看器位于“开始”*“程序”*“管理工具”中,事件查看器一般在发生问题的第一时间内告诉你一些基本的情况。在一个AD部署过程中,DC有一个称为目录服务的新的日志类型。为即时跟踪最新复制相关的事件,你应该监视你DC上的目录服务日志。尽管你能够连接到其他DC来查看他们的日志,但事件查看器一次只能显示一个服务器的日志,为获得一份包括来自你所有DC上复制相关的事件项目的报告,我推荐你使用复制监视器程序。
复制监视器。Replmon.exe是一个GUI程序,它包含在Windows 2000 Server的支持工具中。你能够使用Replmon获得你企业中AD复制的一个概况,你可以从DC中收集这样的信息来判断复制是否已经发生。当复制发生时,DC之间的数据包就会相互传递,并且很多。
Replmon为收集所有来自你DC上复制相关的事件项目提供了一个来源。为了运行Replmon,单击“开始”*“运行”,并输入:
Replmon
这个程序打开时没有与任何服务器连接,你需要手工添加希望监视的服务器。一个快速添加服务器的方法是创建一个包含服务器列表的.ini文件,每一行一个名称。然后,从Replmon菜单条上单击“File”*“Script”,并找到你创建的.ini文件,单击“open”,Replmon会显示你的DC及DC所拥有的NC。在图2所示的例子中,我添加了testdc01这台服务器,在testdc01项目下面,你能够看到这个DC所拥有的三个NC。为查看你能够使用Replmon所实施的任务,如图2所示那样,右击服务器名称。你应该熟悉这里的各个你需要排除NC复制问题时能够提供在事件中的任务及信息。
图2
一个特别有用的Replmon特性是它具有快速收集与复制失败相关的目录服务项目的能力。为了从你收集的数据中打开一个分离的窗口,单击 Replmon菜单栏上的“Action”*“Domain”*“Search Domain Controllers for Replication Errors”,单击“Run Search”,Replmon提示你输入你希望进行搜索的域,输入DNS域名,然后单击“OK”,程序查询域的DC并且收集与复制失败相关的错误,显示这个产生错误事件的DC,受影响的目录分区或者NC,包括的复制伙伴及失败代码与原因。Replmon独立地查询每台DC而不是从一台DC上收集所有的目录信息。
域控制器诊断。Dcdiag.exe,你可以在Windows 2000 Server CD-ROM上发现这个命令行工具,它是一个强大的诊断工具,提供关于你运行这个程序的DC上的大量数据。Dcdiag可以诊断DC上的连接、复制、拓扑完整性、用户权限、定位器功能、站内健康状态、信任校验、文件复制服务(FRS)及关键服务器的状态。
如果你运行Dcdiag,会产生大量的信息供你进行详细审查。我推荐你使用这样的语法:
dcdiag >
把输出结果重定向到一个文本文件中,然后你能够在记事本或者Microsoft Word中打开这个文本文件并且可以非常容易地浏览信息。当你在排除一个问题时,就可以检查文件中任何失败记录或者注意那些可能提供关于问题本质的线索记录。
Repadmin。Repadmin.exe是一个你可以在Windows 2000 Server CD-ROM中发现的命令行工具,可能是你复制百宝箱中的一把锤子。这个工具能够揭示出复制的内部工作过程,并帮助你排除和修复问题。查看Repadmin命令行选项,输入下面的命令:
Repadmin /?
Repadmin其中一个特别有用的就是显示一台DC的复制伙伴。输入下面的命令:
Repadmin /showreps
图3
图3显示了在一台被称为testdc01的DC上运行这个命令的结果,你可以看到testdc01有来自testdc02的架构、配置和testdomain.com三个NC的入站连接对象,图3同时显示了最近在6月3日不同时间发生的复制各个NC的尝试且这些尝试都是成功的。屏幕的下半部分显示了testdc01在它有目录数据复制时将发送复制通知的出站复制邻居。你也可以使用Repadmin查看关于一个AD中特定对象的详细信息,如你希望查看一个对象的本地USN及最近更新对象属性的来源,可以使用repadmin来显示对象的元数据:
repadmin /showmeta