我一直致力于设置具有两个新 DTC 角色 DTC1 和 DTC2 的集群环境。我设置了 DTC1,它允许群集 VM 和 SQL Server 实例正常运行。但是,当我禁用 DTC1 时,DTC2 将保持在线,但没有 DTC 事务将起作用。实际上,我现在正在使用 Microsoft 技术解决这个问题(运气不佳)。两种 DTC 服务均使用类似的配置进行设置。这里的任何人都知道可能会发生什么?
这是我的设置:
- 一个集群环境
- 两个 DTC 角色
- 两个独立的 ISCSI 磁盘,每个角色一个
- 两个虚拟机(相同的配置)
- 每个 VM 上的两个 SQL Server 实例
允许网络配置,一切看起来都已正确设置。
我不相信您想通过 Windows 或 SQL Server 配置来实现。根据 Microsoft在此处的指南,SQL Server 将在启动时选择一个 MSDTC 实例,如果该 MSDTC 实例失败,分布式事务将失败:
这符合您所看到的行为;SQL Server 通过 DTC1 成功打开 DTC 事务,但如果 DTC1 失败,则不会自动切换到使用 DTC2。
在一些粗略的测试中,我发现:
当失败的 MSDTC 实例恢复时,DTC 事务恢复工作。
SQL Server 确实能够在它使用的 MSDTC 资源被删除(而不是刚刚失败)后自动切换到使用不同的 MSDTC 资源而无需重新启动。
我运行的测试并不全面,并且可能存在这些发现不正确的情况。
文档中更重要的一点是,您可能根本不需要集群 MSDTC:
基于此,您应该能够通过依赖本地 MSDTC 资源(在这种情况下,您可能需要将它们配置为在发生故障时自动重新启动)或通过向每个 SQL Server 群集组添加群集 MSDTC 资源来实现相当好的高可用性,如果您出于某种原因更喜欢。Windows 可以处理在失败时重新启动服务,一旦 MSDTC 服务恢复,SQL Server 似乎可以成功恢复创建 DTC 事务。
如果您试图防止此处未涵盖的情况(例如,如果 DTC 资源失败并且无法自动重新启动会发生什么?)您可能会被迫手动或在应用程序层处理该问题。
看看微软是否为您提供了不同的建议将会很有趣。