亲身经历的一个项目,老板忽然提出,对数据库的负债要实施分流,来个数据库一个负责读,而另一个负责写,后台是需要同步两个数据库的状态。找了很多的资料,发现新版的alwayson可以实现这个功能。

研读了alwayson 的大量资料,发现他的功能增加了不少,不但不再依靠原来的share disk的架构,而且增加了更大的灵活性,据说要取代log shipping 和Mirror database。不是帮助微软吹嘘,真的进步不少,但还是一个库是只读的,一个为可以读写。

一下是实施的具体步骤,和在实施中说遇到的问题及解决办法:

一 实施的架构

我们采用了三台服务器,其中两台是SQL Server,另外一台是文件服务器(用来投票)。架构如下:

 

SQL Server2019配置always on高可用图文步骤 sql server always on_SQL

微软有写过白皮书,他所介绍的建构是四台机器,其中一台在不同的站点中,我们公司没有那么有钱,我们只是采用了2台机器的架构。

具体的微软的文档可以参照我之后的文档列表。

二 准备步骤

考虑需要用什么样的投票架构。在这之前,微软使用的架构是share disk的高冗余建构,因为要使用共享的存储,很多条件下难以实施,才采用了现在的几种该机的方法,新增加的有三种,共四种,如下,是微软的原话,不多解释,有兴趣的可以顺着我后面的链接,研究。

SQL Server2019配置always on高可用图文步骤 sql server always on_Server_02

但总的一条原则是: 总的服务器数量最好是奇数。

我们采用了3台服务器的工作方式(其中一台为文件服务器)

三 详细步骤如下

1. 在所有的三台Windows server 2012 服务器上安装Windows Failover Cluster Server. 并且运行Windows failover Cluster 向导新建一个Windows Cluster.不一定要有共享的存储。我采用的仲裁方式为:偶数站点+文件共享 的方式建立仲裁机制。用的另外一台文件服务器做的quorum. 仲裁方式的选定需要注意的是: 所有的Node(包括文件服务器)的总数最好为奇数(Odd).

详细的配置如下:

SQL Server2019配置always on高可用图文步骤 sql server always on_SQL_03

2.建立好Windows Failover Cluster 后,再在每个server 上安装SQL Server.在SQL Server Engine中的Avaiable Group 标签中,输入刚刚建立好的Windows Failover Cluster 名称。开启Avaiable Group 功能。

SQL Server2019配置always on高可用图文步骤 sql server always on_服务器_04

3. 根据Avaliable Group 的向导建立新的AG组。比较重要的步骤是建立AG的侦听器。其中要注意的地方是:刚刚建立的WFCS的名称中的侦听(wfsc 的侦听)对所在的域控制的OU具有特殊的权限--'Create object' , ' Read all priority' 。其目的是,需要通过WFCS的名称来建立具体Role 的侦听器(侦听器有自己的名称和所对应的IP地址),WFCS 通过自己的域账号(类似于服务器名称)建立自己Role中的侦听器(AG也属于WFCS中的一个具体的应用。

SQL Server2019配置always on高可用图文步骤 sql server always on_Server_05

如果顺利AG就算是建立好了。没有什么特别的东西。根据微软的白皮书,一步步的往下走就可以了。

但是,微软毕竟是微软。在部署的过程中,遇到了很多的问题,很多在白皮书中没有设计,好在都解决了。现在细数一下,这些微软给我们挖了的这些坑。坑的这个词,是我在遇到问题后,才找资料时看到的有些同仁说的。觉得很恰当,拿来主义了。

坑一: 建立好AG组后,不能打开WFCS控制见面,出现如下错误:

SQL Server2019配置always on高可用图文步骤 sql server always on_SQL_06

是WFCS自身的问题,需要安装相应的补丁:KB2750149

坑二: 所建立的侦听不能自动的分配SQL Server的链接(读链接和写链接)。AG的一个很大的特点就是:可以实现数据库的读链接和写链接的分离。但是测试后,发现说建立的alwayson 的侦听不能实现读写的数据库分离。很郁闷,在测试时,读和写的Session都集中到了一台服务器上。还是在微软官方的MSDN上找到了答案。

1. 建立好AG后,需要在不同的服务器上设置Read-only routing list .只需在一台服务器上(primary)上设置即可,会自动同步到其他的(secondary)服务器上。命令如下,只能用SQL或Powershell 完成。

1)建立secondary 的URL链接。

微软的例子如下:

SQL Server2019配置always on高可用图文步骤 sql server always on_SQL_07

AG1:是AG的名称,可以根据自己的定义修改。

computer01: 说明在那台SQL上,

TCP后面的地址也要修改。

2)建立Read-Only list 表,原理是: 主的SQL Server发现有只读的session进入时,会根据这个表来移到到底在哪个只读服务器接收。

SQL Server2019配置always on高可用图文步骤 sql server always on_服务器_08

因为每个服务器都有可能为primary 服务器,所以两个都要加。

坑三: 链接Session 只读的一定要制定 Application intent =Read Only 和链接的AG数据库。否则还是不能分离读和写sessions.

SQL Server2019配置always on高可用图文步骤 sql server always on_Server_09