目录

* AlwaysOn <https://www.cnblogs.com/jerviscui/p/10895095.html#alwayson>
* 搭建 WSFC <https://www.cnblogs.com/jerviscui/p/10895095.html#搭建-wsfc>
* 配置 AlwaysOn <https://www.cnblogs.com/jerviscui/p/10895095.html#配置-alwayson>
* 可读副本的负载均衡 <https://www.cnblogs.com/jerviscui/p/10895095.html#可读副本的负载均衡>
* 使用故障转移 <https://www.cnblogs.com/jerviscui/p/10895095.html#使用故障转移>
[========]

AlwaysOn

AlwaysOn 可用性组概述 (SQL Server)
<https://docs.microsoft.com/zh-cn/sql/database-engine/availability-groups/windows/overview-of-always-on-availability-groups-sql-server?view=sql-server-2017>

搭建 WSFC

配置计算机的 DNS 后缀

*
配置计算机的 DNS 后缀,注意在同个工作组





*
每个节点的机器都要做域名解析,修改 host 文件C:\Windows\System32\drivers\etc


安装故障转移集群

*
节点服务器添加故障转移群集功能


*
等待安装完成

验证集群

* 打开故障转移集群管理工具

* 点击验证配置

* 添加集群节点

* 运行所有测试

* 可以点击查看验证报告,勾选立即使用经过验证的节点创建集群

创建集群

*
配置集群的管理名称和管理IP


*
等待配置完成


*
可以查看集群报告,稍后配置文件共享见证

创建文件共享见证

由于我们是两个节点的故障转移集群,所以需要加上共享文件夹,如果是奇数节点,这一步是不需要做的!

* 配置集群仲裁

* 选择文件共享见证


* 在集群节点之外的一台服务器上创建共享文件夹\\XIANGMU4TEST01\share,并设置 Everyone 完全控制的权限
配置 AlwaysOn

*
开启 AlwaysOn



*
需要重启 SQL Server 服务

*
检查,如果 AlwaysOn 启用成功,在服务器属性里可以看到启用HADR为True



* 查看各节点的投票数 SELECT * FROM sys.dm_hadr_cluster_members;


* 查看 cluster SELECT * FROM SYS.[dm_hadr_cluster]


新建可用性组

但是既然节点没有加入AD,那么久不能用域认证,只能用证书认证,因此需要创建证书和端点。在配置可用性组前各节点进行证书认证信任。

*
修改 SQL 服务登陆账号为本机管理员账号



* 创建证书,两个节点都要创建证书,注意修改证书名称 --节点二:创建主密钥/证书,备份证书。 USE master; GO CREATE MASTER
KEY ENCRYPTION BY PASSWORD = 'AAA111aaa'; GO CREATE CERTIFICATE Cert_server228
WITH SUBJECT = 'Cert_server228', START_DATE = '2017-01-01',EXPIRY_DATE =
'2099-12-30'; GO BACKUP CERTIFICATE Cert_server228 TO FILE =
'C:\Storage\Cert_server228.cer'; GO
注意:备份证书的文件夹要先创建好,并且赋予权限

* 将创建好的证书放到另一台节点服务器,并加入证书 --节点二:创建其他节点证书 USE master; GO CREATE CERTIFICATE
Cert_server227 FROM FILE = 'C:\Storage\Cert_server227.cer'; GO
证书创建好后如下


* 重新创建端点,授权账号设置为本机管理员账号,验证方式使用上面创建的证书 --节点:创建端点 CREATE ENDPOINT
[testag_endpoint] AUTHORIZATION [POSTEST2-2016\Administrator] STATE=STARTED AS
TCP (LISTENER_PORT = 5023, LISTENER_IP = ALL) FOR DATA_MIRRORING (ROLE =
ALL,AUTHENTICATION = CERTIFICATE Cert_server228, ENCRYPTION = REQUIRED
ALGORITHM AES) GO
如果存在已有的端点,则需要将已有端点删除


*
在主节点服务器操作新建可用性组。


* 设置可用性组名称,建议勾选数据库级别运行状况检测。

* 在之前的 AlwaysOn 2012 和 2014
中,如果实例健康出现问题,将触发故障转移。如果有一个数据库有问题,只要实例OK,可用性组就不会故障转移。
* 在 AlwaysOn 2016 中,勾选之后,不论是一个实例有问题,还是一个或多个数据库有问题,都会发生故障转移。
*
选择数据库,要求数据库已经进行了完整备份


*
添加副本节点,并勾选自动故障转移,设置辅助副本为可读副本


*
将端点 URL 设置为 IP 方式,这里端点会显示为我们上面创建的端点,登陆账号为我们上面设置的账号


*
“备份首选项”和“侦听器”不需要设置,保持默认就行,可用性侦听器我们后面再添加,可以直接点击“下一步”

*
数据同步这里建议使用完整的数据库和日志备份的方式更方便,需要有一个共享文件夹,并且节点服务器要有相同的数据库文件目录结构

*
等待可用性组创建成功


*
创建成功后数据库状态显示为已同步

故障转移集群会显示拥有一个群集角色



*
显示面板可以查看集群信息


创建侦听器


一个侦听器包括虚拟IP地址、虚拟网络名称、端口号三个元素,一旦创建成功,虚拟网络名称会注册到DNS中,同时为可用性组资源添加IP地址资源和网络名称资源。用户就可以使用此名称来连接到可用性组中。

*
添加侦听器


*
选择使用静态 IP


*
创建成功后,在故障转移集群管理器里的角色节点,可以看到客户端访问名称和 IP 地址


*
连接数据库时使用侦听器的地址


