16.6 从客户端访问
16.6.1 可读辅助副本
对于 AlwaysOn 可用性组,主副本的数据库可以像普通的数据库一样使用,包括新增、修改和删除记录行。
辅助副本也可以提供只读访问。
“可读辅助副本”有以下3种类型:
(1)“是”
这种模式允许客户端访问辅助副本。
(2)“仅读意向”
这种模式允许客户端访问辅助副本。但要求客户端连接中明确连接意向为只读。
(3)“否”
这种模式不允许客户端访问辅助副本。与数据库镜像的镜像数据库类似。
16.6.2 客户端连接
客户端可以连接到以下三种地址之一。
(1)侦听器
客户端指向侦听器,侦听器无论何时都会将主副本的地址返回给客户端,因此,客户端应用程序可以像访问普通的数据库一样正常读取、写入 AlwaysOn 可用性组中的数据库。这是最常用的一种访问方式,因为不用关心当前的主副本在哪一个故障转移节点上以及何时发生故障转移。
(2)副本的实例名称
客户端也可以指向副本的实例名称。如果当前实例的角色是主副本,则客户端连接不会遇到问题。在实际环境中,当前实例的角色可能发生故障转移从而成为辅助副本,这时候客户端连接可能会遇到错误。这种访问方式应当在明确当前副本的角色后才可以选用,并尽量避免因故障转移带来的影响。
例如,当前副本是辅助副本,且“可读辅助副本”选项为“否”,则客户端的连接将失败。又如,当前副本是辅助副本,且可以提供只读访问,但是当客户端发出修改数据的请求时,也会报错。
(3)“只读意向”
客户端可以在连接字符串中明确连接的目的为“只读意向”,侦听器则会将其中一个辅助副本的地址返回给客户端,而后客户端通过这个地址访问这个只读的辅助副本。
16.6.3 配置只读路由
在本例中,先将 SQLSVR1、SQLSVR2 和 SQLSVR3 的“可读辅助副本”设为“是”或“仅读意向”,以便让辅助副本能够响应从侦听器转来的“只读意向”。脚本如下:
USE [master] GO ALTER AVAILABILITY GROUP [HAGroup01] MODIFY REPLICA ON N‘SQLSVR1‘ WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL)) GO ALTER AVAILABILITY GROUP [HAGroup01] MODIFY REPLICA ON N‘SQLSVR2‘ WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS = ALL)) GO ALTER AVAILABILITY GROUP [HAGroup01] MODIFY REPLICA ON N‘SQLSVR3‘ WITH (SECONDARY_ROLE(ALLOW_CONNECTIONS =READ_ONLY )) GO |
在主副本上执行以下脚本,添加只读路由 URL。每个只读路由 URL 都用于将只读意向请求路由到一个特定的可读辅助副本。通常,向每个可读辅助副本分配一个只读路由 URL。
USE master GO ALTER AVAILABILITY GROUP [HAGroup01] MODIFY REPLICA ON N‘SQLSVR1‘ WITH (SECONDARY_ROLE(READ_ONLY_ROUTING_URL=N‘TCP://SQLSVR1.localdomain.local:1433‘)); GO ALTER AVAILABILITY GROUP [HAGroup01] MODIFY REPLICA ON N‘SQLSVR2‘ WITH (SECONDARY_ROLE(READ_ONLY_ROUTING_URL=N‘TCP://SQLSVR2.localdomain.local:1433‘)); GO ALTER AVAILABILITY GROUP [HAGroup01] MODIFY REPLICA ON N‘SQLSVR3‘ WITH (SECONDARY_ROLE(READ_ONLY_ROUTING_URL=N‘TCP://SQLSVR3.localdomain.local:1433‘)); GO |
然后还要添加只读路由表,告诉侦听器按照怎么的先后顺序将辅助副本的地址返回给客户端。
分别为每个副本设置作为主副本时的只读路由 URL。每个副本上配置的只读路由列表中的最后一个成员都是自己,表明当前面所有的只读副本都发生故障后,则还可以由主副本自己来响应这些“只读意向”。脚本如下:
USE master GO ALTER AVAILABILITY GROUP [HAGroup01] MODIFY REPLICA ON N‘SQLSVR1‘ WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=(‘SQLSVR2‘,‘SQLSVR3‘,‘SQLSVR1‘))); GO ALTER AVAILABILITY GROUP [HAGroup01] MODIFY REPLICA ON N‘SQLSVR2‘ WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=(‘SQLSVR1‘,‘SQLSVR3‘,‘SQLSVR2‘))); GO ALTER AVAILABILITY GROUP [HAGroup01] MODIFY REPLICA ON N‘SQLSVR3‘ WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=(‘SQLSVR1‘,‘SQLSVR2‘,‘SQLSVR3‘))); GO |
16.6.4 测试只读路由
客户端必须使用TCP协议连接到支持只读路由的AlwaysOn可用性组的侦听器,并且在连接字符串中将应用程序意向特性/属性设置为只读,而且必须引用该可用性组中的数据库。例如:
Server=tcp:SQLAG01,1433; Database=SQLDB01; IntegratedSecurity=SSPI; ApplicationIntent=ReadOnly; MultiSubnetFailover=True |
以下通过一个实验测试只读路由。
(1)直接连接到侦听器
(2)连接到侦听器,并且使用连接参数
在 SSMS 登录界面,在“服务器名称”中输入侦听器的名称或 IP 地址。然后单击右下角的“选项”按钮。
在“其他连接参数”中输入连接字符串。
连接到数据库引擎后,查看当前连接的实际节点。
(3)故障转移
停止当前连接的辅助副本的数据库引擎(模拟故障),然后立即在 SSMS 中执行任何查询,会报错。这说明只读路由正在故障转移。
等到故障转移成功后,在 SSMS 中再次执行查询。