【问题标题】:Handling database queries that fail due to a server failover处理由于服务器故障转移而失败的数据库查询
【发布时间】:2010-12-26 03:12:36
【问题描述】:

在具有 SQL Server 故障转移群集或镜像的环境中,您希望如何处理错误?好像有两种选择:

  1. 当前整个客户端请求失败,让用户重试
  2. 在 DAL 中发现错误,然后在那里重试

每种方法都有其优点和缺点。我合作过的大多数商店都做#1,但他们中的许多也没有遵循严格的交易界限,而且在我看来,如果发生故障,他们会为麻烦而敞开心扉。即便如此,我在将它们与 #2 交谈时遇到了麻烦,这也应该会带来更好的用户体验(一个问题是发生故障转移时可能会出现长时间的延迟)。

任何一种或另一种方式的论点都会受到赞赏。如果您使用第二种方法,您是否有一个有助于简化实现的标准包装器?无论哪种方式,您如何构建代码以避免出现与失败命令中缺乏幂等性相关的问题?

【问题讨论】:

    标签: sql-server data-access-layer cluster-computing failover


    【解决方案1】:

    数字 2 可能是一个无限循环。如果它与网络相关,或者本地 PC 需要重新启动,或者其他什么?

    当然,数字 1 对用户来说很烦人。

    如果您只允许通过网站进行访问,那么您将永远不会看到错误,除非故障转移发生在通话中。对我们来说,这不太可能发生,我们已经在最终用户没有意识到的情况下进行了故障转移。

    在现实生活中,您可能在 Web 服务器上没有干净整洁的 DAL。您可能有一个 Excel 工作表连接(大多数财务)或 WinForms 连接保持打开,所以您只有一个选项。

    无论如何,故障转移应该只需要几秒钟。如果数据库恢复需要更多时间,那么无论如何您都会遇到更大的问题。如果它经常发生以至于不得不考虑处理它,那么......

    总而言之,您想知道的情况很少,而数字 1 会更好。恕我直言。

    【讨论】:

    • 你不能用重试计数器避免无限循环吗?如果您的故障转移只需要几秒钟,那么您很幸运。我使用过的大多数基于 SQL Server 集群的系统至少需要 30 秒才能完全回滚所有内容,另外还有备用服务器上的缓存填满时的额外延迟——它可能长达 2 分钟。镜子只有几秒钟,但与我合作的大多数商店都没有使用它们(目前)。
    • 我的意思是 20-30 秒:用户不会注意到。什么是有效的重试计数?它是否处理超时、死锁?它会仅在强制断开连接时重试吗?等等等等
    • 我通常使用 2 次重试计数,中间有延迟。这个想法不是为了防止用户看到错误。只是为了尽量减少它发生的机会。您如何确保在同一页面中失败的命令之前成功的插入不会在失败后再次发出?除了仔细的交易设计还有什么?
    • 我们使用 TXN 使每个单独的调用完全原子化。
    猜你喜欢
    • 2010-11-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-05-01
    • 2018-08-21
    • 2021-03-25
    • 2012-09-14
    相关资源
    最近更新 更多