最近参与的一个项目,因为我负责服务器相关的环境搭建,被甲方告知需要实现数据库的高可用,由于服务器与数据库是甲方提供的,一般这种情况都是谁提供谁负责,也不知道为什么就落到了我头上,不管怎么原因总之我是兴奋的,因为之前只是对集群的概念有所了解,并没有真正实践过。
甲方的需求是A,B两台服务器部署数据库,能够在其中一台机数据库服务奔溃后,迅速启用另外一台的数据库服务,以实现数据源的高可用,SQL Server提供了好几种解决方案,最开始看的是镜像数据库,发现是过时的结局方案后,又有个故障转移群集看了几分钟发现目录下面还有个Always on,最终选择了它,关于这几种方案的优劣,下文会有解释
数据库镜像:此功能处于维护模式并且可能会在 Microsoft SQL Server 将来的版本中被删除。 请避免在新的开发工作中使用该功能,并着手修改当前还在使用该功能的应用程序。 改为使用 AlwaysOn 可用性组。此为官方文档原话!
故障转移群集实例(FCI):SQL Server 利用 WSFC 服务的高可用性和灾难恢复方案,由一个域控服务器与多个sql server服务组成一个群集,每个服务就是一个节点,当其中一个服务不可用时,会将自动将另一个可用的启用,需要域控服务器。
AlwaysOn可用性组:AlwaysOn 可用性组 功能是一个提供替代数据库镜像的企业级方案的高可用性和灾难恢复解决方案。此功能可最大程度地提高一组用户数据库对企业的可用性,支持去中心化。
官方文档关于故障转移群集实例(FCI)与AlwaysOn可用性组的异同
因为这是微软官方推荐的SQL Server高可用的技术,配置简单,支持去中心化,最多支持1个主副本8个辅副本。
SQL Server 2012年或更高版本
服务角色名称 | IP | 名称 |
节点1 | 193.168.25.125 | mesdatadev.net |
节点2 | 193.168.25.124 | mesdatatest.net |
集群IP(虚拟网址) | 193.168.25.201 | cluster |
侦听器(虚拟网址) | 193.168.25.189 | guard |
服务器已经准备妥当,数据库已经正常安装,关闭防火墙,开始下面的步骤!
A. 添加故障转移集群服务
1.打开【服务器管理器】,点击【管理】,点击【添加角色与功能】
2.点击【下一步】
3.点击【下一步】
4.点击【下一步】
5.点击【下一步】
6.勾选【故障转移集群】,如有弹窗点击【添加功能】,点击【下一步】
7.点击【安装】,等待安装成功。
B. 添加DNS后缀
1. 使用 Windows 键 + X 快捷方式,选择【系统】,或者右击我的电脑,点击【属性】,服务器不好截图,这里使用自己电脑演示
C. 找到目录【C:\Windows\System32\drivers\etc】更改下面的【hosts】文件,加入各个节点的IP与主机名,集群IP与集群名称,以及侦听器IP与名称。以下是我的环境需要加入的配置参数:
193.168.25.125 mesdatadev.net
193.168.25.124 mesdatatest.net
193.168.25.201 cluster
193.168.25.189 guard
D. 在其他节点重复A,B与C三个步骤即可
E. 创建故障转移集群并添加节点,此步骤在任意一个需要添加到集群的节点均可操作
1. 打开服务器管理器,点击【工具】,点击【故障转移群集管理器】
2. 点击【操作】,点击【创建集群】
3. 点击【下一步】
4. 输入需要组成节点的主机名称,点击【添加】
5. 点击【下一步】
6. 点击【下一步】
7. 点击【下一步 】
8. 点击【下一步】
9. 点击【下一步】
10.验证通过,点击【完成】
11. 配置集群的名称与IP,这里输入事先定好的名称与IP即可,要跟hosts文件中配置的一致,确认无误后点击【下一步】
12. 点击【下一步】
13. 群集创建成功,点击【完成】
A. 节点正常状态
B. 关闭节点1时的状态
C. ping 群集IP,测试是否可用
D. 到这里群集就配置成功了
A. 开启AlwaysOn可用性组:找到SQL Server的配置管理器,选中SQL Server服务,选中服务实例,弹窗时选中AlwaysOn高可用,点击启用AlwaysOn可用性组,点击应用,每个节点的数据库都要设置该项。
B. 设置一个共享文件夹,群集上的节点均可正常访问即可,用于后面同步证书以及第一次的数据同步。
D. 设置密钥与证书,设定节点一位主副本,节点二为辅副本;
1. 节点一的脚本:根据自身的环境进行修改
-- 节点一上执行:创建主密钥/证书/端点,备份证书到共享文件夹中。
USE master;
GO
---- 设定密钥
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '123456.M';
GO
---- 修改密钥,假如不小心输错
ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = '123456.M';
CREATE CERTIFICATE Cert_1
WITH SUBJECT = 'Cert_1',
START_DATE = '2017-12-01',EXPIRY_DATE = '2099-12-31'; --证书的有效时间
GO
----导出证书,将证书放在共享文件夹里面
BACKUP CERTIFICATE Cert_1
TO FILE = '\\MESDATADEV\temp\Cert_1.cer';
GO
---创建端点,
----此账户是连接数据库的账户
---侦听端口,1024 和 32767 之间的任何数字都有效。侦听IP地址,默认值为 ALL,表示侦听器将接受任何有效 IP 地址上的连接
CREATE ENDPOINT [SQLAG_Endpoint]
AUTHORIZATION [MESDATADEV\Administrator]-- 账户
STATE=STARTED
AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)-- 端口
FOR DATA_MIRRORING
(ROLE = ALL,AUTHENTICATION = CERTIFICATE Cert_1, ENCRYPTION = REQUIRED ALGORITHM AES)
GO
---- 执行到这里时,请确保各个节点,设置密钥,生成证书并导出
---- 在主要副本上,还原所有次要副本证书。
---- 在每个次要副本上,还原主要副本的证书,另外在任何其他副本上,也可能是还原主要副本的证书
CREATE CERTIFICATE Cert_2
FROM FILE = '\\mesdatadev\temp\Cert_2.cer';
GO
2. 节点二的脚本:根据自身的环境进行修改
-- 节点二上执行:创建主密钥/证书/端点,备份证书到共享文件夹中。
USE master;
GO
---- 设定密钥
CREATE MASTER KEY ENCRYPTION BY PASSWORD = '123456.M';
GO
---- 修改密钥,假如不小心输错
ALTER MASTER KEY REGENERATE WITH ENCRYPTION BY PASSWORD = '123456.M';
CREATE CERTIFICATE Cert_2
WITH SUBJECT = 'Cert_2',
START_DATE = '2017-12-01',EXPIRY_DATE = '2099-12-31'; --证书的有效时间
GO
----导出证书,将证书放在共享文件夹里面
BACKUP CERTIFICATE Cert_2
TO FILE = '\\MESDATADEV\temp\Cert_2.cer';
GO
---创建端点,
----此账户是连接数据库的账户
---侦听端口,1024 和 32767 之间的任何数字都有效。侦听IP地址,默认值为 ALL,表示侦听器将接受任何有效 IP 地址上的连接
CREATE ENDPOINT [SQLAG_Endpoint]
AUTHORIZATION [MESDATATEST\Administrator]-- 账户
STATE=STARTED
AS TCP (LISTENER_PORT = 5022, LISTENER_IP = ALL)-- 端口
FOR DATA_MIRRORING
(ROLE = ALL,AUTHENTICATION = CERTIFICATE Cert_2, ENCRYPTION = REQUIRED ALGORITHM AES)
GO
---- 执行到这里时,请确保各个节点,设置密钥,生成证书并导出
---- 在主要副本上,还原所有次要副本证书。
---- 在每个次要副本上,还原主要副本的证书,另外在任何其他副本上,也可能是还原主要副本的证书
CREATE CERTIFICATE Cert_1
FROM FILE = '\\mesdatadev\temp\Cert_1.cer';
GO
3. 如果出现没有权限导出证书,检查实例的账户是否有权限
E. 创建可用性组
1. 在主副本上准备一个数据库,输入一些测试数据,并且进行备份,我这里的主副本是节点一。
2. 选中Always On高可用,点击新建可用性组向导
3. 点击【下一步】
4. 输入可用性组名称
5. 选择需要同步的数据库,点击【下一步】
6. 点击【添加副本】,登录另一个节点的数据库实例即可
7. 根据需要配置,配置的含义在官方中有详细的描述。
8. 配置备份首选项,在节点一进行备份,点击【下一步】。
9. 选择数据同步的方式,选中【完整的数据库和日志备份】,输入事先准备好的共享文件目录,点击【下一步】
10. 验证,这里没有配置侦听器,所以有警告,侦听器可以后面配置,不碍事,点击【下一步】
11. 完成
12. 如果辅副本上从主副本同步的数据库一直卡死在 正在还原 状态,可以先把数据从可用性组上删除,没有出现该问题直接看【15】
13. 删除时要在主副本上操作。
14. 继续添加刚才删除的数据库,后面的步骤和创建可用性组向导的方式差不多,就不再截图了
15. 成功后的效果图
16. 数据库同步成功后,开始添加侦听器,可用性组侦听器是一个虚拟网络名称 (VNN),客户端可连接到此名称以访问 AlwaysOn 可用性组的主副本或辅助副本中的数据库。
17. 设置侦听器DNS名称与虚拟IP,使用事先设定的名称与IP,端口使用SQL Server默认的端口1433,点击【下一步】。
18. 侦听器配置成功,做完这一步,基本上就结束了,接下来验证配置是否成功。
A. 检查数据是否能正常同步:修改主副本中数据库的数据,然后在辅副本中进行查看是否同步。
B. 检查侦听器是否可用:使用侦听器的IP登录数据库查看是否能够正常访问。
C. 是否能进行故障转移:重启主副本的数据库服务,查看辅副本是否转换为主副本。
A. 整个配置的话,步骤比较长,总体可分两部分,一个是故障转移集群的配置,一个是可用性组配置。
B. 需要耐心,小心细致。
文档:不建议先看,建议先把整体的实现方式看完,因为官方文档实在过于详细,文档嵌文档,而且可读性不好,但是有个大体的了解再看的话会很有帮助,毕竟是官方!文档在此!!!!
博客:SQL Server AlwaysON从入门到进阶系列文章