標籤:style blog http color 使用 strong
1.Listener是什麼
Listener實際上是一個 VirtualNetworkName,用戶端通過這個VNN來串連的具體的sqlserver執行個體 .Listener包含了DNS名稱,port和IPaddress。
當用戶端通過Listener進行串連時,Listener會將請求自動導向到PrimaryReplica或者SecondaryReplica了。
在SQL Server Management Studio對應的記錄
對應的VCO記錄
對應的DNS記錄
下面是一個ADO.NET的連接字串Server=AgListener;Initial Catalog=agdb1;Integrated Security=SSPI;
在這個連接字串中指定了要串連的Listener名稱,這樣用戶端就會自動連接到primaryreplica了。如果發生了failover,在新的primaryreplica上線後,listener會自動將串連導向到新的primaryreplica,無需人為的幹預。
2.Server Load Balancer
SecondaryReplica可以配置成readonly模式,這樣就可以將一些唯讀工作放置到secondaryreplica中進行(例如報表),這樣就可以實現一定程度的Server Load Balancer。並且Listener可以將這些唯讀串連自動導向到SecondaryReplica。
要實現這一功能,需要在SQLServer端和用戶端同時進行一些配置。
SQL Server端
1)Secondary replica要配置成read-intent only或者Yes
2)設定READ_ONLY_ROUTING_URL
下面是一個的READ_ONLY_ROUTING_URL的例子。 語句裡指定了每個replica使用的連接埠,這裡的連接埠號碼需要根據實際instance使用的連接埠號碼進行相應調整
alter availability group ag modify replica on ‘SQL108W2K8R21‘ with (secondary_role(read_only_routing_url=‘tcp://SQL108W2K8R21.259442DOM.COM:1433‘))
alter availability group ag modify replica on ‘SQL108W2K8R22‘ with (secondary_role(read_only_routing_url=‘tcp://SQL108W2K8R22.259442DOM.COM:1433‘))
alter availability group ag modify replica on ‘SQL108W2K8R23‘ with (secondary_role(read_only_routing_url=‘tcp://SQL108W2K8R23.259442DOM.COM:1433‘))
3) READ_ONLY_ROUTING_LIST
為三個replica分別設定readonly routing的順序。以SQL108W2K8R21為例,當SQL108W2K8R21成為Primary replica時,readonly routing的順序依次為SQL108W2K8R22->SQL108W2K8R23-> SQL108W2K8R21. Listener會將用戶端的請求導向到SQL108W2K8R22,如果SQL108W2K8R22不可用,導向到SQL108W2K8R23,以此類推。
alter availability group ag MODIFY REPLICA ON N‘SQL108W2K8R21‘ WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=(N‘SQL108W2K8R22‘, N‘SQL108W2K8R23‘, N‘SQL108W2K8R21‘)))
alter availability group ag MODIFY REPLICA ON N‘SQL108W2K8R22‘ WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=(N‘SQL108W2K8R21‘, N‘SQL108W2K8R23‘, N‘SQL108W2K8R22‘)))
alter availability group ag MODIFY REPLICA ON N‘SQL108W2K8R23‘ WITH (PRIMARY_ROLE(READ_ONLY_ROUTING_LIST=(N‘SQL108W2K8R21‘, N‘SQL108W2K8R22‘, N‘SQL108W2K8R23‘)))
用戶端的設定
需要在連接字串內指定ApplicationIntent=Readonly 並且將database指定為AG內的資料庫
例如:
Server=AgListener;database=agdb1;Integrated Security=SSPI;ApplicationIntent=Readonly
3.Multiple Listener
預設情況下,一個Ag只支援一個listener,當嘗試建立第二個listener時會返回19477錯誤:
The availability group ‘%.*ls‘ already has a listener with DNS name ‘%.*ls‘. Availability groups can have only one listener. Use the existing listener, or drop the existing listener and create a new one.
但實際上我們可以通過下面的方式為AG建立多個Listener
1)開啟Failover Cluster Manager,右鍵ag->Add a resource->Client Access Point
2)填寫Listener名稱
3)右鍵為其分配IPAddress
4) 右鍵ag resource property,設定dependency. 將agListener2添加到Dependencies
5)為Listener分配port,此時port為null
select *from sys.availability_group_listeners
執行下面的語句建立port
alter availability group [ag]
modify listener ‘agListener2‘
(port = 1433)
7)新的Listener就可以使用了,我們在SSMS裡也可以找到相應的記錄
4.MultiSubnetFailover
SQLServer2012開始支援Multi Site SQL Cluster。 一般而言,多個資料中心分布在不同的地理位置,例如在上海和北京分別建立了資料中心,這樣當一個資料中心出現故障後(例如地震等災害),備用的資料中心可以繼續提供服務。
下面是一個多子網的Listener
在多子網環境中,一個Listener下會註冊多個IP Address(之間為OR關係),但只有primary replica所在子網的IP是處於Online狀態的,其餘的均為Offline。如果發生failover,這些IPAddress的狀態會依據對應的replica的角色發生變化。
那麼多子網環境會對Listener有什麼影響呢?
首先要介紹一下RegisterAllProvidersIP屬性。如果值為1,那麼Listener對應的DNS就會出現同名的多條記錄,每個記錄地應一個IP Address。
如果RegisterAllProvidersIP的值為0,那麼只會存在一條DNS記錄,也就是Primary replica所在子網的IP。
如果存在多條重名的DNS(RegisterAllProvidersIP=1)記錄,用戶端會依次請求這些IP Address,如果得到的IP是offline的,那麼會繼續請求一下條記錄.這樣就增加了連線時間,您的應用也可能會出現串連問題。
為瞭解決這個問題,ADO.NET(.NET 3.5.1)引入了MultiSubnetFailover關鍵字,如果MultiSubnetFailover
為True,那麼用戶端會同時嘗試串連所有子網的IPAddress,使用最先響應的那個IP地址來作為最終使用的地址,這樣就極大地縮短了連線時間.
如果RegisterAllProvidersIP=0,那隻有PrimaryReplica子網下的IP會註冊到DNS,當failover發生時,新的primaryreplica子網下的listener的IP會代替之前的IP。這樣就避免的之前的情況。
但在實際環境中,我們還需要考慮DNS的TTL值(Time-To-Live),TTL預設值是1200秒。也就是說當failover發生後,失效的DNS記錄要在用戶端可能要保持20分鐘才會失效,在此期間,用戶端無法通過listener進行串連。
當然我們可以手工執行ipconfig /flushdns才更新記錄,但這樣畢竟需要人工介入。
或者縮短TTL,但TTL值越小,DNSServer的效能消耗就嚴重。需要權衡兩者。微軟的建議值是300秒(5分鐘).
1 OR 0
那麼是什麼時候應當將RegisterAllProvidersIP這是為1,而什麼時候為0呢? 如果您的用戶端支援MultiSubnetFailover關鍵字,那麼建議設定成1,並且在連接字串將MultiSubnetFailover設定為true.
如果用戶端不支援MultiSubnetFailover關鍵字,那麼就設定成0,並修改TTL為300秒
更多資訊
===
如果Listener使用過T-SQL語句或者SSMS建立的,RegisterAllProvidersIP為1
如果是通過ClusterFailovermanager建立的, RegisterAllProvidersIP為0
可以通過powershell修改RegisterAllProvidersIP的值
Get-ClusterResource "SQL Network Name (SQLMULTISUBCLUS)" | Set-ClusterParameter RegisterAllProvidersIP 1/0