我在设置新服务器时遇到了问题。应用程序服务器启动到新服务器的分布式事务失败了,但它们在现有数据库服务器上运行良好。我需要帮助来确定问题的原因。
由于各种原因,新服务器没有运行最新版本的 Windows 或 SQL Server。
设置
应用服务器
- 操作系统:Windows Server 2008 R2
- NetBIOS 名称:WEB-02
- 配置为与多个数据库服务器对话,一些是本地的,一些是远程的。
- DCOM 端口限制在 5000-5020 范围内,以便通过防火墙与远程服务器通信。
- 已启用 Windows 防火墙
- DTC 属性
- 网络 DTC 访问已检查
- 允许远程客户端,允许远程管理未选中
- 交易管理器 沟通
- 允许入站,允许出站已检查
- 无需身份验证
- 未选中“启用 XA 事务”
- 启用 SNA LU 6.2 事务已检查
新的数据库服务器
- 操作系统:Windows Server 2008
- NetBIOS 名称:DB-06
- SQL 服务器 2005
- 对 DCOM 端口没有限制
- Windows 防火墙已禁用
- DTC 属性
- 网络 DTC 访问已检查
- 允许远程客户端未选中,
- 允许远程管理已检查
- 交易管理器 沟通
- 允许入站,允许出站已检查
- 无需身份验证
- 未选中“启用 XA 事务”
- “启用 SNA LU 6.2 事务”不存在
现有数据库服务器
- 操作系统:Windows Server 2003 R2
- NetBIOS 名称:DB-04
- SQL 服务器 2005
- 对 DCOM 端口没有限制
- Windows 防火墙已禁用
- DTC 属性
- 网络 DTC 访问已检查
- 允许远程客户端未选中,
- 允许远程管理已检查
- 交易管理器 沟通
- 允许入站,允许出站已检查
- 无需身份验证
- 未选中“启用 XA 事务”
- “启用 SNA LU 6.2 事务”不存在
三台服务器都属于同一个域,位于同一个子网。它们之间只有以太网交换机,没有路由器、硬件防火墙或安全设备。
问题
ASP.NET 应用程序在应用程序服务器上运行,在对现有数据库服务器 (DB-04) 执行事务时正常工作。当对新数据库服务器 (DB-06) 执行相同步骤时,它会失败并报告错误消息:Communication with the underlying transaction manager has failed.
故障排除步骤
我们之前在该应用程序中看到过此错误,这通常意味着分布式事务协调器配置不正确或防火墙干扰。过去,我曾使用 DTCPing 来排除故障并纠正任何错误。
然而这次,虽然 DTCPing 失败了,但我无法确定问题的原因,因为除了操作系统版本之外,现有数据库服务器和新数据库服务器的配置似乎相同。
以下是从应用程序服务器 (WEB-02) 到新数据库服务器 (DB-06) 运行测试时的 DTCPing 日志文件。请注意,我已更改 IP 地址和 DNS 名称。
来自应用程序服务器上的日志文件
10-14, 16:08:11.346-->Error(0x424) at clutil.cpp @256
10-14, 16:08:11.346-->-->OpenCluster
10-14, 16:08:11.346-->-->1060(The specified service does not exist as an installed service.)
++++++++++++++++++++++++++++++++++++++++++++++
DTCping 1.9 Report for WEB-02
++++++++++++++++++++++++++++++++++++++++++++++
Firewall Port Settings:
Port:5000-5020
RPC server is ready
++++++++++++Validating Remote Computer Name++++++++++++
10-14, 16:08:22.796-->Start DTC connection test
Name Resolution:
DB-06-->1.1.1.6-->s6.mydomain.com
10-14, 16:08:22.812-->Start RPC test (WEB-02-->DB-06)
RPC test failed
来自新数据库服务器上的日志文件
10-14, 16:07:46.128-->Error(0x424) at clutil.cpp @256
10-14, 16:07:46.128-->-->OpenCluster
10-14, 16:07:46.129-->-->1060(The specified service does not exist as an installed service.)
++++++++++++++++++++++++++++++++++++++++++++++
DTCping 1.9 Report for DB-06
++++++++++++++++++++++++++++++++++++++++++++++
RPC server is ready
10-14, 16:08:22.785-->RPC server:DB-06 received following information:
Network Name: DB-06
Source Port: 56535
Partner LOG: WEB-022872.log
Partner CID: 1ACD8780-9446-4E94-869D-6F1BDF787BBF
在数据库服务器上单击 PING 后,日志文件中添加了以下内容。在输出窗口中,调用 RPC 方法和失败之间存在暂停,因此超时后失败。
++++++++++++Validating Remote Computer Name++++++++++++
10-14, 16:13:18.924-->Start DTC connection test
Name Resolution:
Web-02-->1.1.1.2-->web-02.mydomain.com
10-14, 16:13:18.933-->Start RPC test (DB-06-->Web-02)
Problem:fail to invoke remote RPC method
Error(0x6D9) at dtcping.cpp @303
-->RPC pinging exception
-->1753(There are no more endpoints available from the endpoint mapper.)
RPC test failed
正如解释的那样使用 DTCPing 工具解决 MSDTC 问题在“错误消息 4 - 端点映射器中没有更多端点”部分下,实际上映射器有更多端点。我已经netstat -an
在应用程序服务器(具有受限端口的服务器)上运行,它仅使用 20 个可用端口中的 10 个。
答案1
在微软介入并进行了大量网络跟踪和分析后,我们终于找到了问题所在。应用服务器是网络负载平衡集群的一部分,而 Windows Server 2008 R2 上的 IPv6 实现与网络负载平衡组件的交互方式存在缺陷。
由于服务器具有可公开路由的 IPv4 地址,因此 IPv6 堆栈会自动创建一个“6to4”地址。这是一个特殊的 IPv6 地址,与机器的可公开路由 IPv4 地址相对应。它对机器自己的地址以及共享集群地址都执行了此操作。缺陷在于它随后注册了两个都DNS 中的 6to4 地址自己的名称。这与 IPv4 堆栈在同一台机器上的运作方式不同。使用 IPv4,群集 IP 地址未在 DNS 中注册。
结果是,当应用服务器连接到新的数据库服务器并且数据库服务器尝试反向绑定到应用服务器时,它会看到应用服务器有 IPv6 地址,并尝试使用其中一个地址进行连接。但是因为它使用了与簇IP 地址,集群中的另一台服务器将接收连接,并且由于 DTC那个服务器没想到反向绑定,失败了。
现有的数据库服务器是 Windows Server 2003 R2,不使用 IPv6,因此没有遇到问题。
这解决方案禁用自动 6to4 地址生成。您可以通过组策略或使用以下命令行执行此操作:
netsh interface 6to4 set state disabled
要将其恢复,请运行以下命令:
netsh interface 6to4 set state default
要查看当前设置,请运行以下命令。在 Windows 2008 R2/Windows 7 及更高版本上,它还将指示当前设置是否归因于组策略。
netsh interface 6to4 show state