【SQL SERVER】 搭建AlwaysON高可用组

时间:2022-04-05 21:32:59

项目需要保障数据的高可用,于是可选的方案无非是Oracle集群、 传统的主从+心跳切换访问点以及SQL Server AlwaysOn这类方案。(//经验不多,了解和实践过的方案就这类,轻拍)

Oracle太大,项目初期的核心开发人员并不会用(从高校中途接手的项目,前期都是研究生在做),所以本身就被限制在SQL Server这个技术栈里了,好在了解到SQL Server 2012开始具备AlwaysOn的组件,完全满足项目要求,所以这个方案就这么确定了。

 

【SQL AlwaysOn技术简介】

Always On 可用性组功能是一个提供替代数据库镜像的企业级方案的高可用性和灾难恢复解决方案。 SQL Server 2012 中引入了 Always On 可用性组功能,此功能可最大程度地提高一组用户数据库对企业的可用性。 “可用性组” 针对一组离散的用户数据库(称为“可用性数据库” ,它们共同实现故障转移)支持故障转移环境。 一个可用性组支持一组读写主数据库以及一至八组对应的辅助数据库。 (可选)可使辅助数据库能进行只读访问和/或某些备份操作。

可用性组在可用性副本级别进行故障转移。 故障转移不是由诸如因数据文件丢失而使数据库成为可疑数据库、删除数据库或事务日志损坏等此类数据库问题导致的。

 

核心内容呢,看上去一样是个主从的部署方案,但是对于主从而言,仅仅能够在一个频率下实现数据的备份,并不能无缝切换。而AlwaysOn在基于windows故障转移群集技术上实现了自动的转移,即是说如果你有A B两个节点,A做主,那么B会保持同步,并且在A挂了后自动衔接服务。对外访问而言,整个集群暴露的是一个虚拟ip,这个ip就是这个集群的访问点。

这样一来,集群建好后,整个集群就被黑箱化了。

 

【SQL SERVER】 搭建AlwaysON高可用组

 

按照官方说法,可用性组支持到一个主节点和8个辅助节点(副本)

这样不管怎么想,对于常规的业务完全足够富裕。

 

【硬件、网络环境】

在我的例子里,硬件环境一共使用了4台电脑。他们的作用分别是:

1. Dell R730 *2, 集群节点,数据库节点。

2. Dell 3010         集群仲裁见证所需共享存储。

3. Windows Server 2012 R2 VM, 集群域控。

 

我的网络环境是单网,在我的办公局域网中单独给这四台PC建立一个域 abc.com。

实际上生产环境绝对不应该这么做,好的做法应该是集群在内网,外网业务单独走一个对外局域网,用数据中间件进行到数据库的交互。

只不过先建立好这个双网环境再来搭建集群,可能会踩到坑。

 

需要注意,因为是在域环境里,所以域控一定要一直开着,否则你无法使用域账户登陆。

所以这里我使用虚拟机做域控并不可取。(我是为了项目现场部署方便)

 

 

接下来简要介绍一下启动AlwaysOn之前的步骤,因为实在有点多所以暂时不写细了…

要想看Step By Step的步骤,请移步:

从0开始搭建SQL Server AlwaysOn 第一篇 【配置域控】

从0开始搭建SQL Server AlwaysOn 第二篇 【配置故障转移集群】

从0开始搭建SQL Server AlwaysOn 第三篇 【配置AlwaysOn】

 

这三篇讲的非常细致,特别感谢博主。

【前序步骤】

0. 系统环境准备

  系统环境推荐使用Windows Server 2012 R2系统,并且一定要安装为 DataCenter,否则不支持故障转移。

  软件方面,新系统安装后要使用角色管理器添加 .Net Framework3.5, 否则无法安装Sql Server 2012 sp1.

  修改网络环境,根据我踩了坑之后的经验,建议如果你要使用双网络环境,优先在只有内网环境(群集用网)上完成搭建,后续再加入外网环境。

  SQL Server 此时可以不装,万一群集建立失败要重装电脑呢。。。

  

  建议到这里,使用Ghost之类的工具把系统备份一下。因为如果群集建立出问题,有可能节点无法清除群集的配置,这样你没办法再加入新的群集,而且很可能无法退出旧集群且无法使用Clear-ClusterNode工具。

  退出群集的步骤,以后有时间再写博客了。

1. 搭建域环境

  建立域环境是为了创建故障转移集群,实际上做完搭建你就会明白,域环境是为了确保能够直接以windows账户进行节点之间的登陆认证。

  所以域用户你可以新增多个,但是最终要在两个节点上使用一个域用户登陆进行配置。

  节点加域后,务必记得把域账户添加到当前PC的Administrators 组里,否则建群容易出现权限问题。

  

  群集仲裁见证是这样,你可以理解为节点之间总要有共享的位置来进行文件交换,就像双机的热镜像方案一样,需要一个共享存储来进行数据的同步。

  所以放这个见证文件夹的PC必须要和集群一起运行,且在网络里能够被所有节点访问到。引用的博客第二篇有提到,偶数节点的话一个共享文件夹即可。

  为了减少权限问题,我把这个pc一起加入了域环境里。(这个可做可不做)

  

  域环境搭建好之后,进入故障转移的配置。

2. 配置节点的故障转移群集

  首先你要使用Administrator账户登陆,而不是域账户

  之后使用服务器管理器,在添加角色和功能里,进入功能选项找到故障转移群集,让服务器配置为故障转移模式并且安装故障转移集群管理器。

 【SQL SERVER】 搭建AlwaysON高可用组

故障转移群集管理器长这样:

【SQL SERVER】 搭建AlwaysON高可用组

  因为我这是 事后.jpg (逃) 上边已经有我的群集列表。

  这一步OK后,确保节点上的防火墙都关闭,再继续配置故障转移群。(务必注意,建立域环境后网络会多一个域网络,所以如果没有检查,很可能它的防火墙是开启状态。这样会导致群集找不到对应节点。)

  关闭防火墙确保节点之间通信顺畅的做法是因为一般会专门使用一个防火墙设备来对外。另外如果多重网络下,理论对内网(专网)和域网络之外打开防火墙不存在太大影响。

 

  在故障转移群集的配置中,验证配置里警告都可以忽略,但绝对不能有错误。 有些警告最好是浏览一下。

  在验证通过后的配置中,先不要勾选 “将所有符合条件的共享磁盘加入群集”选项(这个在上文博客里有提到。)

  

  群集建立好后,你能够按你的配置ping到这个群集的对外ip,如图:

  【SQL SERVER】 搭建AlwaysON高可用组

 

   【SQL SERVER】 搭建AlwaysON高可用组

  按我的理解,这个集群相当于对外是一台虚拟机了。

  到此,前期准备工作基本OK。

 

【SQL Server AlwaysON 配置】

0. SQL Server版本要求

  务必使用 SQL Server 2012 Sp1或以后版本,否则会踩到一个坑。(引用第三篇有提到这个坑)

1. 安装SQL Server

  使用Administrator账户登陆安装,否则同样会踩到一个坑。(引用第三篇也提到。)

  安装时要选择全新安装,配置按需走即可,但是最好确保数据和日志目录在每个节点上一样。

  另外在安装中设置账户那一个步骤,引用博客提到要把SQL Server 数据引擎和SQL Server Agent的账户从默认的NT 账户改成域账户,这个我估计是博主写错了,因为在Administrator下安装,这里是选不到域账户的。

  所以这个步骤建议填写Administrator账户。 (安装好后会做修改)

  一定要使用sa账户混合验证!

 

  其他的按照博客做就好。

  安装后的步骤是,在服务里配置Sql Server服务、SQL Agent服务的默认登陆账户为域账户,之后务必检查在两个节点上是否能够以对方节点的计算机名+域账户登陆。

  (一开始使用双网环境来装,这里极其容易出问题。虽然SQL Server支持多网卡路由,但是我遇到的情况就是无法以这个组合登陆,只能用内网IP+ sa,这样AlwaysOn配置的路由是内网的话,最后一步是无法成功的。)

  

2. 上述工作确认好后,开始进行配置。

  首先,SQL的配置管理器打开,启用AlwaysOn可用性组。 每个节点都要操作,最后在SQL的实例里通过属性验证。

  【SQL SERVER】 搭建AlwaysON高可用组

 

  验证AlwaysOn启用:

【SQL SERVER】 搭建AlwaysON高可用组

 

   验证好两个节点后,在SQL Management Studio的对象管理器里可以看到AlwaysOn高可用组可以右键添加可用性组了。

【SQL SERVER】 搭建AlwaysON高可用组

  这是最后建立的结果。

 

3. 准备数据库

  因为可用性组是对数据库而言的,所以这一步要先准备数据库。 从单机服务器上迁移来的数据库,你需要进行完整备份后,在其中一个节点上恢复数据库。

  之后在这个节点上再一次对这个数据库进行备份操作,并且要注意,这个备份必须是With No Recovery的。 【一定要检查好,否则最终不能链接到这个副本进行同步】

 

  这里新备份的数据库拷贝到节点B上进行恢复即可。

【SQL SERVER】 搭建AlwaysON高可用组

  如果是上述操作恢复了之后,B节点上这个数据库的图标会有一个绿色的箭头,并且括号里的状态是(正在还原...)

 

  以上步骤结束,就可以正式进入可用性组的建立了。

4. 可用性组创建

  在上文提到的可用性组上右键,选择新建可用性组向导:

  【SQL SERVER】 搭建AlwaysON高可用组

 

  之后选择数据库:

  【SQL SERVER】 搭建AlwaysON高可用组

  需要注意,这里只列出用户数据库,即我们之前还原的数据库。特别要注意状态列给出的信息,如果不是“满足先决条件”是不能进入下一步的。

  先觉条件主要是1. 用户数据库,2. 完整备份 ,满足这两个条件这里就不会报错。

  但是如果B节点没有一个 With No Recovery的还原,B不能被加入可用性副本。

 

【SQL SERVER】 搭建AlwaysON高可用组

  这一步需要注意勾选配置如图。 (图自引用博客)

  另外端点选项卡的配置,默认的url是计算机名:端口,建议手工填写 IP:端口,这样可以强行指定alwaysOn组内部的路由。否则如果保持默认, 在多重网络下访问的路由是随机的。

 

  之后顺着向导走即可,到最后一步成功的话,应该如图:

【SQL SERVER】 搭建AlwaysON高可用组

  图自引用博客

  一定注意,如果最后一步失败,原因大约是: 防火墙、 B节点不是恢复模式、A B节点不能互相使用windows账户验证(检查域环境、考虑是否存在多网冲突)

  

  实际上到此,你会发现AB节点上的状态变成已同步,目前也可以直接使用前文提到的故障转移群集的对外IP + 域账户登陆到高可用组的数据库实例。

  可用性组也有了你配置的可用性组对象。

 

  之后对这个可用性组建立侦听器,我的理解是使用侦听器可以和群集的IP独立开。实际上侦听器可以任意配置另一个访问点IP。

 

  到此,整个AlwaysON搭建完成。

 

 【后记】

折腾这个还是耗费了不少时间,特此记录。希望对看到博客的你有所帮助。