上半年的任务, 有一项是关于 sql server advanced topic 的,advance topics 里面又有一项重要的是关于集群。那就有的研究了。
sql server 的集群,英文全名称叫 Failover Clustering, 属于高可用性的范畴。 简单来说,提供的作用, 就是保证 7 X 24 小时持续不断的提供服务,及时当中有个别服务器宕机了,其他服务器会无缝的顶上去,继续保证应用的可用性,而用户在这宕机的过程是没有太明显的感觉的,除了当前运行的一些操作有一些停顿。在切换已经宕机和可用服务器的过程中,代码可以是在异常部分做了切换的操作。
这里面牵涉到两个方面,一是代码如何编写,这部分我是从来没有涉及过,也就是没有这样的编程经验,得补上;二是如何搭建这么一个 Failover Cluster ,以及怎么个自动切换或者手动切换,如何去监控这些服务器的运行状态。 曾经在 Windows Server 2003 做过一次 sql server 2000 的集群搭建,搭建过程比较粗糙,完全按照网络的日志或者博客,一步一步实验下来。对其中涉及到的概念没有做深入的研究,比如什么叫域,域控,虚拟子网,心跳,故障集群(这里是不是还得有 load balance 集群,提供多台服务器的网络负载?1 台服务器的性能及服务对象是有限的,但是多台服务器就能解决并发问题了。 这里是不是有分布式服务的概念了?),以及仲裁磁盘,ISIC , SAN , Hyper-V 等。 看吧,只有多问自己几个问题,在技术上还是完全有晋升空间的。
那么,针对这次的 sql server failover clustering 就多问自己几个问题吧:
1 搭建这么个集群,需要多少组件,包括硬件的,软件的:
凭空现在想象的有:
windows server 2008 ( 及以上 ) Failover Clustering,
sql server 2005(及以上) Enterprise Edition ; sql server 2012 以上有 AlwaysOn 这个概念了,而不仅仅是 High Availability.
步骤:
1.1 准备 3 台虚拟服务器,1 台用来做域控,共享存储(但是后来发现还是要单独拿出一台做共享存储,因为 windows server 2008 不支持将共享存储服务放在域控或者任何一台集群节点上),2 台用来做 Failover Cluster nodes.
安装域控,Active Directory Domain Service, DNS.
安装中出现的问题:
1.1.1 Active Directory Domain Services (简称 ADDS) 不是Feature 而是 Role, 所以要在 Add Roles 里面新建,并且不能和其他 role 一起安装。必须先安装 Active Directory Domain Services。
1.1.2 ADDS 安装过程中会重启服务器,安装完毕之后,运行 dcpromo.exe 来配置 Domain Controller.
1.1.3 A delegation for this DNS server cannot be created because the authoritative parent zone cannot be found or it does not run Windows DNS server. 安装 DNS Server 的时候碰到类似这种提示,我猜他的大意是,你不需要做任何操作,如果你只是在内网里搭建的话。因为我确实只是在虚拟机里面做实验,所以不管它。
1.1.4 有一步需要配置 Active Directory Domain Controller 的 database, log files 和 SYSVOL 对应的文件夹,那么我们默认给出的就好了:
c:\windows\ntds; c:\windows\sysvol
1.1.5 Directory Services Restore Mode Administrator Password: 和 Domain Administrator account 不同,重新指定一个密码: Smart123456.
1.1.6 ADDS 安装完成: this active directory domain controller is assigned to the site “Default-First-Site-Name”. You can manage sites with the Active Directory Sites and Services administrative tool.
1.1.7 将其他 2 台 server 添加到这个域的时候,本以为只要修改域名,将其指定为已经搭建好的 ADDS 服务器就可以了。但是报错了:An Active Directory Domain Controller(AD DC) for the domain “smartoffice.com” could not be contacted.
更新:2016/3/26
解决方法是将这两台要加入域的计算机的 DNS 指定为我们新建的这台 DNS 服务器的 IP。然后再加入域。
1.1.8 创建 iSCSI: 启动 Microsoft iSCSI service 即可。在启动 iSCSI Service 之前,必须先下载 iSCSI Target, 在微软官方网站即可下载。
1.1.8.1 创建一个 iSCSI Target, 名为: smartofficetarget, IQN(标识符,可被访问的资源名)为 smartofficetarget.smartoffice.com.
1.1.8.2 为上面创建的 target 附上 2 个虚拟的文件当做存储,指定文件大小
1.1.8.3 然后指定 iSCSI identifier, 这里很要小心,iscsi identifier 与 target 之间是双向绑定,现在 target 创建的时候,就要指定可以访问的 iscsi identifier(也就是可以访问这个 target 对应存储的服务器)。而且,尽量不在 Domain Controller 上建立 target, 我这里卡了很久,直到换了一台非域控的服务器。最后需要给“硬盘”(这里是虚拟出来的)格式化。有个问题留在这里,这个 iSCSI 指定的硬盘到底用来派什么用场?答案是派两个用途:一块用来仲裁,一块用来放数据。基本配置 2 快就够了,但是如果是生产,那么就多多益善了。
更新 : 2016/3/27
1.2 安装 windows server failover cluster
1.2.1 这里需要特别指出,因为在这里耗费了大量的时间:
首先,我是创建了个 windows server 2008r2 的 VM, 然后拷贝 2 份当做 cluster node. 本来图个方便用 domain administrator 账户来配置 failover cluster , 结果提示不能 load 拓扑。就是传说中的 ox80070005,看指示 ” access denied” 应该是访问不通,然后开了一堆的 services, 凡是跟 network, remote 相关的服务都开启来,把防火墙关掉。结果不行,这一次尝试失败了。
然后开始建立域用户,尝试了往 local administrators group 里面加域用户,也尝试了用 group policy 的方法来添加组,给域用户授权,结果还不行。相当搞笑的是,每次忘 local administrators group 里面加了域用户之后,下一次打开,发现只有 administrator 在里面,其他新增加的域用户都没了。重新添加的时候,会报该用户已经在这个列表里面了。好奇怪的错误,还以为是微软的 bug. 其实答案在下面。
最后 bing.com 提示,还能尝试用 sysprep 来搞定,具体是什么鬼,试试再说。bing.wikipedia 上的解释,sysprep 就是让你分发你手中的 windows,好吧,那 sysprep 相当于是 system prepare 了。经过一番折腾,安装了一系列服务之后,果然,在 local administrators group 里面看到我要添加的域用户了。互联网时代的东西,你想了解的都可以在网上找到,你不是一个人!
更新:2016/3/28
1.2.2 Access Point for a Cluster:
cluster name: smartofficedb
networks: 192.168.2.0/24 address: 192.168.2.110
这个步骤因为 duplicate physical address of windows failover cluster virtual adapter 的问题,也耽误了一下。原因是我用了同一个虚拟机拷贝出来的三个 VM 做节点,并且在 failover cluster feature 安装的情况下做了 sysprep 导致的。所以重做一个 VM 并且 sysprep 下看看是不是有解决问题。
更新:2016/3/29
另外,这里需要意识到的一个问题就是共享磁盘的问题:到底需要多少磁盘,以及每个 node 对磁盘的挂载。创建一个 iscsi storage server, 配置 iscsi target 以及虚拟磁盘,让每个 Node 都可以 initialize 到这些虚拟磁盘上。比较郁闷的是安装有 iscsi target 的服务器是不能用 initializer 来自己创建的 target。
更新:2016/3/30
这里碰到一个心跳的问题:作为心跳的两块网卡(vmware 里面只要新增两块虚拟网卡),只允许做一件事,就是 communication. 其他都不能做,把网卡属性里除了 IP4 的其他都去掉,设置两个相邻的 IP 地址,比如 10.10.10.1 / 10.10.10.2 , 并且设置为不在域里面自动加入后缀,禁用 NetBIOS. 否则,即使所有的 validation 都过了,cluster 还是不能创建成功,可能会报超时的问题。在创建 cluster 之前把 iscsi 的磁盘都 bring online 会提高速度。
更新:2016/3/31
1.3 安装 AlwaysOn Failover Cluster Instance
相对简单,一路 next.
2 怎么去监控这个集群的运行状态?
2.1 运行的集群可以提供多少并发量
2.2 运行的集群宕机的记录以及现状
2.3 如何手工去切换集群的活动节点
3 模拟宕机过程
3.1 编程去实现访问这个集群
3.2 刻意让其中一台机器宕机
3.3 观察并发量,找到最大并发数及系统指标参数。这应该是个平衡点。
逐一解答:
1 首先要明白 域 的概念
1.1 为什么有域,域的作用与创建
域是一种分而治之的思想,所有在网的计算机资源都有自己的 IP, 访问这些计算资源,靠着 IP 来定位,就不那么容易被人类识别了,容易忘。所以域服务器是用来记录 IP 与资源名的对应关系。
在 windows server 中,DNS 是实现的底层,管理和配置这些 DNS,应该是由 Active Directory Domain Service 来实现的。首先 AD DS 用 Dynamic DNS 来发布自己的 IP ,使得其他 DNS 知晓自己的服务存在,也同时拉取其他服务器提供的服务及对应 IP。 AD DS 使得几台 DNS 之间的记录共享并不断同步更新。 在 Dynamic DNS 发明之前,只有靠人工手动同步 DNS 之间的映射信息。
所以 DNS Server 的创建也可以由添加 AD DS Feature 的时候同时创建。
1.2 如何加入一个域
1.3 域的管理:增删改
1.4 域控的高可用?集群还是双机?
1.5 DNS 和 Active Directory DomainService 的区别
2 仲裁 Quorum (这里翻译为仲裁人数或者仲裁数目,更能被好理解些)
2.1 仲裁的作用:决定了 Cluster 是不是起作用,能不能跑起来;
2.2 仲裁的创建:
从 windows server 2008 开始,不再是单一的仲裁磁盘了。而是提供了多种模式的仲裁,比如文件,磁盘,节点等。这样就避免了单一的磁盘仲裁缺陷。在 windows 2003 仲裁只用磁盘,那磁盘一旦失联,整个 cluster 就要当机。
仲裁是由 cluster software 配置的。这里有俩个概念需要弄清楚,一是 Failover Cluster Manager SnapIN,二是 Cluster Software。
2.3 仲裁的管理
2.4 仲裁的机制:这里有个概念叫做【多数】,英文名叫做 Majority. 他有两个特点,一是自动被决定,二是动态的。
自动被决定,是指在一开始确定 cluster nodes 数量的时候就被指定了,就是比一半的 nodes 数量多一。假如有 5 个服务器,当有 3 台当机的时候,这个 Cluster 就不能继续跑了。而只有两台服务器宕机的时候,这个 Cluster 还是可以跑的。所以服务器数量最好是基数,这样比较好判断。
动态,基于第一个特点,随着服务器数量的增多,仲裁数目也就相应增加了。
3 两种 clustering 方式
3.1 Failover Clustering : 主要提供高可用 High Availability 。
硬件要求:必须由微软认证。
软件要求:服务器(版本,补丁,机器硬件配置等);网络(统一子网,同域,心跳,IP);存储(共享存储)。AD DS( Active Direcory Domain Services) 角色(roles) . 存储,在生产环境,肯定是要用 SAN 的,以光纤级传输。但是开发测试环境,我们用 iSCSI 来创建一个共享存储就够了。windows server 2008 自带。
安装:从 windows server 2008 起,系统组件 (components) 都从 Add-feature 安装,这里要装的系统组件就是 Failover Cluster. 装完 Failover cluster 之后,会有 Failover Cluster Manager SnapIn 来管理Failover . 底层的服务是 Cluster Service. 软硬件的验证也是由 Failover Cluster Manager SnapIn 来完成。可见配置软硬件在前,设置 Failover Cluster 在后,最后启动管理 Cluster Node 。
从安装方法就看得出来,windows server 的管理方式也在改变,与时俱进掌握最新的特性是很有必要的一件事情。时刻关注新动向,写下新特性的分析,动手做些个实验,记录下心得。要有这个意识!
安装步骤:
3.1.1 验证必要条件:软硬件配置
除了软硬件,还有其他的配置需要提前创建好。
比如,clustered storage, 可以在创建集群的时候制定,也可以在集群创建好之后再创建;所有的服务器必须加入同一个域下面;创建域用户并赋予这些用户管理员级别权限,以便他们在服务器上创建集群。
3.1.2 在每台服务器上,添加 Failover Cluster feature.
3.1.3 通过 failover cluster manager snapin 的 Validation 去验证各类配置
3.1.4 通过 failover cluster manager snapin 来配置和启动 cluster
这里有个概念:Access Point for Administrating the cluster. 这个 AP 需要给他配置一个 NetBIOS Name 和 一个专用的 IP.
3.1.5 创建 AD DS Clustered Roles。
很有必要,通过 powershell 来自动化掉一部分重复操作!
3.2 Network Load Balance : 主要提供高扩展性 Scalability ,负载均衡。仔细想来,那么多 cluster 还不是为了高可用,至于水平扩展,瓶颈还是在写,多几台机有啥用?还是各种锁。把读通过 replication 剥离出来,搞那么 7,8 个从库,并发妥妥的。但是写就惨了,ACID 得让你按规矩来,该排队还是要排队。
3.3 各自的搭建方法
4. AlwaysOn availability Group
单点故障最有可能是发生在存储这一级。因为存储没有做多点冗余。靠 SAN 只能支持本地高可用,极端的例子就是本地机房地震了,就歇菜了。
针对这个问题,AlwaysOn 提出了availability group. 做到数据库级别的冗余,异地数据同步之后,高可用就提高了一些。
当然 availability group 与 Failover cluster 能结合起来用。