delxu原创,转发请注明出处http://delxu.wordpress.com/ 或http://delxu.blog.51cto.com/975660/1406183
域控制器(Domain Controller)的虚拟化早已经不是什么新鲜事了。这是因为域控制器(后面简称DC)本身对资源的要求不是很高,从服务器资源角度来考虑很适合虚拟化。但是,传统DC的虚拟化是存在一定的风险的,这主要来自于一些虚拟化的功能例如虚拟机克隆(Clone)或者快照(snapshot)。如果你曾经对DC虚拟机拍过快照,而又不小心进行了快照回滚(Snapshot Rollback),那恭喜你了,很可能你将不得不把这台DC降级为普通服务器,再重新dcpromo来恢复其功能。
为啥DC不能进行快照回滚呢?
因为快照回滚会导致叫做USN Rollback的问题。USN就是Update Sequence Number,是AD用来标注AD变更的一个号,每次AD有信息变更时,这个号都会变大。DC之间进行同步的时候,就靠比较这个USN来发现是否有变更,是否需要同步,谁同步给谁。
DC还维护一个RID Pool。RID(Relative ID)在domain里面必须是唯一的。RID Pool保证了不管新的对象是在哪个DC上创建的,RID都是唯一的。
当发生USN回滚之后,就有可能出现RID重复使用。而且新的对象创建的时候,因为USN回滚过,这个USN可能比较小,其他DC会认为这个创建动作已经被复制过了而拒绝复制,导致DC之间的AD数据库不一致和复制失败。解决的方法不是没有,但是包括很多手动操作,而且基本上是要demote掉这台DC重新promo才行。
新的Windows Server 2012解决了这个问题。它是第一个“虚拟化感知”的Windows Server版本。微软在Windows Server 2012中引入了一个新的标志符(Identifier)——VM-GenerationID,这个标志符仅用于虚拟机DC,但是需要Hypervisor支持。
获得支持的Hypervisor包括Hyper-V 2012,vSphere 5.0 U2,vSphere 5.1或更新版本。
VM-GenerationID的值作为计算机对象的一部分保存在AD中,同时也保存在虚拟机配置文件中。
- 在AD中,VM-GenerationID的值保存在该Domain Controller计算机对象(computer object)的msDS-GenerationID属性(attribute)里面。
- 在虚拟机配置文件中,VM-GenerationID的值保存在虚拟机配置文件(.vmx)中,由配置vm.genid来表示。所有Windows Server 2012服务器,无论是否DC,都会在起vmx中有这个配置值。
当出现DC快照回滚或者DC克隆的时候,这台DC开机时会对比虚拟机配置文件中的VM-GenerartionID和AD中的值,如果不一样,就认定此DC是由克隆或者快照回滚产生的,这时候,就会发起一系列的任务,包括重置InvocationID、清空RID Pool来防止USN Rollback错误的出现。并且在清空后发起一次AD数据库的同步,将一个AD数据库的权威版本从其他DC复制回来。
delxu原创,转发请注明出处http://delxu.wordpress.com/ 或http://delxu.blog.51cto.com/975660/1406183
VM-GenerationID是由一个叫做Microsoft Hyper-V Generation Counter的驱动程序来管理和跟踪的。虽然这个驱动程序名字里面含有Hyper-V,它并非只能用于Hyper-V,受支持的vSphere版本也是用这个驱动程序的。如果你的系统里面查不到这个驱动程序,那么很有可能就是因为你的Hypervisor不支持。
要查看Microsoft Hyper-V Generation Counter,请打开Device Manager,从菜单中选择View,然后选择Show hidden devices,然后就可以在右窗格中看见了。(如图所示)