背景
我们在 Azure 上运行了两台虚拟机 (Windows Server 2012 R2),安装了 SQL Server,并设置为可用性组。当然,我们还有另一台虚拟机作为专用 DC。它们都通过单个虚拟网络连接。这种设置对我们来说运行良好,我能够从本地物理机连接到 SQL,没有任何问题,但后来帐户的支出限额已达到,它取消了所有内容的配置。我们取消了限制,我再次使用相同的 VHD 分配了所有服务器,所有设置(大概)都已恢复,但我再也无法访问 SQL Server。
名称定义
为了更好地解释这一点,我们将两个节点称为 SQL1 和 SQL2,可用性组称为 SQL-AG,可用性组侦听器称为 SQL-Listener,而这一切通过其运行的云服务(设置了适当的端点)称为 SQL-CloudService。SQL1 是故障转移群集角色的所有者(并且相应地具有主副本角色),SQL2 是辅助副本。
设想
我能够通过 RDP 连接到两台服务器,并使用来自 SQL1 的 SSMS 连接到 SQL-Listener,并查看 SQL-AG 仪表板,该仪表板报告所有内容均正常且同步。
在 SQL2 上,我无法连接到 SQL-Listener。我也无法从本地计算机连接到 SQL-CloudService,之前也可以。两个系统都返回错误,
无法连接到 SQL 侦听器。
与 SQL Server 建立连接时发生与网络相关或特定于实例的错误。未找到或无法访问服务器。请验证实例名称是否正确以及 SQL Server 是否配置为允许远程连接。(提供程序:命名管道提供程序,错误:40 - 无法打开与 SQL Server 的连接)(Microsoft SQL Server,错误:53)
找不到网络路径
当我登录 SQL1 并通过 SSMS 连接时,我可以告诉 SQL-AG 故障转移到 SQL2。它成功执行了此操作。但是,执行此操作后,我不再能够从 SQL1 连接到 SQL-Listener,但我可以从 SQL2 连接到。
长话短说,我只能从标记为主副本角色的系统使用 SSMS 连接到可用性组侦听器。
真正的问题
我实际上不需要能够完成所有这些操作,但我确实需要能够通过互联网从本地机器访问 SQL Server,并且我假设这些问题是由相同的潜在问题引起的,因为它们给出了相同的错误消息。
我一路发现的东西
考虑到错误消息和情况,这并不奇怪,但除非 SQL-Listener 运行在我发起 ping 的机器上,否则我无法 ping SQL-Listener。当 SQL1 被标记为主时,我可以从 SQL1 顺利 ping 它,但当我尝试从 SQL2 进行 ping 时,它成功地使用 DNS 查找 IP,但返回“来自 [SQL2 的 IP] 的回复:目标主机无法访问”。当我故障转移 SQL-AG 时,同样的问题出现在另一个方向。但是,我始终能够从 SQL2 ping SQL1,反之亦然。因此,我倾向于相信这是一个故障转移群集问题,而不是 SQL 问题。因此,这个问题的标题。
我还发现防火墙似乎没有受到影响。我想说,这与 ping 问题一致,但防火墙上的监控显示没有任何远程计算机(我的本地计算机或非拥有的 VM)尝试访问 SQL Server。
从我已经说过的内容中可以推断出来,但似乎值得指出的是,即使通过云服务,我也无法接触端口 1433 的防火墙。我不太确定为什么会这样,因为我认为直接到服务器的路由应该直接将其推送到服务器。因此,我希望日志中有一个项目代表这一点,但有大量项目,其中没有一个是这样的。
考虑到 ping 问题,毫不奇怪,我还能够http://sql-listener/ReportServer
在所有者节点上本地访问报告服务器 URL(类似于),但不能从另一个节点远程访问。
如果我指定计算机的名称(与 SQL-Listener 相比,SQL1 或 SQL2),我可以从另一台 SQL Server 连接到其中一台。这对我来说很奇怪,我似乎无法通过云服务。我认为这意味着它在应该监听的地方监听,而且考虑到我从未告诉 Azure 指向 SQL-Listener,我认为这不会有任何区别。所以也许我只是误解了整个情况。
我已采取的故障排除步骤
- 重新启动所有相关机器
- 确保所有 IP 都是静态的,并且符合我们的预期
- 确保防火墙设置正确
- 关闭每个 SQL 服务器(在 Azure 上,这会取消分配 VM,因此比重新启动要严重得多)并重新启动它们。
- 删除并重新创建故障转移群集角色的客户端访问点(以及可用性组侦听器)
- 重新创建了云服务端点(虽然这似乎不再能有任何帮助,因为那是在我知道服务器之间存在问题之前)
- 尝试使用明确声明的 IP 地址 (“tcp:[SQL 侦听器的 IP]”) 连接到服务器。返回与网络相关的/特定于实例的错误,提示“连接尝试失败,因为连接方在一段时间后未正确响应,或者建立的连接失败,因为连接的主机未响应。”
我曾经有过的想法
- 这可能与子网有关吗?它们似乎确实在同一个子网上,但我可以想象这会导致一些像这样的奇怪问题。
- 有人知道 Azure 在因超出支出限额而关闭服务器时会做什么特别的事情吗? 是不是只有某个设置发生了变化而我却没有注意到?
答案1
因此,正如预期的那样,这是一个非常愚蠢的错误。我忘记了设置可用性组以与 Azure 配合使用所需的所有步骤,如概述所示这里。
由于云服务的取消分配改变了其 IP,SQL 侦听器正在侦听错误的 IP 地址。我曾考虑过这个问题,并通过删除并重新创建侦听器来解决这个问题,但我完全忽略了当初我亲自执行的所有步骤,这真是令人尴尬,因为我一开始就设置了侦听器。因此,在与 Microsoft 支持人员通了一个小时电话后,我们终于重新设置了一切。现在一切都恢复正常了。
答案2
好的,今天我解决了一个看起来非常相似的问题。花了 2 周时间。很沮丧。可能(如果管理员不删除它)它会对某些人有所帮助。
因此答案是 Azure VM NIC。我有 2 个。删除不需要的那个后,一切都顺利了。
对我来说,关键点是将参数 -StaticAddress xx.xxx.xx.12 传递给命令 new-cluster -name Cluster –Node VM01,VM02 -StaticAddress xx.xxx.xx.12 -NoStorage –AdministrativeAccessPoint DNS
就我而言,我无法继续使用该参数,直到我删除了第二个 NIC。