我需要设置两个 SQL Server 实例和镜像的自动故障转移。有几家 DNS 托管商(例如 DNS Made Easy 和 Netriplex)提供自动故障转移。他们每分钟都在监控您的服务器实例,如果主服务器出现故障,域名将解析为辅助服务器的 IP。
我的问题是,在自动故障转移的情况下,我也需要切换服务器角色,而我的当前 DNS 托管提供商(DNS Made Easy)不支持此功能。
换句话说:假设我有两台数据库服务器 - A 和 B。A 是主服务器,B 只是在 A 发生故障时待命。当 A 发生故障时,B 接管并成为新的主服务器。当 A 恢复时,它就是新的辅助服务器并待命直到 B 发生故障。当 B 发生故障时,A 接管并再次成为主服务器。
是否有任何 DNS 托管商能够提供此类功能?
谢谢,
阿德里安
答案1
我认为 DNS 不是这种故障转移的合适机制。根据我的经验,数据库故障转移通常由以下方式处理:
- A)在不同服务器之间迁移浮动 IP 地址的集群软件(同时根据需要自动监控和迁移服务),或
- B) 在不同服务器前面提供虚拟 IP 地址的负载均衡器(在多主节点的情况下)。
使用 DNS 的问题是 DNS 查询可以在最终用户和服务器之间的多个级别缓存。因此,即使您立即更改 DNS 条目,也可能需要几个小时才能将更改传播给最终用户,并且您的服务在此期间将处于停机状态。
答案2
抱歉,不可以,你不能这么做。
SQL 服务器通常不会直接暴露在互联网上,因此,公共 DNS 和 SQL Server 的组合并不常见。因此,您不会找到任何具有 SQL Server 自动运行状况检查功能的 DNS 主机。
原则上,您可以将 SQL Server 安全保护到可以面向 Internet 的程度。但即便如此;您是否非常确定这就是您想要的,您是否考虑过与 SQL Server 中的缓冲区溢出漏洞相关的所有可能的安全风险?我不知道您的架构的具体细节,但乍一看,这种设计似乎是错误的。
下一个, SQL Server 是有状态的东西。如果主 SQL Server 在长时间运行或事务的中间崩溃ALTER TABLE
,则备份服务器处于什么状态就不明显了。处理 SQL Server 的故障转移通常不太可能实现自动化,您可能需要 DBA 将服务器恢复到一致状态。我当然不会相信外部 DNS 主机能够正确处理数据库故障转移和数据完整性,因为它不了解我的应用程序域。
最后,DNS 故障转移可能需要很长时间才能传播。DNS 缓存会缓存查询结果,即使你将 DNS TTL 设置为较低,现实生活中的过渡时间可能相当长。
答案3
正如我刚刚了解到的,有一种简单的方法可以准确处理这种情况:在连接字符串中指定故障转移伙伴。类似这样的技巧:
Data Source=myServerAddress;Failover Partner=myMirrorServerAddress;Initial Catalog=myDataBase;Integrated Security=True;
编辑:我不确定如何理解下面评论中的反对意见。这个示意图摘自MSDN准确描述我的情况?
另外,来自本文:
如果您使用 ADO.NET 或 SQL Native Client 连接到正在镜像的数据库,则您的应用程序可以利用驱动程序在发生数据库镜像故障转移时自动重定向连接的功能。您必须在连接字符串和故障转移伙伴服务器中指定初始主体服务器和数据库。