Alwayson支援的,是一個可用性組,每個可用性組是包含了多個使用者資料庫的容器,可用性組内的資料庫可以作為一個整體進行故障轉移。
AlwaysOn關鍵特性:
一、類似叢集的特性
1.多個資料庫可以一起遷移
2.提供一個虛拟伺服器名,這個虛拟伺服器名始終是目前的primary。
3.可以有自動切換,手動切換和強制切換
4.一個primary,最多4個secondary(sql server 2014增加到了8個)
5.Dashborad可以監視alwayson運作狀況
6.依賴于windows 2008叢集,實作多站點部署。
二、類似鏡像的特性:
1.每個secondary上有一份資料複制,可以支援隻讀請求
2.可以在secondary執行備份和dbcc指令
3.在配置情況下,隻讀請求可以被重定向到secondary
4.自動修複某些類型資料頁的損壞
5.primary和secondary之間的資料被加密和壓縮,提高安全性和減少流量。
目錄
<a href="#_Toc386629478">3.AlwaysOn可用組... 1</a>
<a href="#_Toc386629479">3.1 AlwaysOn基本架構... 1</a>
<a href="#_Toc386629480">3.2 AlwaysOn資料同步原理... 2</a>
<a href="#_Toc386629481">3.3 AlwaysOn可用性模式... 2</a>
<a href="#_Toc386629482">3.3.3可用副本之間“DISCONNECTED”狀态... 3</a>
<a href="#_Toc386629483">3.3.4 Secondary的”NOT SYNCHRONIZING”狀态... 3</a>
<a href="#_Toc386629484">3.4 AlwaysOn故障轉移... 4</a>
<a href="#_Toc386629485">3.4.1自動故障轉移... 4</a>
<a href="#_Toc386629486">3.4.2 手動故障轉移... 4</a>
<a href="#_Toc386629487">3.4.3強制故障轉移... 5</a>
<a href="#_Toc386629488">3.4.4 多子網可用性組故障轉移... 5</a>
<a href="#_Toc386629489">3.4.5 Split Brain(大腦分裂)5</a>
<a href="#_Toc386629490">3.4.6 連接配接,可用性副本和可用性資料庫狀态... 5</a>
<a href="#_Toc386629491">3.5 建立一個Always可用性組... 5</a>
<a href="#_Toc386629492">3.6 可讀的Secondary. 5</a>
<a href="#_Toc386629493">3.6.1 ApplicationIntent. 5</a>
<a href="#_Toc386629494">3.6.2 副本可讀模式設定... 6</a>
<a href="#_Toc386629495">3.6.3隻讀路由... 6</a>
<a href="#_Toc386629496">3.6.4 secondary上可能出現的性能問題... 7</a>
<a href="#_Toc386629497">3.6.5 統計資訊... 7</a>
<a href="#_Toc386629498">3.7 監控AlwaysOn可用性組的運作狀态... 8</a>
AlwaysOn的可用性組包含一個或者多個資料庫,這些資料庫被稱為可用性資料庫。每個secondary上都有這些資料庫的副本。這些資料庫彼此之間是同步的。
AlwaysOn可用性組從windows叢集角度看是一個叢集資源,可用性資料庫在叢集的節點之間進行遷移。AlwaysOn不能應用到系統資料庫,不能保證系統資料庫的高可用性。
在AlwaysOn成員内,隻有一個成員是可讀寫的,稱為主資料庫(Primary),其他的叫副本(secondary)。
限制:
1.可用性組運作在一個windows叢集上,不能跨叢集
2.可用性成員要在不同的windows叢集節點上
3.如果集中一個可用性成員是一個sql叢集,那麼這個叢集上的其他非活躍節點上安裝的執行個體不能成為這個可用性組的副本
4.一個資料庫隻能屬于一個可用性組
Listener:AlwaysOn重要的元件之一,可以讓應用程式透明的連接配接到primary。
Listener由虛拟ip位址,虛拟DNS,端口号組成。建立完Listener之後,會為目前primary添加虛拟ip和虛拟DNS。這樣就可以透明的通路primary。SQL Server 2012支援在啟動狀态下綁定ip位址,DNS,端口來完成這個功能。
Listener不會使用sql browser,listener會以預設執行個體方式連接配接。
如果Listener的端口是1433端口(可以和執行個體共享端口),那麼可以很簡單的直接使用虛拟網絡名連接配接到副本。如果Listener使用的是非預設端口:
1.如果primary監聽1433端口,那麼直接用DNS就可以通路了。
2.如果primary監聽的不是1433端口,那麼用戶端必須在連接配接字元串中指定端口号才能連接配接到primary。(從SQL Server 2012 SP1測試看可以是listener的端口,也可以是primary監聽的端口)
建議所有節點使用相同的監聽端口,不然故障轉移之後可能導緻listener無法通路primary。
AlwaysOn要把primary上的變化同步給secondary,是以要完成以下幾件事情:
1.把primary上的修改記錄下來
2.把修改傳輸到副本
3.把修改應用到副本
AlwaysOn完成以上事情的步驟:
1.使用Log Write線程,負責把日志資訊寫入到記憶體的log buffer上,然後log buffer 寫入到磁盤(固化)。
2.primary有個工作線程log scanner,将log buffer中的日志讀出來,打包成日志塊傳輸給secondary
3.在secondary上2個線程,redo和harden。Harden負責将發送過來的日志快寫入到日志檔案中。Redo負責将日志記錄翻譯成修改操作,在輔助資料庫上完成。
AlwaysOn有2個可用性模式:異步送出,同步送出
和資料庫鏡像類似,不多介紹。
日志同步步驟
步驟
行為
連接配接
通過鏡像端點連接配接
請求資料
發起一個請求到primary,要求發送日志塊,雙方協商出一個LSN
運作Log Scanner
Log Scanner運作,将日志塊發送到secondary
固化和重做日志
Secondary固化和重做線程來處理log scanner發送過來的日志塊,固化将日志塊固化到硬碟,重做線程将日志重做
回報進度
當secondary收到primary3個消息,就會回報進度,如果超過1秒沒有3條,也會回報進度,進度資訊包含了哪些LSN被應用到了secondary。
事務送出步驟
送出事務
在primary上執行commit
寫入到本地日志記錄
Primary上commit會被寫入成一條日志記錄,log writer會把知道commit為止的日志,全部寫入到LDF檔案。當寫入磁盤後,primary等待secondary成功固化的消息
掃描日志
當日志塊被寫入到磁盤,給Log Scanner信号,開始工作。把日志發送給日志塊解碼器,解碼器會搜尋要特殊處理的操作,這些特殊操作解碼器會以一個消息發送給secondary。如果解碼完畢,整個日志塊被發送給secondary
處理日志塊消息
收到日志塊,被固化和重做
完成送出
Primary收到了secondary的确認,完成事務送出并發送給用戶端确認
當primary為複制的釋出資料庫,那麼log reader代理程式不會去處理那些沒有被secondary固化的日志,這樣做的目的是當複制發送資料比較快的時候,當secondary變成primary,就可能發送訂閱資料庫的資料比釋出資料庫新的問題。
副本之間會固定間隔發送ping,如果在逾時期間内收到ping,那麼正常。收到之後副本會重置連接配接上的逾時計數器。Primary和secondary通過ping來判斷批次是否依舊處于活動狀态。
如果ping逾時,那麼primary和secondary連接配接戶進入disconnected狀态。
回話逾時限制可以設定,預設為10s,最小允許5s。一般建議大于10s。
如果一個事務在secondary上重做失敗,那麼secondary的資料庫會進入 not synchronizing狀态。
AlwaysOn依賴Windows故障轉移叢集。AlwaysOn需要一個叢集Resource DLL來連接配接到Windows叢集和SQL Server執行個體。Windows叢集需要透過AlwaysOn的Resource DLL來控制資源的上線和離線。
AlwaysOn的可用性組的資源是“SQL Server Availability Group”Resource DLL叫Hadrres.DLL,并在Hadrres.exe定義了可用性組isalive的檢查方法。
注意點:
1.可用性組也是叢集資源,healthchecktimeout為30000毫秒。
2.無論有多少個可用性組,隻有一條sp_server_diagnostics來診斷可用性組。
3.sp_server_diagnostics用來檢查執行個體的健康,而不是檢查每個資料庫的狀态。
Alwayson發生故障之後,是否會立刻故障轉移,去決議可用性模式和故障轉移模式的設定.
異步送出
同步送出,手動故障轉移
同步送出,自動故障轉移
自動故障轉移
不支援
支援
手動故障轉移
強制故障轉移
自動故障轉移和手動故障轉移都要求故障轉移目标是使用同步送出模式并且處于SYNCHRONIZED狀态的secondary。
異步送出的隻能使用強制故障轉移。
要求條件:
1.目前primary和secondary都設定為同步模式并且是自動故障轉移模式
2.primary和secondary必須是同步的
3.primary邊的不可用
步驟:
1.如果目前primary在運作,會把primary和secondary的連接配接斷開
2.如果secondary上面有沒有完成的日志,secondary會繼續執行redo,完成secondary的前滾。
3.前滾完成,secondary變成primary
4.新的primary在連接配接到一個secondary之前,不管前滾是否結束會把自己的狀态設定為NOTSYNCHRONIZED,隻有當secondary連接配接到primary,primary會變成SYNCHRONIZED。
5.當老的primary重新開機之後,發現其他人變成primary,會把自己變成secondary。
當primary和secondary處理SYNCHRONIZED狀态,就可以執行手動故障轉移,如果primary停止運作,secondary就會進入RESOLVEING角色,RESOLVEING是一個角色不是狀态,和primary和secondary類似。可以執行強制故障轉移,但是會丢失資料。
方法:
1.直接用windows故障轉移管理器
2.使用TSQL
3.使用SSMS UI
4.使用powershell
注意:隻有為自動故障轉移模式的可用性副本才能使用windos故障轉移管理器。
強制故障轉移和鏡像的類似,會有可能會照成資料丢失。
要在用戶端連結字元串的MultiSubnetFailover參數設定為true。除支援外必須通過listener來通路可用性副本。
大腦分裂就是,在一個可用性組裡面出現了2個primary。這個是不被允許的。可用性組資源屬性中有一個leasetimeout,windows會定期的和windows叢集認為的primary通信,如果leasetimeout都沒有收到windows叢集的确認消息,那麼副本就認為自己被切換掉了。
略
AlwaysOn中secondary可以做隻讀,來分擔讀負荷。
要讓隻讀操作能夠透明的被自動轉向到secondary,要解決一下三個問題:
1.用戶端要标記自己的操作時隻讀的
2.secondary要被設定為可讀
3.用戶端連接配接,要被重定向才能到secondary,需要隻讀路由。
AplicationIntent用來标記用戶端發送來的請求類型:
ApplicationIntent = ReadOnly
ApplicationIntent = ReadWrite
Secondary通路方式有3中:
1.NONE:輔助資料庫不接受任何類型的資料通路
2.READ_ONLY:和自由applicationintent=ReadOnly是可以通路
3.ALL:任何連結都可以連接配接,但是隻有隻讀操作可以執行
Primary通路類型隻有ReadWrite和ALL。
如果Primary為ReadWrite,用戶端連接配接字元串中指定了ApplicationInit為ReadOnly,并指向了Primary,那麼通路會被拒絕。
實作隻讀路由需要以下條件:
1.用戶端要使用TCP協定,通過Listener連接配接到primary
2.用戶端連接配接字元串ApplicationIntent=ReadOnly
3.至少有一個secondary被配置為ALL或者READONLY
4.為secondary配置隻讀路由URL和在primary中的隻讀路由清單
ALTERAVAILABILITYGROUP [AG1]
MODIFYREPLICAON
N'COMPUTER01'WITH
(SECONDARY_ROLE (ALLOW_CONNECTIONS=READ_ONLY));
ALTERAVAILABILITYGROUP [AG1]
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL =N'TCP://COMPUTER01.contoso.com:1433'));
N'COMPUTER02'WITH
(SECONDARY_ROLE (READ_ONLY_ROUTING_URL =N'TCP://COMPUTER02.contoso.com:1433'));
MODIFYREPLICAON
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('COMPUTER02','COMPUTER01')));
(PRIMARY_ROLE (READ_ONLY_ROUTING_LIST=('COMPUTER01','COMPUTER02')));
GO
1.連接配接請求會首先被直到primary上
2.primary檢查目标資料庫,确認該資料庫屬于可用性組
3.如果屬于,檢查隻讀路由清單,如果沒有隻讀路由清單,隻讀路由不會工作
4.若發現隻讀路由,會依次檢查清單,直到發現第一個通路模式設定為READONLY或者 ALL的secondar。
5.primary把隻讀路由URL通過TDS發送給用戶端
6.用戶端重新定向到secondary。
因為secondary上同時存在讀寫,是以會存在堵塞的情況,為了保證隻讀的性能,AlwaysON會使用行版本控制來消除堵塞問題
複雜查詢的運作也會影響日志redo,盡量在業務低谷期運作這些查詢
Secondary上可以用索引,但是不能建立索引,是以要用的時候要在primary上建立
因為secondary隻讀,是以隻能在primary建立統計資訊,然後同步到secondary。Alwayson會在tempdb上建立臨時的統計資訊。來替代永久的 統計資訊。
臨時統計資訊以_readonly_database_statistic字尾。