MSDTC Nedir?

MSDTC (Microsoft Distributed Transaction Coordinator) birden fazla instance üzerinde işlem yapan transaction’ları koordine etmek için windows cluster tarafından kullanılan bir resource’dur. Örneğin A sunucusunda başlayan bir transaction B sunucusunda da işlemler yapar ve bu tarz transaction’lara Distributed transaction denir. Olası bir rollback ya da failover durumundan dolayı her 2 node’u ilgilendiren transaction bilgilerinin bir resource tarafından log’lanması gerekir. Bu işlemi MSDTC yapar.

[more]

Windows Server 2008 Öncesi MSDTC

Windows Server 2008’den önce windows cluster’da sadece 1 adet MSDTC resource’u bulundurulabiliyordu. Yani cluster üzerindeki bütün application’lar distributed transaction yönetimi için aynı MSDTC resource’unu kullanıyordu. Bu durumun kötü yanları aşağıdaki gibiydi;

· Tüm application’lar aynı MSDTC resource’unu kullandığı için bir application’ın MSDTC üzerinde oluşturduğu yük diğer application’ların performansını etkiliyordu.

· Tek bir MSDTC resource olduğu için ve MSDTC ile application’lar farklı node’lar üzerinde çalışma ihtimalinden dolayı network kaynaklı performans problem ile karşılaşılabiliyordu. Örneğin MSDTC resource’u A node’unda iken SQL Server resource’larından biri B node’unda çalışıyor ve MSDTC erişimi network üzerinden gerçekleşiyordu. Bu da performans sıkıntısına sebebiyet verebiliyordu.

Windows server 2008 ile beraber gelen multiple MSDTC bulundurma özelliği ile bu problemler aşılabilmektedir.

 

Windows Server 2008 Sonrası MSDTC

Windows Server 2008 ile beraber bir WSFC’de birden fazla MSDTC resource oluşturulabilir. Seçenekler aşağıdaki gibidir.

· Birden fazla MSDTC resource grubu yapmak

· Resource grupların içerisinde MSDTC resource’u bulundurmak

· Local MSDTC kullanmak

Şimdi bu seçenekler ile uygulanabilecek senaryolara bakalım.

 

Her SQL Server resource grubu içerisinde MSDTC resource’u tanımlamak

Bu seçenek en iyi high performance’i sunan seçenektir. MSDTC resource’i SQL Server resource grubunun içinde olduğundan dolayı MSDTC ile SQL Server resource’u her daim aynı node’un üzerinde çalışır.

Dolayısıyla network üzerinden MSDTC kullanımı olmayacak ve performans iyi yönde etkilenecektir.

SQL Server otomatik olarak grubun içerisindeki MSDTC resource’unu kullanır. Eğer bu resource fail ya da offline durumdaysa diğer MSDTC resource’ları otomatik olarak kullanılmaz ve distributed transaction’lar hata alır. Eğer diğer MSDTC resource’larının kullanılması isteniyorsa fail durumda olan MSDTC resource’unun SQL Server resource grubundan çıkartılması gerekir.

MSDTC kullanımı kritik durumda ise MSDTC resource’unun “affect group” özelliği active edilebilir. Bu durumda eğer MSDTC resource’u fail eder ve aynı node üzerinde tekrar çalıştırılamazsa grubun tamamı diğer node’a failover yapılacaktır. Hatta SQL Server resource grubu MSDTC resource’una dependent hale getirilebilir. Bu şekilde MSDTC resource fail eder etmez SQL Server resource’u da fail edecektir.

 

Her SQL Server Resource grubu için dedicated MSDTC resource grubu

Bu yöntem seçenekler arasında en yüksek high availability’i sunar. SQL Server resource grubu ve MSDTC resource grubu farklı gruplar olduğu için bağımsız olarak failover yapabilecek yani fail durumları birbirilerine etkilemeyecektir.

Fakat, bağımsız olarak failover yapılabildiği için MSDTC ve SQL Server farklı node’lar üzerinde çalışabilir. Bu yüzden network’ten MSDTC kullanımının performansınının kabul edilebilir bir değer olup olmadığı test edilmelidir.

Bu konfigurasyonda MSDTC için ayrı bir grup yapıldığı için her MSDTC grubu ayrı bir diske ihtiyaç duyacaktır.

