Microsoft Azure SQL Database 主動式異地備援讓您的資料庫更具高可用性
說明
Microsoft Azure SQL Database(以下簡稱SQL Database)預設會維持三個資料複本(一個主要與兩個次要)在執行的狀態,來維持高可用性及容錯能力,因此當主要複本所在的硬體發生失敗,會自動容錯移轉至次要複本,確保在相同資料中心內至少有兩個實體交易一致的資料複本,以避免單點故障導致SQL Database中的資料遺失。但是次要複本您在外部是看不到的,您也無法自行從任何複本來還原資料庫或是手動進行容錯移轉。
現在!!已經不一樣了,透過SQL Database推出的主動式異地備援(Active Geo-replication),針對Premium版本的服務層級甚至新增可以建立4個可讀取的次要複本,更強大的是你可以指定你的複本是要放在哪個資料中心,Microsoft Azure則採用連續複製關係(CONTINUOUS COPY RELATIONSHIP)的概念,自動將主要資料庫的資料複製到次要資料庫。
利用主動式異地備援功能讓您能夠啟動或控制容錯移轉,如下圖所式,假設您想要將終端使用者的讀寫流量由原本的主要資料庫移到次要資料庫,您可以很簡單的利用入口網站就可以完成類似手動容錯移轉的目的。
接下來筆者為您示範主動式異地備援該如何實作?
建立SQL Database伺服器
請先連接Microsoft Azure管理入口網站,點選下方的新增>資料服務>SQL資料庫>自訂建立來建立您的SQL Database伺服器及資料庫。
在指定資料庫設定的步驟中,您必須輸入資料庫名稱、選擇訂用帳戶以及版本,在此筆者示範的是PREMIUM版本,截至本文撰寫為止,只有PREMIUM版本的SQL Database才支援主動式異地備援,所以當您選擇預覽版本的PREMIUM之後,還必須選擇所需要的效能等級及資料庫大小上限,不過效能等級是一分錢一分貨,選擇越高等級的效能等級代表您所要付出的成本也越高,筆者在此先選擇最低的效能等級P1以及小的資料庫大小100MB來做示範,您可以依照您的需求選擇適合的選項。(有關每個效能等級的規格如下表所示)。
最後則是選擇SQL Database伺服器支援的資料庫版本,以及資料庫管理員的帳號及密碼,還有您想要將資料庫伺服器建立在哪個地區的資料中心。其中支援的資料庫版本會決定您將來在該伺服器中可以建立的SQL Database資料庫的版本,由於WEB/BUSINESS與BASIC/STANDARD不能同時存在於同一台資料庫伺服器,因此您在建立伺服器前必須要先考慮清楚。
當您按下上圖的完成之後,不須多久就會您的SQL Database資料庫就已經建立完成,您不需要像過去那樣安裝SQL Server或是進行一些複雜的設定,透過SQL Database就可以很快地使用SQL Server所提供的關鍵任務資料庫平台。
加入複本
資料庫建立完成後,於資料庫名稱上按滑鼠左鍵,進入到SQL Database資料庫頁面後,接著點選上方的異地備援,您就可以看到目前主動式異地備援有哪些複本,由於一開始一定沒有資料庫複本,因此請點選下方的加入複本來建立主動式異地備援的複本資料庫。
當您按下加入複本後,接下來需選擇要加入異地備援的目標伺服器,因此您必須先建立複本所要使用的SQL Database伺服器,由下圖可以看到,筆者將次要複本的伺服器放在日本西部的資料中心,與原本建立資料庫時所在的東亞資料中心是不同的資料中心,您也可以將複本放在同一個資料中心,端看您的應用及架構的設計。而在這個步驟必須注意的是,目標伺服器必須符合下列條件,否則您會選不到可以做為複本的SQL Database伺服器。
- 建立目標伺服器所使用的訂用帳戶必須與來源相同。
- 目標伺服器尚有高階資料庫配額可供使用。
- 來源與複本資料庫不在同一地區,可能增加複寫時所需要的頻寬使用費。
- 複本資料庫的名稱無法自行設定,預設複本資料庫名稱與來源資料庫相同。
雖然主動式異地備援支援不同資料中心的複寫,但是可能因為跨資料中心造成需支付額外的頻寬使用費。
以及您所建立的複本資料庫為Premium版本,費用比其他版本來的高,因此Microsoft Azure會要求您明確地確認您正在建立的資料庫是屬高階資料庫,請勾選【請確認您了解此變更的計費影響】之後按完成。
複本加入成功後您可以在主動式異地備援清單下看到您所建立的複本伺服器及資料庫。
此時若您回到資料庫頁面,您可以看到複寫欄位在未設定異地備援前呈現的是無,但在設定異地備援之後,會根據該資料庫的用途,呈現為來源或複本。以本文的情境為例,您可以從下圖看到在東亞資料中心的premiumdb為來源資料庫,而在日本西部資料中心的premiumdb資料庫為複本資料庫。
測試次要複本
接下來筆者以SSMS分別連接到主要複本(下圖左方的查詢視窗)與次要複本(下圖右方的查詢視窗),並且在主要複本建立資料表t1,然後以迴圈方式寫入十萬筆資料,接著在次要複本上查詢資料表t1,可以發現主要複本的寫入作業還沒結束,次要複本就已經可以查到資料,經過這個簡單的測試可以得知從東亞的資料中心將資料抄寫到日本西部的資料中心,延遲時間相當短。
另外,由於次要複本僅供唯讀使用,因此如果您常在次要複本中新增資料,將會發生寫入失敗的錯誤。
停止複本
若您想要停止主動式異地備援,您可以在來源資料庫中選取您想停止複寫的複本之後,按下方的停止複本。
停止複本時您可以選擇等同步處理完成後再停止,或是立即停止複寫,選定後按下完成。
或是在複本資料庫的異地備援頁面中點選下方的停止複本。
接著勾選立即停止複寫就可以了。
不論您是在來源資料庫或複本資料庫中停止複寫,都不會刪除複本資料庫,因此若您的複本資料庫不需要使用的話,請記得手動自行將之刪除,否則Premium版本的資料庫可能會造成您的帳單費用大增。
此外,一旦停止複本(sotp replica)來源資料庫和複本資料庫便彼此獨立,這時原本只能唯讀的複本資料庫就會變成可讀寫,前端應用程式只要修改連線字串,改連接到這個資料庫就可以繼續寫入資料,這樣的概念有點類似手動容錯移轉。
監控連續複製關係(Continuous Copy Relationship)
若您想要了解主動式異地備援在複本之間資料複製的狀態或進行相關的故障排除,SQL Database提供相關的系統檢視或是PowerShell來讓您了解複寫的狀態,例如下列的T-SQL:
--觀察SQL Database伺服器中每個資料庫的頻寬使用狀況
SELECT time, database_name, direction, class, time_period, quantity
FROM sys.bandwidth_usage
--觀察每個資料庫資料複製的狀態
SELECT name,state, state_desc, is_read_only
FROM sys.databases
--觀察次要資料庫的複寫資訊
SELECT DB_NAME(database_id), start_date, modify_date, percent_complete, partner_server
, partner_database, replication_state, replication_state_desc, maximum_lag
, is_continuous_copy, is_target_role, is_interlink_connected
FROM sys.dm_database_copies
--根據主要資料庫來觀察所有次要資料庫的複寫狀態
SELECT partner_server, partner_database, last_replication, replication_state,
replication_state_desc, last_replication, is_rpo_limit_reached
, is_interlink_connected
FROM sys.dm_continuous_copy_status
--觀察資料庫連續複製作業的狀態
SELECT operation, state, state_desc, percent_complete, error_desc
, start_time, last_modify_time
FROM sys.dm_operation_status
參考資料
Azure SQL Database Backup and Restore
The Future of Azure DevOps: Managing the Development and Lifecycle of Cloud Applications
Azure SQL Database: Under the Hood
Azure SQL Database introduces new service tiers
Azure SQL Database Service Tiers and Performance Levels
Changing Database Service Tiers and Performance Levels
Submit a Database Restore Request
Active Geo-Replication for Azure SQL Database
Failover in an Active Geo-Replication Configuration
Designing Cloud Solutions for Disaster Recovery Using Active Geo-Replication