MSDTC to jedna z usług, o której… lepiej nie słyszeć, bo jeśli o niej nie słyszysz, to znaczy, że wszystko działa, a jak już ktoś coś o niej powie, to często zaczyna się szukanie igły w stogu siana. Na szczęście konfiguracja usługi nie jest aż tak bardzo kłopotliwa.
Ta opowieść zaczyna się od kontaktu ze strony administratora, który stwierdził, że jego aplikacja nie łączy się do MS Distributed Transaction Coordinator-a.
Oczywiście należy zacząć od sprawdzenia czy usługa MSDTC w ogóle działa! Jeśli akcja działaby się na pojedyńczym serwerze wystarczyłoby przejrzeć usługi. W przypadku clustra, MSDTC jest zwykle konfigurowane jako usługa roli clustra:
Get-ClusterResource | where {$_.ResourceType -eq 'Distributed Transaction Coordinator'} Name State OwnerGroup ResourceType ---- ----- ---------- ------------ New Distributed Transaction Coordinator Online SERVER_00123 Distributed Transaction Coordinator
Status online świadczy o tym, że usługa działa.
Kolejny pomysł to oczywiście pozamykane porty. Połączenie z MSDTC zaczyna się na porcie 135, a potem jest losowany port z zakresu 1024 do 65525. Po stronie serwera zazwyczaj istnieją już odpowiednie reguły w definicji firewall, wystarczy je włączyć.
To polecenie wyświetla reguły, które mają coś wspólnego z „distributed” lub „DTC”:
Get-NetFirewallRule | where { $_.name -like '*distributed*' -or $_.name -like '*DTC*' } | select name,profile,enabled,direction, displayname Name : MSDTC-In-TCP Profile : Any Enabled : False Direction : Inbound DisplayName : Distributed Transaction Coordinator (TCP-In) Name : MSDTC-Out-TCP Profile : Any Enabled : False Direction : Outbound DisplayName : Distributed Transaction Coordinator (TCP-Out) Name : MSDTC-KTMRM-In-TCP Profile : Any Enabled : False Direction : Inbound DisplayName : Distributed Transaction Coordinator (RPC) Name : MSDTC-RPCSS-In-TCP Profile : Any Enabled : False Direction : Inbound DisplayName : Distributed Transaction Coordinator (RPC-EPMAP)
Jak widać, tutaj dostęp przez sieć do MSDTS jest wyłączony, więc wypada go włączyć:
Get-NetFirewallRule | where { $_.name -like '*distributed*' -or $_.name -like '*DTC*' } |
Enable-NetFirewallRule
Oczywiście każdą z tych czynności można też wykonywać z interfejsu graficznego – jak się woli 🙂
Na tym etapie komunikat o błędzie zmienił się z „nieokreślonego niedziałania” na
The partner transaction manager has disabled its support for remote/network transactions Exception from HRESULT: 0x8004D025
Taki komunikat wskazuje na to, że połaczenie się udaje, ale jest odrzucane przez MSDTC. Narzędzie do konfiguracji
Kolejna rzecz to konfiguracja MSDTC. Konfigurację wykonuje się programem „Component Services”. Odpowiedni program znajduje się w menu:
Jeżeli problem występuje na clustrze, to możliwości konfiguracji jest troche więcej, bo konfigurować można niezależnie MSDTC lokalne oraz clustrowane. W moim przypadku należało się przyjrzeć wersji clustrowej. Wystarczy rozwinąć drzewko i wybrać właściwości:
W tym przypadku, wystarczyło sprawdzić, czy jest włączony zdalny dostęp do MSDTC. Tutaj niezaznaczone opcje do zmiany to [x] Allow Remote Clients, [x] Allow inbound, [x] Allow Outbound:
Po takich zmianach MSDTC należy zrestartować:
Get-ClusterResource | where {$_.ResourceType -eq 'Distributed Transaction Coordinator’} | Stop-ClusterResource
Get-ClusterResource | where {$_.ResourceType -eq 'Distributed Transaction Coordinator’} | Start-ClusterResource
Od tej pory można już na spokojnie przyglądać się rosnącym statykom, które są do znalezienia w programie Component Services w pozycji Transaction Statistics:
Tu jeszcze 2 linki pozwalające na diagnozowanie problemów z MSDTC:
https://msdn.microsoft.com/en-us/library/aa561924.aspx
O MSDTC pisałem też: