Windows Server 2008 的分佈式事務失敗
我在設置新伺服器時遇到問題。由應用程序伺服器啟動到新伺服器的分佈式事務失敗,但它們在現有數據庫伺服器上執行良好。我需要幫助確定問題的原因。
由於各種原因,新伺服器未執行最新版本的 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
正如在“錯誤消息 4 - 端點映射器中沒有更多端點”部分中使用 DTCPing 工具解決 MSDTC 問題中所解釋的,實際上映射器有更多端點。我已經
netstat -an
在應用伺服器(埠受限的那個)上執行,它只使用了 20 個可用埠中的 10 個。
在讓微軟參與並完成和分析了許多網路跟踪之後,我們終於找到了問題所在。應用程序伺服器是網路負載平衡群集的一部分,Windows Server 2008 R2 上的 IPv6 實現與網路負載平衡組件的互動方式存在缺陷。
由於伺服器具有可公開路由的 IPv4 地址,因此 IPv6 堆棧自動創建了一個“6to4”地址。這是一個特殊的 IPv6 地址,對應於機器的公共可路由 IPv4 地址。它對機器自己的地址和共享的集群地址都這樣做了。缺陷在於它隨後在 DNS 中以自己的名稱註冊了兩個6to4 地址。這與 IPv4 堆棧在同一台機器上的工作方式不同。對於 IPv4,集群 IP 地址未在 DNS 中註冊。
結果是,當應用程序伺服器連接到新的數據庫伺服器並且數據庫伺服器嘗試反向綁定到應用程序伺服器時,它會看到應用程序伺服器有 IPv6 地址並嘗試使用這些地址之一進行連接. 但是因為它使用了與集群IP 地址相對應的 6to4 地址,集群中的另一台伺服器將接收到連接,並且由於該伺服器上的 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