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)直接连接到侦听器
不附加任何连接字符串,直接连接到侦听器。然后通过查询 @@SERVERNAME 全局变量确认当前连接的实例。
(2)连接到侦听器,并且使用连接参数
在 SSMS 登录界面,在“服务器名称”中输入侦听器的名称或 IP 地址。然后单击右下角的“选项”按钮。
在“其他连接参数”中输入连接字符串,指定目标数据库名称,指定只读意向。
连接到数据库引擎后,查看当前连接的实际节点。
(3)故障转移
停止当前连接的辅助副本的数据库引擎(模拟故障),然后立即在 SSMS 中执行任何查询,会报错。这说明只读路由正在故障转移。
等到故障转移成功后,在 SSMS 中再次执行查询,确认已经转移到下一个只读路由 URL。
16.6.5 使用数据库快照
与数据库镜像类似,可以在可用性组中的主数据库或辅助数据库上创建数据库快照。副本角色必须是“主要”或“辅助”,且不能处于“正在恢复”状态。
在创建一个数据库快照时,建议数据库同步状态是“正在同步”或“已同步”。然而,当数据库同步状态为“未同步”时,仍然可以创建数据库快照。
如果辅助副本断开与主副本的连接,则该辅助副本上的数据库快照应该继续工作。
如果承载数据库快照的可用性副本故障转移,则该数据库快照将保留在创建了这些快照的服务器实例上。用户可以在故障转移后继续使用快照。
基于性能方面的考量,建议仅在配置为手动故障转移模式的辅助副本承载的辅助数据库上创建数据库快照。如果可用性组手动故障转移到此辅助副本,则可以在其他辅助副本上创建一组新的数据库快照,将客户端重定向到这些新的数据库快照,并且从新的主数据库上删除所有数据库快照。
本文出自 “SQL Server 管理员指南” 博客,谢绝转载!