SQL Server Alwayson 用侦听器实现应用端无缝切换

时间:2022-06-10 00:58:21

Alwayson 可实现故障转移这个就不用多说了, 不过以前只是将作为高可用的一个备用副本而已。 

如果希望客户端在发生故障时能无缝切换到可用的副本, 那就必须用到侦听器。


几点总结:

一、所有节点(包括侦听器)的端口必须一致:

侦听器的IP和端口如下图可以看到:

SQL Server Alwayson 用侦听器实现应用端无缝切换

在搭建 alwayson 时, 建议将所有节点(包括侦听器)的 端口调整为同一个, 避免不必要的麻烦。

如果不一致,则

1. 侦听器IP+侦听器端口 

2. 侦听器IP+当前主副本端口

构成的连接串都是可用的, 但侦听器端口故障转移之后有时可能无法在第三方的机器上立即访问。

正因为如此,所以建议所有的端口都一致。


二、必须在所有节点上配置好同样的账号:点击打开链接

注意:

1. 各节点上的sid、账号、密码必须一致;

2. 配置好账号之后, 应立即测试是否能在本地访问, 本地访问都有问题故障转移后肯定不行;


三、手动故障转移之后,辅助副本的数据库会挂起, 必须在辅助副本的alwayson上手动恢复数据移动(有时可能需要几次才能成功)。

SQL Server Alwayson 用侦听器实现应用端无缝切换


四、如果希望做读写分离,则连接串中必须加上: ApplicationIntent=ReadOnly  ( ReadWrite 为可读可写,不加默认为可读写)

此外, 客户端及应用程序的 framework 版本必须 4.0 或 4.0 以上。


五、在 SSMS 以侦听器IP+侦听器端口登录之后, 对于不是 alwayson 的普通库, 可能会有混乱的情况发生:

SQL Server Alwayson 用侦听器实现应用端无缝切换

真正可用的是 195 这个库, 196 没办法用, 见下图:

SQL Server Alwayson 用侦听器实现应用端无缝切换

选中 ag_test 新建查询, 则 195 可用;

选中 196 新建查询, 则 195 不可用,只有 196 .

不知道算不算微软的一个 bug .


最稳妥的办法, 是在连接时指定 ApplicationIntent=ReadOnly 参数, 并且指定连接到特定的库:

SQL Server Alwayson 用侦听器实现应用端无缝切换

注意下图中的数据库必须指定到 alwayson 的库, 不要让它保持默认值。

SQL Server Alwayson 用侦听器实现应用端无缝切换

SQL Server Alwayson 用侦听器实现应用端无缝切换