可读副本的负载均衡

SQL Server 2016 支持多个只读副本负载分担只读操作。

右键一个可用性副本可以查看副本的只读性设置:


主角色中的连接

主角色中支持的连接访问类型:

* 允许所有连接(ALL):主数据库同时允许读写连接和只读连接。这是主角色的默认行为。
* 仅允许读/写连接(READ_WRITE):允许 ApplicationIntent=ReadWrite 或未设置连接条件的连接。不允许
ApplicationIntent=ReadOnly 的连接。仅允许读写连接可帮助防止客户错误地将读意向工作负荷连接到主副本。
修改脚本:
USE [master] GO ALTER AVAILABILITY GROUP [posTestAg] MODIFY REPLICA ON
N'POSTEST1-2016\POSTEST' WITH (PRIMARY_ROLE(ALLOW_CONNECTIONS = READ_WRITE)) GO
可读辅助副本

辅助角色支持的连接访问类型:

* 无连接(NO):不允许任何用户连接。辅助数据库不可用于读访问。这是辅助角色中的默认行为。
* 仅读意向连接(READ_ONLY):辅助数据库仅接受连接参数 ApplicationIntent=ReadOnly 的连接,其它的连接方式无法连接。
* 允许任何只读连接(ALL):辅助数据库全部可用于读访问连接。此选项允许较低版本的客户端进行连接。
修改脚本:
USE [master] GO ALTER AVAILABILITY GROUP [posTestAg] MODIFY REPLICA ON
N'POSTEST1-2016\POSTEST' WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = READ_ONLY)) GO
设置数据库实例监听端口

*
Sql Server 配置管理工具找到数据库实例的网络配置,


*
右键 TCP/IP,默认配置的是动态端口


*
这里修改为固定端口 1433


*
最后需要重启 Sql Server 服务。

配置可用性组只读路由

执行下面 sql 获取可用性组名称:
select name,* from sys.availability_groups
执行下面 sql 获取要配置的可用性副本名称(服务器实例):
select replica_server_name,* from sys.availability_replicas
* 为可用性副本(服务器实例)配置只读路由 URL,路由地址可以填 IP 或者计算机名,端口填数据库实例绑定的 TCP/IP 端口。
执行脚本: USE [master] GO ALTER AVAILABILITY GROUP [posTestAg] MODIFY REPLICA ON
N'POSTEST1-2016\POSTEST' WITH (SECONDARY_ROLE(READ_ONLY_ROUTING_URL =
N'TCP://10.98.98.227:1433')) GO ALTER AVAILABILITY GROUP [posTestAg] MODIFY
REPLICA ON N'POSTEST2-2016\POSTEST' WITH (SECONDARY_ROLE(READ_ONLY_ROUTING_URL
= N'TCP://10.98.98.228:1433')) GO
也可以右键可用性组选择属性,通过 UI 方式更改


* 每个自动转移副本配置只读路由列表 USE [master] GO ALTER AVAILABILITY GROUP [posTestAg]
MODIFY REPLICA ON N'POSTEST1-2016\POSTEST' WITH (PRIMARY_ROLE
(READ_ONLY_ROUTING_LIST=(('POSTEST2-2016\POSTEST'),'POSTEST1-2016\POSTEST')));
GO ALTER AVAILABILITY GROUP [posTestAg] MODIFY REPLICA ON
N'POSTEST2-2016\POSTEST' WITH (PRIMARY_ROLE
(READ_ONLY_ROUTING_LIST=(('POSTEST1-2016\POSTEST'),'POSTEST2-2016\POSTEST')));
GO
使用“()”对只读路由列表进行分组,
List 1: 'POSTEST1-2016\POSTEST'
List 2: 'POSTEST2-2016\POSTEST'
按如下方式工作:

* 路由到第一个列表中的副本,如果第一个列表存在多个副本,则对读取连接进行轮询分发。
* 如果第一列表中任一副本不可用了,路由将继续到第一个列表中的其他可用副本。
* 如果第一个列表中的所有副本都不可访问,将会路由到下一个列表
*
如果第一个列表中的任一副本可用,将会恢复路由到第一个列表

* 测试只读路由效果,sqlcmd 使用 Readonly 指定为只读连接, sqlcmd -S 10.98.98.231 -K Readonly -d
test -Q "select @@servername" -e
只读连接被连接到辅助副本

使用 SSMS 或者 EF 等需要在连接字符串设置参数ApplicationIntent=ReadOnly


注意:
想要使用辅助副本负载读操作,必须要在连接字符串中配置为只读连接,然后在程序中指定使用只读连接进行数据库读取操作,AlwaysOn 自身不能自动负载均衡。

配置账号

为每个数据库节点配置登陆账号,然后通过监听器使用该账号登陆数据库。

*
主副本创建登陆账号 satest

* 查看主库上该账号的 sid 为库名 SELECT * FROM [test]..sysusers
* 在副本数据库上创建对应账号,其中 sid对应的值是主库上所查到的sid的值 CREATE LOGIN [satest] WITH
PASSWORD=N'xxxxxxx', SID =0x99AD266AFD26F841B3E49EF9633B0D4B,
DEFAULT_DATABASE=[test], CHECK_EXPIRATION=OFF, CHECK_POLICY=OFF
使用故障转移

建议使用 SSMS 中 AlwaysOn 进行手动故障转移。

友情链接
KaDraw流程图
API参考文档
OK工具箱
云服务器优惠
阿里云优惠券
腾讯云优惠券
华为云优惠券
站点信息
问题反馈
邮箱:ixiaoyang8@qq.com
QQ群:637538335
关注微信