Bu makalede Multi-Subnet Cluster yapısını detaylı bir şekilde görmüş olacağız. Multi subnet Cluster yapısı farklı network’lerde olan sunucuların aynı cluster içerisine alınması işlemidir. Aynı lokasyonda veya başka bir lokasyonda cluster içerisine alınan sunucuların tek bir cluster içerisine eklenmesi işlemidir. Bu olay Disaster Recovery olarak karşımıza çıkmaktadır.
Aşağıdaki resimde Multi-Subnet Cluster yapısını görmekteyiz.

Multi-Subnet Cluster default olarak RegisterAllProvidersIP’ı enable eder. Offline ve online IP adresleri DNS’e kaydedilir. Uygulama kaydededilmiş bütün IP adreslerini dns server’dan alır ve sırayla bağlanmaya çalışır. Farklı networkten bir ip eklenirse RegisterAllProvidersIP 1 olur.
Yukarıdaki resimde görüldüğü gibi kullanıcıların connection string’inde MultiSubNetFailover= True değerini yazılması gerekmektedir. Kullanıcılar bu parametreyle bağlanmaya çalıştığında dns serverdan kaydedilmiş olan ip değerlerini okur. Sırasıyla bağlanmaya çalışır. Makalenin sonunda belirlediğimiz sunucunun TTL değeri ile sunucu üzerinden almış olacak.
Kendi localimde RegisterAllProvidersIP değerine nasıl bakıldığını ne gibi ayarlar yapıldığını görelim.
Windows PowerShell yönetici olarak çalıştırılır. İlk olarak sunucu üzerinde PowerShell’i açarak Get-ClusterResource komutunu çalıştırıyoruz. Aşağıda ekran görüntüsünü görebilirsiniz. Gerçek sistemde Multi Subnet yapılarında IP adress kısmında AG’ye bağlı ikinci bir ip adresi gözükür. Get-ClusterResource komutu ile gelen ekranda ikinci göreceğim ip availability group üzerinde listener’a vermiş olduğum ikinci ip değeridir.

Not: Gerçek multi-subnet yapılarında ikinci bir listener eklendiğinde ikinci bir ip address gözükmektedir.
Yukarıdaki gelen ekranda Availability group’un network name’i bulunur. Network name’in bir üstündeki ip address kısmıda bunun ip adresi olmuş oluyor gerçek multi subnet sistemlerinde ikinci bir ip görünür offline veya online olmaktadır. (Buda tekrar söylüyorum listener’dan gelen ikinci bir ip adresidir.)
PowerShell üzerinden başka çalıştıracağımız komut ise aşağıdadır. Yukarıdaki network name kısmını aşağıdaki yere koyabiliriz.
Get-ClusterResource "AG23_LISTENER" | Get-ClusterParameter
Not: SQL AG ve Listener olan network name’in eklenmesi gerekmektedir.
Kodu PowerShell üzerinden çalıştırdığımızda aşağıdaki gibi bir ekran gelmesi gerekir. Bu ekranda RegisterAllProvidersIP kısmından değerini görebilirsiniz. 1 değeri aktif olduğunu göstermektedir. Benim sunucumda herhangi bir multi subnet yapısı olmamasına rağmen değerin 1 olduğu görünüyor. Bunun sebebi sunucularımızın üzerinde AlwaysOn Availability Group yapımızın kurulu olmasıdır.

Multi subnet yapısının olmaması RegisterAllProvidersIP değerinin 1 gözükmesi bazen cluster’ımızı validate ettiğimizde bize uyarı mesajının dönmesine sebep olabilir.
Eğer sistemimizde farklı network’da bir node yoksa bu değerin 0 yapılması gerekmektedir.
Validate Cluster yaptıktan sonra gelen sonucu göstermek için View Validation Report kısmına tıkladığımızda bize aşağıdaki hatayı veriyor.


“The RegisterAllProvidersIP property for network name ‘Name: ‘ is set to 1. For the current cluster configuration this value should be set to 0.”
Bu hatanın önüne geçmek için aşağıdaki RegisterAllProvidersIP değeri 0 olarak yapılması gerekmektedir. Bunun için aşağıdaki komut kullanılır.
Get-ClusterResource "AG23_LISTENER" | Set-ClusterParameter RegisterAllProvidersIP 0

Yukarıdaki komutu çalıştırıp 0 değerini aktif etmek istediğimizde Failover Cluster ekranında ilgili kısım offline ve online yapılır ve değerler set edilmiş olur.


Sonra sırasıyla ip ve cluster isminin online’a çekilmesi gerekmektedir.

Take offline yapılıp tekrar online işlemine alınır.
Multi subnet kurulmuş olan yapımızda ise RegisterAllProvidersIP değeri aşağıdaki komutla 1 yapılabilir.
Get-ClusterResource "AG23_LISTENER"|Set-ClusterParameter RegisterAllProvidersIP 1
Sadece bu değerin bir yapılması yeterli olmaz. Ayrıca sql serverın dns sunucundan sürekli bağlantı sağlayıp aktif olan listener ip değerini öğrenmek ister. Bu yapı aşağıdaki ilgili powershell scriptiyle gördüğümüz HostRecordTTL süresidir. Bu süre sql serverın 1200 saniye bekledikten sonra listenerdan gerçek ip değerini öğrendiği yapı olarak karşımıza çıkmaktadır. Bu değerin gerçek sistemlerde 300 olması önerilmektedir.
Get-ClusterResource "AG23_LISTENER" | Get-ClusterParameter

Get-ClusterResource "AG23_LISTENER" | Set-ClusterParameter HostRecordTTL 300

Son kullanıcının connection stringinde MultiSubnetFailover=True ifadesi yazması bağlantı sağlayacağı zaman yeni listener değerini sunucu 300 saniye bazında kontrol edilip almasına sebep olacaktır. 300 saniye beklemeyecek bağlantı sağlayacağı listener’ın hangi aktif ip bağlantısı olduğunu MultiSubnetFailover=True parametresiyle anlamış olacaktır.
Test etmek için bir linked server bağlantısı kurulur. Linked server sunucusunda listener ile connect olunacağı zaman connection string bölümüne ilgili ifade yazılmalıdır.

Bu makalede multi subnet yapısına bir nebzede olsa değinmiş olduk. Başka bir makalede görüşmek dileğiyle.
“Allah yolunda infak edin ve kendinizi kendi ellerinizle tehlikeye atmayın. İyilik edin. Şüphesiz Allah, iyilik edenleri sever.” Bakara Suresi, 195. Ayet