延伸SQL Server 2014 AlwaysOn可用性群組到Microsoft Azure

延伸SQL Server 2014 AlwaysOn可用性群組到Microsoft Azure

說明

SQL Server 2012推出AlwaysOn高可用性解決方案讓您不需要購買昂貴的儲存設備,很輕鬆地就可以建立資料庫層級的高可用性解決方案,到了SQL Server 2014又更強化AlwaysOn的功能,其中包含次要複本的數量由原本的 4個 增加為 8個,在主要複本中斷連接或是在遺失叢集仲裁期間,只要次要複本是設定成可讀取的,依然可以讀取次要複本。以及增加新的系統函數sys.fn_hadr_is_primary_replica和新的DMVsys.dm_io_cluster_valid_path_names並強化sys.dm_hadr_clustersys.dm_hadr_cluster_memberssys.dm_hadr_cluster_networks等DMV以傳回容錯移轉叢集執行個體的資訊。

除了上述AlwaysOn增強的功能外,本文主要著重在SSMS新增的加入Azure複本精靈,如何簡化 AlwaysOn可用性群組建立混合雲高可用性的作業,它有一些必要條件以及注意事項,請見下列的說明。

必要條件

除了Microsft Azure訂用帳戶是一定需要的之外,您還需要讓您內部部署的環境能夠和Microsoft Azure串聯,因此需要使用Microsoft Azure Virtual Network建立站對站VPN(Site to Site VPN),若您點對站(Point to Site VPN)會發生選不到虛擬網路的狀況。而在建立站對站VPN時您可以選擇使用Windows Server的RRAS功能來架設(請見Sky的這篇文章)或是利用現有的VPN設備(請見Bruce的這篇文章或是筆者的這篇文章)來跟Azure連接。

已知問題

筆者一開始測試環境是繁體中文版的Windows Server 2012 R2 Datacenter+SQL Server 2014 Developer,但是在加入Azure複本時,精靈一直要我檢查叢集名稱資源是否在線上,但在叢集管理員看到叢集資源確實正常上線無誤。

AG

image

後來將問題反應到微軟技術支援中心和Microsoft Connect之後,得知這個問題是SQL Server透過WMI查詢來確認叢集資源的狀態時,在繁體中文版的叢集資源名稱為”叢集名稱”,但SQL Server需要的卻是”Cluster Name”(如下圖),導致加入Azure複本精靈誤判為叢集離線而發生失敗。

4

5

變通方式

這個問題已經由技術支援工程師代為提報到SQL Server產品組,得到回應預計在SQL Server 2014 SP1時將一併修復這個問題。在此之前,建議在建立Windows容錯移轉叢集時,每個節點都使用相同的語言版本,且Microsoft Azure虛擬機器組件庫提供的映像都是英文版,若您現階段想測試加入Azure複本的功能,必須使用英文版的作業系統。

建立AlwaysOn可用性群組

首先在本地端的兩台機器上,安裝英文版的Windows Server 2012 R2 Datacenter Edition上安裝英文版的SQL Server 2014 Developer Edition(機器名稱為sql1en和sql2en),然後啟用這兩台機器的Failover Clustering功能。

image

於Failover Cluster Manager建立叢集並將sql1en和sql2en加入叢集節點。

image

為確保後續的步驟順利,容錯移轉叢集執行個體建立成功後,請檢查Cluster Core Resuources中的相關資源Status是否均為Online。以筆者的測試經驗來看,通常是叢集IP位址無法由DHCP取得IP位址導致叢集資源離線,此時只要指定一個沒被使用的IP位址即可。

image

為了稍後初始化AlwaysOn可用性群組時,資料庫引擎可以將備份檔案寫入共享目錄或是其他複本可以讀取共項目路,請在SQL Server Configuration Manager中將Database Engine的Account Name設定為網域使用者,而這個使用者的權限一樣建議符合最小權限原則。

image

若SQL Server所在的伺服器正確加入容錯移轉叢集後,您在SQL Server Configuration Manager裡面就可以看到Windows failover cluster name已經被帶入,此時勾選AlwaysOn High Availability項目下的Enable AlwaysOn Availability Groups,然後重新啟動服務。

image

另外還需要啟用SQL Server的TCP/IP通訊協定,好讓另外一台SQL Server可以透過網路來存取。

