【问题标题】:Auto failover multiple connections to mirror database when principal goes down当主体发生故障时,自动故障转移多个镜像数据库连接
【发布时间】:2014-10-21 11:59:25
【问题描述】:

我有一个主体数据库 (server_A)、镜像数据库 (server_B) 和一个见证数据库 (server_C)。数据库设置为自动故障转移,也就是说,当 server_A 出现故障或故障转移时,server_B 将承担新主体数据库的角色。据我所知,数据库仲裁设置正确。

我用 C++ 编写了一个应用程序来连接到数据库并获取一个值以确保真正的连接。应用程序检测 GetValue 调用何时发生故障,并在发生错误时尝试重新连接。

问题是这样的: 当我与数据库有多个连接时(连接了两个线程,一旦连接,它将在循环中获取一个值),当发生故障转移时(停止服务器 A 上的 sql 服务器,因此服务器 B 将接管作为主体),我检测到连接失败并破坏我的连接并尝试使用相同的连接字符串重新连接:

“Driver={SQL Native Client};Server=tcp:Server_A;Failover_Partner=tcp:Server_B;Database=SomeDatabase;Uid=SomeUser;Pwd=SomePassword;”

** 注意 ** 我已经通过监控数据库验证了故障转移已经发生。

尽管与数据库的连接已正确处理,但我无法重新连接到数据库,直到我重新启动应用程序,或者如果我将 server_A 重新联机(现在充当镜像数据库)然后故障转移 server_B(关闭down sql server) 再次使服务器 A 成为主体数据库,应用程序可以重新连接而无需完全关闭。

虽然我可以操纵连接字符串以使 server_B 成为新的主体,而 server_A 成为新的 Failover_Partner,但这并不是一个理想的解决方案,因为将使用更多的连接。

请记住,这只发生在与数据库的多个连接时。如果我只使用一个连接运行应用程序,一切都很好,并且在发生故障转移时我可以重新连接。

编辑:如果我一开始用多个线程连接,一切都很好。当我关闭 SQL Server 并因此发生故障转移时,我只能在通过并删除所有对象并重新实例化新对象时重新连接。另外,我使用的是 SQL Native Client 11.0 (ODBC)。想法?

【问题讨论】:

  • 很可能是你使用的驱动不是线程安全的,在线程环境下使用非线程安全的lib结果是无法预见的。
  • 如果是这样的话,不经过镜像进程,应用程序不会从一开始就失败吗?如果它不是线程安全的,我怀疑在多次连接时会发生故障,而不管故障转移如何。
  • 可能,也可能不会。当非线程安全的代码暴露在线程环境中时,真的很难预测会发生什么。

标签: c++ connection-string connection-pooling failover database-mirroring


【解决方案1】:

您所描述的许多内容与KB 2605597“SQLClient 的 .NET Framework 数据提供程序创建镜像数据库连接时出现超时错误”中描述的问题一致。

知识库描述了连接超时设置为 15 秒时的问题,我听说过连接超时设置为 0 时的类似问题(出于其他原因,这不是一个好主意,以防万一)。

此修补程序应用于应用程序服务器。如果您想将其排除为可能的原因,您可以测试提高超时时间(就像在帖子的解决方法部分中所说的那样)以确保它不是问题。

后来想到:我注意到的另一件不寻常的事情是您在连接字符串中指定了 TCP 协议和故障转移伙伴名称。从文档中我不清楚故障转移合作伙伴名称是否支持它。您可能想尝试删除它并改为指定网络属性。 (Recommended here.)

我明白您认为问题不在于这些问题,因为您已经测试过单/多连接问题。

但是,我认为您最好简化连接字符串,使其尽可能与已发布的示例保持一致,并确保这不是人们通常首先遇到的问题。 (当存在延迟时会发生重试问题,这可能会使其有些零星。)

【讨论】:

  • 提供的连接字符串已经过多种修改,希望是问题所在。我试过弄乱网络参数,但仍然收到相同的结果。我也不确定故障转移伙伴上的 tcp: 标签,我真的找不到任何东西,但它和其他的一样。顺便说一句,tcp: 标签是因为命名管道被禁用,我不需要处理命名管道超时,当它首先没有启用时。最后,我尝试在连接和故障转移伙伴上设置更长的超时和短的超时。
【解决方案2】:

好的,我找到了答案。

我不得不修改主机文件,因为我的应用程序与数据库不在同一个域中。因此,当尝试进行故障转移时,我无法使用实例名称访问数据库(这是故障转移伙伴缓存的名称)。我更改了主机文件以将实例名称解析为机器的 IP 地址,现在一切正常。

【讨论】:

    猜你喜欢
    • 2014-08-24
    • 2014-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-11-06
    • 2011-01-25
    相关资源
    最近更新 更多