Always On Listener能ping通应用连不上
Always On Listener能ping通应用连不上
Always On 搭完以后,Listener / VIP 能 ping 通,但是禅道应用连不上。
这个现象很容易误导人。能 ping 通只能说明 IP 层大概通,不代表 SQL Server 1433、Listener、当前主副本、应用连接串都没问题。
先确认 VIP 在哪台
Linux + Pacemaker 场景,先看集群资源:
1 | pcs status |
看 VIP 当前落在哪台机器上。然后确认这台是不是 SQL Server 当前主副本。
SQL 查:
1 | SELECT |
如果 VIP 在 db02,但主副本还在 db01,这就不对。
ping 不等于 1433 通
应用机上测端口:
1 | nc -vz 10.10.20.100 1433 |
这里 10.10.20.100 是脱敏后的 Listener/VIP。
如果不通,看:
1 | firewall-cmd --list-all |
SQL Server 机器上 1433 要监听,VIP 所在机器防火墙也要放行。
用 sqlcmd 连 Listener
应用机上不要只测 db01/db02,要测 Listener。
1 | sqlcmd -S 10.10.20.100,1433 -U zentao_app -P '******' -d zentao -Q "SELECT @@SERVERNAME, DB_NAME();" |
能连上以后,再看当前是不是主库:
1 | SELECT |
如果是只读副本,应用写入肯定会出问题。
也可以试写一个测试表,测完删掉。
1 | CREATE TABLE dbo.ag_write_test(id INT IDENTITY(1,1), name NVARCHAR(20)); |
应用连接串
原来连 db01:
1 | 10.10.20.11,1433 |
应该改成 Listener/VIP:
1 | 10.10.20.100,1433 |
PHP PDO 示例:
1 | $dsn = "sqlsrv:Server=10.10.20.100,1433;Database=zentao;TrustServerCertificate=true"; |
如果客户内部用了 DNS,也可以写域名:
1 | sql-zt-listener.intra.example,1433 |
但是 DNS 解析要查清楚:
1 | nslookup sql-zt-listener.intra.example |
切换后还连旧主库
如果应用连接串里写死 db01,那主备切换后肯定还去找旧主库。
这个问题不要靠“切完再改配置”解决,应该一开始就让应用连 Listener。
检查配置:
1 | grep -R "10.10.20.11\|db01\|1433" -n /data/www/zentao/config 2>/dev/null |
常见原因
- VIP 能 ping,但 1433 没放行。
- VIP 不在当前主副本所在机器。
- 应用连接串还写 db01/db02。
- DNS 解析到旧 IP。
- SQL Server login 在主副本有,但切换后 SID/用户映射不一致。
- 证书或加密参数导致 PHP 驱动连接失败。
最后检查顺序
1 | pcs status |
不要被 ping 通骗了。
参考
- Linux 可用性组概述:https://learn.microsoft.com/en-us/sql/linux/sql-server-linux-availability-group-overview
- 可用性组监听器概念:https://learn.microsoft.com/en-us/sql/database-engine/availability-groups/windows/listeners-client-connectivity-application-failover
- SQL Server PHP 驱动连接:https://learn.microsoft.com/en-us/sql/connect/php/connection-options
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 无尽infinite!