image

除了啟用TCP/IP通訊協定外,還需要在Windows Firewall with Advanced Security新增Inbound Rules,允許存取sqlserver.exe,讓預設執行個體1433連接埠和AlwaysOn所使用的5022連接埠都一併開放,您可以選擇針對上述連接埠分別建立Inbound Rules,或是像下圖那樣直接允許外部連接sqlservr.exe。

image

上述在SQL Server Configuration Manager以及防火牆所進行的動作,均必須在所有本地端的SQL Server上進行相同的設定。

設定完畢之後,我們就要開始準備AlwaysOn可用性群組所要保護的資料庫,請在任一容錯移轉叢集下的節點,透過SSMS執行下列T-SQL指令碼來建立資料庫,筆者以sql1en為例,將示範把sql1en當作主要複本來初始化AlwaysOn可用性群組。


CREATE DATABASE [TestDB]
 ON  PRIMARY 
( NAME = N'TestDB', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\TestDB.mdf')
 LOG ON 
( NAME = N'TestDB_log', FILENAME = N'C:\Program Files\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\DATA\TestDB_log.ldf')
GO

資料庫建立成功後,請確定資料庫的Recovery model為Full,這是AlwaysOn可用性群組初始化的必要條件之一。

image

另外一個必要條件是在初始化之前需要做一次完整備份,因此您可以使用下列T-SQL指令碼來備份資料庫,或透過SSMS的GUI來進行。


BACKUP DATABASE TestDB
TO DISK='TestDB.bak'

兩個步驟都做完之後就可以開始建立AlwaysOn可用性群組,請在Object Explorer點選執行個體(SQL1EN)節點下的AlwaysOn High Availability > Availiability Groups > New Avaiability Group Wizard。

image

在New Availbility Group視窗的第一個步驟,依照慣例是歡迎畫面,毫無疑問的我們按Next繼續下一步。

image

輸入您的AlwaysOn可用性群組的名稱,在此以myagdemo做示範,您可以輸入一個適合的名稱,輸入完畢按Next繼續。

image

在Select Databases步驟中New Availability Group精靈會列出所有執行個體中的資料庫,在Status欄位中只有Recovery model為Full並做過完整備份的資料庫才會是Meets prerequisties,而只有符合先決條件的資料庫才能受AlwaysOn可用性群組所保護。若您有多個符合先決條件的資料庫,可以在這個步驟將它們勾選起來,目前執行個體中只有一個資料庫,因此筆者勾選TestDB之後按Next繼續。

image

由於上述步驟是在SQL1EN上面所進行,所以SQL1EN預設就會被當作是主要複本(Initial Role為Primary),接著我們按Add Replica來加入SQL2EN成為次要複本,並分別勾選SQL1EN和SQL2EN的Automatic Failover欄位,此時Synchronous Commit欄位也會自動被勾選,如此一來SQL1EN和SQL2EN就支援自動容錯移轉,至於Readable Secondary用來設定該執行個體擔任次要複本角色時,是否允許唯讀讀取,在此選項選擇Yes,設定完畢之後按Next繼續。

image

再來是需要指定一個執行備份以及交易紀錄備份的存放路徑,好讓其他參與AlwaysOn可用性群組的執行個體可以從這裡讀取備份集進行初始化及重新執行交易紀錄,您可以指定一個資料庫啟動帳戶有權限存取的共享目錄,設定完畢之後按Next繼續。

image

所有設定都完成之後,New Availability Group會驗證相關的共享目錄、磁碟空間以及資料庫設定是否符合建立AlwaysOn可用性群組的條件,在此您會看到Check the listener configuration結果為Warning,這是因為我們尚未設定AlwaysOn 可用性群組接聽程式所致。

由於接聽程式可以在可用性群組完成之後再做,並且要將可用性群組的複本延伸到Microsft Azure,程序上比較複雜,筆者之後會再有專文討論該怎麼進行,因此先按Next繼續。

image

驗證通過之後您可以看到您所要建立的AlwaysOn可用性群組的匯總資料,若沒問題按Finish就可以開始建立可用性群組。

image

若一切順利,您將看到如下圖的畫面,所有燈號都為綠燈,代表AlwaysOn可用性群組已經建立完成,按Close來關閉精靈。

image

接著在Object Explorer可以看到Availability Groups節點下已經有剛剛建立的myagdemo可用性群組,並且Availability Replicas節點下確實SQL1EN為主要複本,SQL2EN為次要複本。而在AlwaysOn可用性群組儀表板上,也可以看到相關的同步狀態以及可用性群組的健全狀態等。

image

加入Azure複本的前置作業

要加入Azure複本您必須要先有Microsoft Azure訂用帳戶,再來您可以安裝Microsoft Azure PowerShell,透過Get-AzurePublishSettingsFiles指令碼來取得發行設定檔。

image

執行上述指令之後,會要求您輸入Microsoft Azure訂用帳戶的帳號密碼,驗證通過之後就會出現下載發行設定檔的畫面,請將該檔案存放在一個適當的地方。

image

接著就可以利用Import-AzurePublishSettingsFile指令來匯入您所下載的發行設定檔,並安裝管理憑證。

image

加入Azure複本

完成前一節的步驟之後,您就可以在剛剛所建立的myagdemo可用性群組上按滑鼠右鍵,選擇Add Replica。

image

歡迎畫面一樣直接按Next跳過。

image

在開始加入其他複本前,必須能連接可用性群組中現有的執行個體,按Connect順利連接之後就可以按Next繼續。

image

由於我們要做的是加入Azure複本,因此在這個步驟中,請按Add Azure Replica,接著會出現Add Azure Replica Wizard來引導你。

image

首先需透過管理憑證來連接Microsoft Azure,由於上一節我們已經透過Microsoft Azure PowerShell建立管理憑證在自己的電腦上,所以您才可以選擇您所要管理的Microsoft Azure訂用帳戶所對應的管理憑證。

image

接下來要輸入訂用帳戶的Subscription ID,可以使用Get-AzureSubscription取得或是在Microsoft Azure管理入口網站查閱。

image

做到這個步驟您應該看到類似下圖的樣子,接著就可以利用您所選擇的管理憑證以及Subscription ID來連接Microsoft Azure。

image

若確定您的管理憑證以及Subscription ID正確無誤,按下Connect時有時候會出現一些錯誤訊息,您可以多按個一兩次,正確連接之後您就開始建立Azure複本的VM。若您使用點對站建立VPN,在這個步驟您將會看不到您在Microsoft Azure管理入口網站所建立的虛擬網路,因為它只支援站對站VPN。

image

輸入相關VM的資訊之後按OK。

image

接著會提醒您有些授權相關的條款,當然也是得按OK才能繼續。

image

若設定正確,您將會看到如下圖的樣子。在此筆者先將Readable Secondary選擇為Read-intent only,後面會在介紹怎麼透過唯讀路由來讀取次要複本。

image

再來一樣是需要指定備份所需的共享路徑,這和加入內部部署的複本是一樣的。

image

在Validation步驟中您可能遇到Checking if the cluster name resource is online出現Access is denied的錯誤訊息。您必須以系統管理員身分執行SSMS在做這些設定就可以順利通過驗證。

image

重新以系統管理員身分執行SSMS並加入Azure複本,您應該就會看到驗證得以順利通過。

image_thumb_43

下圖為加入Azure複本時的摘要資訊,若沒問題按Finish繼續。

image

加入Azure複本的程序比較多一點,您可能要等待多一點時間,等他完成之後您應該會看到如下圖的結果。

image

最後您可以回到AlwaysOn可用性群組儀表板來查看Azure複本是否正確建立並且開始同步資料。

image

參考資料

使用加入 Azure 複本精靈 (SQL Server)

SQL Server 2014 新功能 (Database Engine)

針對可用性群組手動準備次要資料庫 (SQL Server)

在管理入口網站中設定站對站 VPN

Windows Azure - 使用Windows Server 2012 R2 RRAS對Azure進行Site-To-Site連線-Server設定篇

簡單三步驟,建立組織與 Microsoft Azure 之間 IPsec VPN 連結

利用VPN裝置建立與Microsoft Azure 虛擬網路的站對站VPN

SQL Server 2014 AlwaysOn Availability Groups - Add Azure Replica wizard in action

Tutorial: AlwaysOn Availability Groups in Hybrid IT (PowerShell)