SQL Server 2012所支持的Always On技術(shù)集中了故障轉(zhuǎn)移群集障簿、數(shù)據(jù)庫鏡像和日志傳送三者的優(yōu)點娇钱,但又不相同泞莉。故障轉(zhuǎn)移群集的單位是SQL實例馍管,數(shù)據(jù)庫鏡像和日志傳送的單位是單個用戶數(shù)據(jù)庫掸掏,而Always On支持的單位是可用性組茁影,每個組中可以包括一個或者是多個用戶數(shù)據(jù)庫。也就是說丧凤,一旦發(fā)生切換募闲,則可用性組中的所有數(shù)據(jù)庫會作為一個整體進(jìn)行切換。
Always On底層依然采用Windows 故障轉(zhuǎn)移群集的機(jī)制進(jìn)行監(jiān)測和轉(zhuǎn)移愿待,因此也需要先建立Windows Cluster浩螺,只不過可用性組中的數(shù)據(jù)庫不一定非要再存放在共享存儲上了,可以存儲在本地磁盤上仍侥。
Always On最多可以支持8個副本要出,但只有一個可用性副本上運(yùn)行的數(shù)據(jù)庫是處于可讀寫狀態(tài)。這個可讀寫的數(shù)據(jù)庫被稱為主數(shù)據(jù)庫(Primary Database)农渊,同時這個可用性副本被稱為主副本(Primary replica)患蹂,其余的副本都被稱為輔助副本(Secondary replica),輔助副本上的數(shù)據(jù)庫可能是不可訪問的砸紊,或者是只能接受只讀操作(取決于可用性組的配置)传于,這些數(shù)據(jù)庫被稱為輔助數(shù)據(jù)庫。一但發(fā)生故障轉(zhuǎn)移醉顽,任何一個輔助副本都可以成為新的主副本實例沼溜。主副本會不斷地將主數(shù)據(jù)庫上的數(shù)據(jù)變化發(fā)送到輔助副本,來實現(xiàn)副本間的數(shù)據(jù)庫同步游添。
下面系草,先來了解下Always On的關(guān)鍵特性:
1. 同故障轉(zhuǎn)移群集一樣通熄,也需要一個虛擬網(wǎng)絡(luò)名稱用于客戶端的統(tǒng)一連接。
2.一個主服務(wù)器最多對應(yīng)8個輔助服務(wù)器找都,且它們支持只讀功能唇辨,通過配置可以實現(xiàn)讀寫分離。
3.輔助服務(wù)器可以獨立執(zhí)行備份和DBCC維護(hù)命令檐嚣。
4.主服務(wù)器和輔助服務(wù)器之間的數(shù)據(jù)會被加密和壓縮,以提高安全性和網(wǎng)絡(luò)傳輸效率啰扛。
5.支持自動嚎京、手動和強(qiáng)制三種故障轉(zhuǎn)移方式。
6.有儀表盤用于監(jiān)控Always On的運(yùn)行狀態(tài)隐解。
7.可以實現(xiàn)多站點的部署鞍帝,即主站點和輔助站點可以跨物理網(wǎng)絡(luò)。
Always On的基本架構(gòu)
在Windows 故障轉(zhuǎn)移群集的基礎(chǔ)上部署Always On高可用組煞茫,用戶可以在群集節(jié)點上安裝SQL Server單機(jī)實例帕涌,也可以安裝SQL Server群集實例⌒眨可用性副本是單機(jī)實例蚓曼,那么數(shù)據(jù)庫副本就存放在運(yùn)行該實例節(jié)點的本地磁盤上;如果可用性副本是群集實例钦扭,那么數(shù)據(jù)庫副本就存放在共享磁盤上纫版。
可用性組從Windows群集角度來看,就是一個群集資源客情,其中的所有數(shù)據(jù)庫作為一個整體在節(jié)點間進(jìn)行故障轉(zhuǎn)移其弊,當(dāng)然這不包括系統(tǒng)數(shù)據(jù)庫,系統(tǒng)數(shù)據(jù)庫是不能加入高可用性組中的膀斋。
因為需要借助Windows群集實現(xiàn)監(jiān)控和轉(zhuǎn)移梭伐,所以Always On會受到一些限制:
- 一個可用性組中的所有可用性副本必須運(yùn)行在單一的Windows群集上,跨不同Windows群集的SQL Server實例不能配置成一個Always On可用性組仰担。
- 一個可用性組的所有可用性副本必須運(yùn)行在Windows群集的不同節(jié)點上糊识。運(yùn)行在同一個節(jié)點上的兩個不同實例不能用作同一個可用性組的副本。
- 如果某個可用性副本實例是一個SQL群集實例摔蓝,那同一個SQL群集的其他非活躍節(jié)點上安裝的任何其他SQL實例都不能作為它的輔助副本技掏。
- 一個數(shù)據(jù)庫只能屬于一個可用性組。
偵聽器Listener
Always On創(chuàng)建后项鬼,客戶端就需要進(jìn)行連接哑梳,為了讓應(yīng)用程序能夠透明地連接到主副本而不受故障故障轉(zhuǎn)移的影響,我們需要創(chuàng)建一個偵聽器绘盟,偵聽器就是一個虛擬的網(wǎng)絡(luò)名稱鸠真,包括虛擬IP地址悯仙、虛擬網(wǎng)絡(luò)名稱、端口號三個元素吠卷。一旦創(chuàng)建成功锡垄,虛擬網(wǎng)絡(luò)名稱會注冊到DNS中,同時為可用性組資源添加IP地址資源和網(wǎng)絡(luò)名稱資源祭隔,用戶就可以通過這個虛擬網(wǎng)絡(luò)名稱訪問可用性組货岭,而不用關(guān)心連接的是哪一個節(jié)點,它會自動將請求轉(zhuǎn)發(fā)到主節(jié)點疾渴,當(dāng)主節(jié)點發(fā)生故障后千贯,輔助節(jié)點會變?yōu)橹鞴?jié)點,偵聽器也會自動去偵聽主節(jié)點搞坝。與故障轉(zhuǎn)移群集不同搔谴,除了使用虛擬網(wǎng)絡(luò)名稱之外,主副本的真實實例名也可以被用來連接桩撮。
SQL Server 2012允許在副本實例處于運(yùn)行狀況的時候隨時綁定新的IP地址敦第、網(wǎng)絡(luò)名稱和端口號。因此可以隨時為可用性組添加偵聽器店量,而且這個操作會立即生效芜果。
要注意的是,SQL Browser服務(wù)是不支持Listener的融师。這是因為應(yīng)用程序在使用Listener的虛擬網(wǎng)絡(luò)名連接SQL Server時师幕,是以一個默認(rèn)實例的形式進(jìn)行訪問的(只有主機(jī)名,沒有實例名)诬滩,因此客戶端根本就不會去嘗試使用SQL Browser服務(wù)霹粥。
各副本間的數(shù)據(jù)同步
Always On必須要維護(hù)各副本間的數(shù)據(jù)一致性疼鸟,當(dāng)主副本上的數(shù)據(jù)發(fā)生變化后控,會同步到輔助副本上。在主副本和輔助副本上空镜,SQL Server都會啟動相應(yīng)的線程來完成相應(yīng)的任務(wù)浩淘。對于一般的SQL Server服務(wù)器,即沒有配置高可用性吴攒,會運(yùn)行Log Writer的線程张抄,當(dāng)發(fā)生數(shù)據(jù)修改事務(wù)時,此線程負(fù)責(zé)將本次操對應(yīng)的日志信息記錄到日志緩沖區(qū)中洼怔,然后再寫入到物理日志文件署惯。但如果配置了Always On主副本的數(shù)據(jù)庫,SQL Server會為它建立一個叫Log Scanner的線程镣隶,不間斷的工作极谊,負(fù)責(zé)將日志從日志緩沖區(qū)或日志文件里讀出诡右,打包成日志塊,發(fā)送到輔助副本轻猖。因此可以保證發(fā)生的數(shù)據(jù)變化帆吻,不斷送給各輔助副本。
輔助副本上存在固化和重做兩個線程完成數(shù)據(jù)更新操作咙边,固化線程會將主副本Log Scanner所發(fā)過來的日志塊寫入輔助副本磁盤上的日志文件里猜煮,因此稱為固化,然后重做線程負(fù)責(zé)從磁盤上讀取日志塊败许,將日志記錄對應(yīng)的操作重演一遍王带,此時主副本和輔助副本上的數(shù)據(jù)就一致了。重做線程每隔固定的時間點檐束,會跟主副本通信辫秧,告知自己的工作進(jìn)度束倍,主副本由此知道兩邊數(shù)據(jù)的差距被丧。Log Scanner負(fù)責(zé)傳送日志塊,不需要等待Log Writer完成日志固化绪妹;輔助副本完成日志固化以后就會發(fā)送消息到主副本甥桂,告知數(shù)據(jù)傳輸完成,而不需要等待重做完成邮旷,這樣各自獨立的設(shè)計黄选,是盡可能減少 Always On所帶來的操作對數(shù)據(jù)庫性能的影響。