我遇到新的服务器设置问题。 由应用程序服务器启动到新服务器的分布式事务失败,但它们与现有的数据库服务器正常工作。 我需要帮助确定问题的原因。
由于各种原因,新的服务器没有运行Windows或SQL Server的最新版本。
应用服务器
新的数据库服务器
现有的数据库服务器
所有这三台服务器都是同一个域的一部分,并且在同一个子网上。 它们之间只有一个以太网交换机,没有路由器,硬件防火墙,也没有安全设备。
在应用程序服务器上运行ASP.NET应用程序,并在对现有数据库服务器(DB-04)执行事务时正常运行。 对新数据库服务器(DB-06)执行相同步骤时,将失败并报告错误消息: Communication with the underlying transaction manager has failed.
我们之前在这个应用程序中看到过这个错误,通常意味着分布式事务处理协调器configuration不正确或防火墙干扰。 在过去,我使用DTCPing来排除故障并纠正错误。
然而,这次虽然DTCPing失败,但我无法确定问题的原因,因为现有的和新的数据库服务器似乎configuration相同,除了操作系统版本。
以下是从应用程序服务器(WEB-02)到新数据库服务器(DB-06)运行testing时的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工具在“错误消息4 – 端点映射程序中没有更多端点”一节的“ 疑难解答MSDTC问题 ”中所述,实际上映射程序的端点更多。 我已经在应用程序服务器上运行netstat -an (具有受限制的端口),它只使用20个可用端口中的10个。
在让微软参与并完成了许多networking追踪和分析之后,我们终于find了这个问题。 应用程序服务器是networking负载平衡群集的一部分,并且Windows Server 2008 R2上的IPv6实现与networking负载平衡组件进行交互的方式存在缺陷。
由于服务器具有可公开路由的IPv4地址,所以IPv6堆栈自动创build“6to4”地址。 这是一个特殊的IPv6地址,对应于机器可公开路由的IPv4地址。 它为机器自己的地址以及共享的集群地址做了这个。 缺点是它以自己的名字在DNS中注册了两个 6to4地址。 这与IPv4堆栈在同一台机器上的工作方式不同。 使用IPv4时,群集IP地址未在DNS中注册。
结果是,当连接到新数据库服务器的应用程序服务器和数据库服务器尝试执行与应用程序服务器的反向绑定时,将会看到应用程序服务器有IPv6地址,并尝试使用其中一个地址进行连接。 但是因为它使用与集群 IP地址相对应的6to4地址,所以集群中的另一台服务器将接收到该连接,并且由于该服务器上的DTC不期望反向绑定,所以它失败了。
现有的数据库服务器(Windows Server 2003 R2)没有使用IPv6,因此没有遇到问题。
解决scheme是禁用自动6to4地址生成。 您可以通过组策略或使用以下命令行来执行此操作:
netsh interface 6to4 set state disabled
要设置它,您可以运行以下命令:
netsh interface 6to4 set state default
要查看当前设置,请运行以下命令。 在Windows 2008 R2 / Windows 7及更高版本上,它还会指出当前设置是否归因于组策略。
netsh interface 6to4 show state