SQL Server 2016 ile birlikte gelen yeniliklerden birisi de AlwaysOn yapısında yer alan ikincil replika sunucuları arasında için yük dengeleme özelliğidir. Bu özellik read-only modunda çalışan replika sunucuları arasında gelen isteklerin yük dağılımlı olarak yönlendirilmesini sağlar.
SQL Server 2012 ve 2014 de read-only yönlendirme trafiği yönlendirme listesindeki ilk uygun replika sunucusuna yönlendirilmekteydi. Eğer bu sunucuya erişilemez ise listedeki diğer sunucuya yönlendirilirdi. Eğer çok sayıda ikincil replika sunucunuz var ise okuma işlemlerini bu sunucular arasında yük dengeli olacak şekilde yönlendiremezsiniz.
SQL Server 2016 da sorgulamalar yük dengeli olarak sunuculara dağıtılabilmektedir.
Uygulanışı:
Yapılandırma için üç adet SQL Server 2016 sunucu kullanıyorum. Bu sunucular Windows Server 2016 üzerine kuruludur.
ORTACAG ismi ile açlışan bir AlwaysOn yapım mevcut. WINSRV01 primiary server, WINSRV02 ve 03 secondary server olarak görev yapmaktadır. Listener ismi olarak da “LST” yi kullanmaktayız.
İlk yapmamız gereken ikincil replika sunucularını read-intent only moda çekmek.
Her ikincil replika ve birincil sunucu için bağlantı adresi tanımlıyoruz:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
ALTER AVAILABILITY GROUP ORTACAG MODIFY REPLICA ON N'WINSRV03' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://WINSRV03:1433')); GO ALTER AVAILABILITY GROUP ORTACAG MODIFY REPLICA ON N'WINSRV03' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://WINSRV03:1433')); GO ALTER AVAILABILITY GROUP ORTACAG MODIFY REPLICA ON N'WINSRV01' WITH (SECONDARY_ROLE (READ_ONLY_ROUTING_URL = N'TCP://WINSRV01:1433')); GO |
Bu adres ikincil replika sunucularına bağlanacak uygulamaların giriş noktasıdır. Sistem adresi ve port numarası içermelidir. Database mirroring de kullanılan endpoint URL ile benzer mantığa sahiptir.
Birincil replika sunucusu için yönlendirme listesi oluşturmamız gerekmektedir.
1 2 3 |
ALTER AVAILABILITY GROUP ORTACAG MODIFY REPLICA ON N'WINSRV01' WITH (PRIMARY_ROLE (READ_ONLY_ROUTING_LIST= (('WINSRV02', 'WINSRV03'), 'WINSRV01'))); |
Yapılandırma bitmiştir.
Bu aşamadan sonra gelen read-only istekler WINSRV02 ve 03 e yönlendirilecektir. İlk gelen bağlantı üçüncü sunucuya , ikinci gelen bağlantı isteği ikinci sunucuya dördüncü gelen bağlantı isteği tekrar üçüncü sunucuya gidecektir. İşleyiş bu şekilde devam etmektedir. Round-robin mekanizması yönlendirme listesindeki sunucular için çalışacaktır.
Yönlendirme listesini ve sırasını görmek için aşağıdaki sorguyu çalıştırabiliriz.
1 2 3 4 5 6 7 8 9 |
select ar.replica_server_name,arl.routing_priority, ar2.replica_server_name,ar2.read_only_routing_url from sys.availability_read_only_routing_lists arl join sys.availability_replicas ar on (arl.replica_id = ar.replica_id) join sys.availability_replicas ar2 on (arl.read_only_replica_id = ar2.replica_id) order by ar.replica_server_name asc, arl.routing_priority asc |
SQL Server 2012 ve 2014 için yönlendirme tablosundaki öncelik numaraları ilk olarak üçüncü server daha sonra ikinci sunucu olarak gelmektedir.
Bizim yaptığımız ayarlara göre SQL Server 2016 da ikinci ve üçüncü sunucunun öncelikleri eşittir.
İkinci sunucu istekleri kabul etmeyecek duruma geçerse eğer tüm istekler üçüncü sunucuya yönlenmektedir.
Yönlendirme listesindeki tüm sunucular (WINSRV02 ve WINSRV03) erişilemez durumda ise read-only istekleri birincil replika sunucusu olan WINSRV01 e yönlendirilir.
Test aşaması:
Yapımızı test etmek için SQL CMD komut satırı aracını kullanabiliriz.
Sqlcmd -S LST -E -K readonly -d ortacdemireldb komutu ile oturum açıyorum. Burada kullandığım LST listener ismidir.
Oturum açtığım sunucuyu sorgulattığımda iki numaralı sunucu üzerinden bağlantı kurulduğunu görmekteyim.
Oturumu kapatıp tekrar denediğimde bu sefer üç numaralı sunucu üzerinden bağlantı kuruluyor.