AlwaysOn Group Listener

來源:互聯網
上載者:User

標籤: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

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.