Eğer aynı cluster ortamında çok fazla SQL Server resource grup var ise her biri için ayrı MSDTC resource grupları yapılacağı için yönetilebilirlik düşünülmesi gereken bir başka noktadır.

Bu senaryoda SQL Server resource grubu ve MSDTC grubu eşleşmeleri mapping üzerinden yapılmaktadır. Örneğin MSSQL$INST1 adında bir SQL Server resource grubunu MSDTC1 adında bir MSDTC resource grubu ile mapping yapmak için command prompt’ta aşağıdaki kod çalıştırılabilir.

msdtc -tmMappingSet -name “Mapping1” -service “MSSQL$INST1” -clusterResourceName “MSDTC1”

Burada dikkat edilmesi gereken önemli noktalardan biri; yanlış bir mapping yapılsa bile yukarıdaki kod hatasız tamamlanacak ama mapping çalışmayacaktır. Böyle bir durum olup olmadığı yeni bir query ekranında “BEGIN DISTRIBUTED TRAN” komutu çalıştırılarak gözlemlenebilir.

Mapping ile ilgili diğer işlemler ise aşağıdaki gibidir

· Tüm mapping’leri görmek için;
msdtc -tmMappingView *

· Bir mapping’i silmek için;
msdtc -tmMappingClear -name <MappingName>

· Mapping’in test edilmesi için yeni bir query ekranında
BEGIN DISTRIBUTED TRAN

Tek bir MSDTC Resource Grubu

Windows Server 2003’teki gibi tüm application’lar için tek bir MSDTC resource grubu yapıldığı senaryodur. En basit yöntem olarak bilinir. Bu yöntemde tüm application’lar aynı MSDTC’yi kullandığı için MSDTC’de bottleneck oluşabilir. Ayrıca SQL Server ile MSDTC’nin farklı node’lar üzerinde çalışma ihtimalinden dolayı da performans sıkıntısı yaşanabilir. Eğer MSDTC uygulama için çok önemli değilse bu senaryo kullanılabilir.

 

Local MSDTC

Windows Server 2008 ile beraber node’ların kendisinde de local MSDTC instance’i bulunmaktadır. MSDTC logları node’ların kendi üzerinde saklandığı için high availability sunmaz yani olası bir failover’da eğer local MSDTC kullanılıyorsa distributed transaction bilgileri kaybedilecektir. Yüksek erişilebilirlik sunmadığı için production ortamlarında kullanılması tavsiye edilmez.

 

Hybrid Senaryo

Yukarıda anlatılan senaryoların birlikte kullanıldıkları senaryodur. Örneğin aynı cluster’da bulunan bazı application’lar için dedicated MSDTC resurce group’lar yapılırken, bazı application’lar için ortak MSDTC resource’u kullanılabilir. Hatta cluster aware olmayan application’lar için de local MSDTC kullanılabilir.

 

MSDTC Kullanım Önceliği

Eğer bir SQL Server resource grubunda MSDTC resource’u varsa ve aynı zamanda başka bir MSDTC resource’u ile mapping yapıldıysa hangi MSDTC resource’unun kullanılacağı aşağıda sıralanmış kullanım önceliğine göre belirlenir.

1. Eğer varsa SQL Server resource grubunda bulunan MSDTC kullanılır.

2. Eğer varsa mapping yapılmış MSDTC resource’u kullanılır.

3. Cluster’daki default MSDTC resource kullanılır. (Cluster’a ilk eklenen MSDTC resource’una default MSDTC denmektedir.)

4. Local MSDTC kullanılır.

1 ve 2 numarada bulunan MSDTC resource’lar fail durumdaysa otomatik olarak sonraki seçeneklere geçilmez. Öncelikle bu resource’ların silinmesi ya da gruptan çıkartılması gerekmektedir.

Örneğin ilk olarak SQL Server resource grubunda bulunan MSDTC kullanılmak istenir. Eğer bu resource fail durumdaysa otomatik olarak 2. adıma geçilmez. 2. adıma geçilebilmesi için SQL Server resource grubunda bulunan MSDTC resource’unun remove edilmesi gerekmektedir.

Ya da mapping edilmiş MSDTC resource’u fail durumdaysa 3. adıma geçilebilmesi için mapping’in kaldırılması gerekir.

Not : Blog haricinde, faydali gördügüm yazilari ve linkleri twitter adresimden paylasiyorum. Beni twitter'da takip etmek için : twitter.com/turgaysahtiyan