我一直在使用两个新的DTC角色( DTC1和DTC2 )来设置集群环境。我设置了DTC1,它允许集群VM和Server实例正常工作。但是,当我禁用DTC1时,DTC2将保持联机状态,但没有DTC事务会工作。我现在正和微软科技公司讨论这个问题(运气不佳)。这两个DTC服务都是以类似的配置设置的。这里有人知道会发生什么事吗?
这是我的装置:
网络配置是允许的,一切看起来都是正确设置的。
发布于 2014-12-30 17:30:37
我不相信通过Windows或Server配置您想要做的事情是可能的。根据微软的指南这里,Server将在启动时选择MSDTC实例,如果该MSDTC实例失败,则分布式事务将失败:
如果在SQL Service启动时选择的MSDTC资源失败,会发生什么情况?如果由特定Server组使用的MSDTC实例失败,Server将不会自动尝试使用下一个可用的MSDTC资源,例如默认群集实例或MSDTC的本地计算机实例。要使用MSDTC的另一个实例,需要从Server组中完全删除MSDTC的失败实例。同样,如果为Server创建映射,而映射的MSDTC实例失败,则分布式事务也将失败。如果希望Server使用MSDTC的不同实例,则必须将MSDTC实例添加到Server的本地群集组中,或删除映射。
这与您所看到的行为相匹配;Server成功地通过DTC1打开了DTC事务,但如果DTC2失败,则不会自动切换到使用DTC1。
在一些粗略的测试中,我发现:
我运行的测试并不全面,而且可能会出现这些发现不正确的情况。
文档中更重要的一点是,您可能根本不需要集群MSDTC:
如果我在Windows 2008及以上版本中没有集群MSDTC,SQL将做什么?如果集群中没有MSDTC资源,则Server将使用在节点上本地运行的MSDTC服务。对于Windows 2008和更高版本的MSDTC,有什么简单的建议?在Windows2008及更高版本中,您可以为每个需要其功能的Server实例/Group创建MSDTC资源的群集实例,或者根本不集群MSDTC。
基于此,您应该能够通过依赖本地MSDTC资源(在这种情况下,您可能需要配置它们以在失败时自动重新启动)或通过向每个Server群集组添加群集MSDTC资源(如果出于某种原因),可以实现相当高的可用性。Windows可以在失败时处理重新启动服务,一旦MSDTC服务恢复,Server似乎会成功地恢复创建DTC事务。
如果您试图防止这里没有介绍的场景(例如,如果DTC资源失败并且无法自动重新启动,会发生什么情况?)您可能被迫手动或在应用层处理这个问题。
这将是有趣的,看看微软是否提供了不同的建议。
https://dba.stackexchange.com/questions/87197
复制相似问题