本文旨在解決Always On無法從secondary replica通過listener連接集群,時(shí)而出現(xiàn)不能訪問的常見問題。
Always On介紹
Always on是SQL Server on VM的架構(gòu)下最常見的高可用方案。
其基本原理為創(chuàng)建一個(gè)至少為2臺(tái)VM所組成的Windows集群,每臺(tái)VM上安裝一臺(tái)SQL Server Instance。由其中的一臺(tái)SQL instance作為主節(jié)點(diǎn)(primary replica)提供對(duì)外讀寫訪問,同時(shí)通過日志傳輸?shù)男问教峤坏搅硗庖慌_(tái)節(jié)點(diǎn)(secondary replica)進(jìn)行數(shù)據(jù)同步。
Secondary replica可以提供只讀功能,用于做讀寫分離或高可用(強(qiáng)烈建議依舊保持備份的習(xí)慣)。
備注
在SQL server 2016之前的版本,組成Windows cluster還需要一臺(tái)Domain controller(DC)。搭建步驟:在Azure VM中手動(dòng)配置Always On可用性組。
在Azure中搭建Always On的過程并不復(fù)雜,但是經(jīng)常有客戶會(huì)遇到搭建Always On之后無法使用App連接的自動(dòng)故障轉(zhuǎn)移功能。
Always on的自動(dòng)故障轉(zhuǎn)移功能基于Always on Listener。Listener會(huì)被注冊(cè)為一個(gè)windows cluster中的resource,類似于VIP概念;在集群發(fā)生故障轉(zhuǎn)移時(shí)listener會(huì)被漂移到新primary的VM中。對(duì)于客戶端來說,只需要訪問Listner的IP地址就可以保證永遠(yuǎn)連接到當(dāng)前的primary數(shù)據(jù)庫(kù)上。
在傳統(tǒng)的IDC環(huán)境中,Always On會(huì)自動(dòng)將Listener所屬的虛擬IP地址與網(wǎng)卡物理地址注冊(cè)到路由表中,所以無論任何節(jié)點(diǎn)都可以通過Listener找到primary所在的服務(wù)器地址并建立鏈接。
在Azure環(huán)境下,該地址無法被注冊(cè),所以我們需要通過增加一個(gè)Load Balancer的方式來為L(zhǎng)istener的訪問請(qǐng)求進(jìn)行轉(zhuǎn)發(fā)。
參考示例腳本:使用PowerShell將IP地址添加到現(xiàn)有負(fù)載均衡器
該腳本非常重要,會(huì)在primary節(jié)點(diǎn)上創(chuàng)建一個(gè)始終監(jiān)聽在<n.n.n.n>端口上的監(jiān)聽,并會(huì)隨著primary切換而自動(dòng)轉(zhuǎn)移到新的primary VM上。本示例中使用59999。
在配置好了listener之后可能會(huì)遇到以下幾個(gè)常見問題:
在primary節(jié)點(diǎn)上可以通過listener IP訪問集群,但在secondary上無法訪問listener IP,只能通過提供primary服務(wù)器名或IP的方式來進(jìn)行連接。
在secondary上有時(shí)候可以訪問listener IP有時(shí)候就不行,隨機(jī)出現(xiàn)。
如果遇到上述問題,我們可以通過以下幾個(gè)步驟進(jìn)行排錯(cuò):
開始=>運(yùn)行=>cmd輸入netstat-a檢查,是否59999監(jiān)聽端口已經(jīng)在primary節(jié)點(diǎn)中存在。
檢查Azure門戶中Load Balancer上的probe(探測(cè)器),探測(cè)的端口是否為59999或者是之前在PowerShell中創(chuàng)建的<nnnnn>端口。
[int]$ProbePort="<nnnnn>"#Probe port
經(jīng)常會(huì)有客戶錯(cuò)誤配置為1433端口,對(duì)于LB來說,1433在primary和secondary都為存活狀態(tài),所以會(huì)隨機(jī)的分配request給任何一臺(tái)節(jié)點(diǎn),可能是primary,可能是secondary。
由于Always On必須要先訪問primary,所以如果該請(qǐng)求發(fā)給了secondary就會(huì)得不到響應(yīng)。
Azure門戶中Load Balancer的front IP是否與Windows cluster resource中的listener的IP完全一致。
負(fù)載均衡規(guī)則中的probe是否配置。
如果以上步驟全部配置正確,通常就可以正常的使用Always On了。