SQL Server於Microsoft Azure Virtual Machine的高可用性解決方案-AlwaysOn可用性群組(中)
準備工作
由於在新增Active Directory網域服務時,是使用建立VM時所輸入的使用者,這個使用者預設是VM的Administrators,因此在完成dcpromo之後,該使用者也會被加入Domain Admins及Enterprise Admins,因此有足夠的權限可以在其他加入網域的VM進行後續的準備工作。當然,您也可以像MSDN文件上所述,在網域中建立一個專門用來新增Failover Cluster角色和建立WFSC,一切就依照您實際的環境需求來決定。
總之,在SQL Server VM建立完成,使用足夠權限的使用者帳戶,透過RDP來連接到VM,並在每一台SQL Server VM中進行下列的動作:
一、加入網域
將VM中的網路卡DNS位址,設定為網域控制站的IP位址,若您不知道網域控制站被分配到哪個IP位址,可以在Microsoft Azure管理入口網站中,虛擬網路的儀表板中查看。
網路卡的DNS設定完成後,就可以將虛擬機器加入前面所建立的網域,加入網域後會要求重開機來讓相關設定生效。
二、將網域管理者帳戶加入SQL Server的sysadmin伺服器角色
在加入網域之後重開機之前,先將網域管理者的帳戶加入SQL Server的sysadmin伺服器角色,好讓後面以網域帳戶登入VM建立叢集及組態AlwaysOn可用性群組時不需要登入登出來切換帳戶,您可以透過SSMS的GUI來建立SQL Server登入,也可以透過下列的T-SQL指令碼來進行:
USE [master]
GO
CREATE LOGIN [SQLPASS\terrychuang] FROM WINDOWS WITH DEFAULT_DATABASE=[master]
GO
ALTER SERVER ROLE [sysadmin] ADD MEMBER [SQLPASS\terrychuang]
GO
三、建立防火牆規則
在SQL Server VM中開啟Windows Firewall with Advanced Security並建立Inbound Rule,允許外部存取【%ProgramFiles%\Microsoft SQL Server\MSSQL12.MSSQLSERVER\MSSQL\Binn\sqlservr.exe】,如下圖所示:
四、變更SQL Server執行個體的服務啟動帳戶
為了讓SQL Server AlwaysOn可用性群組可以透過共享目錄在初始化以及重新執行交易記錄時,執行個體有足夠的權限可以讀寫備份檔及交易記錄檔,因此需要將執行個體的服務啟動帳戶設定為網域使用者。筆者在建立好網域服務後隨即就建立了三個網域使用者,分別是SQLSvc1、SQLSvc2和SQLSvc3,用來作為sql1、sql2和sql3的SQL Server執行個體的服務啟動帳戶。
五、新增Failover Cluster功能
先前有提到SQL Server AlwaysOn可用性群組必須依附在WSFC上,所以您必須在VM中啟用Failover Clstering功能,才能在後面的步驟中將這些SQL Server VM加入到叢集節點。
建立WSFC
完成前一節的準備工作之後,接下來就是找一台SQL Server VM,開啟Failover Cluster Manager來建立WSFC,由下圖可以看到筆者已經建立一個名稱為sqlha的叢集,其中包含sql1、sql2和sql3等伺服器節點。
WSFC建立完成後,叢集IP Address會處於Offline的狀態,您可以在IP Address上按滑鼠右鍵,選擇Properties。
在General頁籤終將IP Address設定為Static IP Address,並且輸入一個Microsoft Azure虛擬網路中未被使用的IP位址,設定完畢後按OK。
最後在叢集名稱(sqlha)上按滑鼠右鍵選擇Bring Online,若一切順利您應該會看到叢集以及叢集IP Address狀態均處於Online。
建立SQL Server AlwaysOn可用性群組的準備工作
在開始建立SQL Server AlwaysOn可用性群組前,您必須要先準備一個共享目錄來做為初始化可用性群組,以及後續可用性複本之間複寫作業所需要的存放位置,您可以在任何一台VM中建立共享目錄,並授予每一台SQL Server執行個體的服務啟動帳戶有讀寫的權限。
設定完畢您會看到目錄已經被分享,它的共享目錄位址為\\SQL1\Backup。
接下來您必須在每一台SQL Server VM開啟SQL Server Configuration Manager,在執行個體的服務上按滑鼠右鍵,接著點選AlwaysOn High Availability頁籤,您應該會在Windows failover cluster name中看到您的叢集名稱,此時勾選下方的【Enable AlwaysOn Availability Groups】按OK,重新啟動SQL Server執行個體的服務以使設定生效。
建立SQL Server AlwaysOn可用性群組
SQL Server AlwaysOn可用性群組概念上類似於資料庫鏡像,都是資料庫層級的高可用性解決方案,因此在開始之前,筆者使用下列的T-SQL來建立要加入可用性群組的資料庫:
CREATE DATABASE AGDB
GO
USE AGDB
GO
CREATE TABLE t1 (c1 int primary key)
GO
DECLARE @i int = 1
WHILE @i <= 10
BEGIN
INSERT INTO t1 VALUES (@i)
SET @i+=1
END
GO
SELECT *
FROM t1
GO
接著使用下列T-SQL做一次完整備份,這是AlwaysOn可用性群組建立時的必要條件之一。
USE master
GO
BACKUP DATABASE AGDB TO DISK='AGDB.bak'
GO
另一必要條件是資料庫的Recovery model必須設定為Full。
確定資料庫已經做過完整備份並且設定為Full Recovery Model之後就可以使用New Availability Group Wizard來建立可用性群組。請點選【Object Explorer > 執行個體 > AlwaysOn High Availability】接著按滑鼠右鍵選擇New Availability Group Wizard。
歡迎畫面可以直接略過,按Next繼續。
接著精靈會要你輸入Availability group name,在此筆者輸入MyAG作為我的可用性群組名稱。
在Select Databases步驟中您會看到,剛剛所建立的AGDB資料庫Status是Meets prerequisties,只有Full Recovery Model並做過完整備份的資料庫才能被設定為可用性資料庫。勾選AGDB之後按Next繼續。
由下圖您可看到目前SQL1是主要複本(Initial Role為Primary),請按Add Replica來加入SQL2和SQL3做為次要複本。
次要複本加入完成後,您可以選擇要自動容錯移轉的執行個體,以及設定次要複本是否可供讀取,您可以依照需求來設定。本文以下圖的設定來示範,讓SQL1和SQL2可以互相自動容錯移轉(Automatic Failover),而自動容錯移轉採用同步認可(Synchronous Commit),未勾選Synchronous Commit的SQL3執行個體,則採用非同步認可模式,最後將所有執行個體的Readable Secodary都設定為Yes,讓這些執行個體成為次要複本時,都是可讀取的次要複本。
在這個步驟選擇Full資料同步偏好,並輸入前面所建立的共享目錄路徑,精靈會透過這個路徑來將資料庫備份及交易記錄備份還原到其他次要複本。
接著精靈便會開始驗證相關可用性群組的設定及環境,在此您會看到一個警告,這是因為我們尚未建立接聽程式,先暫時不管它直接按Next繼續,因為在Microsoft Azure上的SQL Server AlwaysOn可用性群組接聽程式的建立方式和企業內部部署時不同,您沒辦法直接在精靈之中完成建立接聽程式。
確認所有組態正確無誤,就可以按Finish來開始建立可用性群組。
稍後若一切順利,您將看到如下圖的樣子,所有作業都已經成功完成。
回到【Object Explorer>AlwaysOn High Availability>Availability Group】就可以看到MyAG已經建立完成,在MyAG節點上按滑鼠右鍵選擇Show Dashboard。
您就可以透過AlwaysOn可用性群組的儀表板來觀看可用性群組的狀態及相關資訊。
同時,在Failover Cluster Manager的【叢集名稱>Roles】節點項目下,也可以看到MyAG也被註冊到叢集之中成為叢集角色。
參考資料
Azure 虛擬機器中的 SQL Server 高可用性和災害復原
教學課程:Windows Azure 中的 AlwaysOn 可用性群組 (GUI)
Use ReadIntent Routing with Azure AlwaysOn Availability Group Listener