本文將介紹如何運用Windows Azure 資料同步服務來同步企業內部的SQL Server 以及 SQL Database。
【情境說明】
在 tech.days Taiwan 2012 的第三天筆者選了一堂朝雲端專業DBA邁進:深入剖析 Windows Azure SQL Database 完整資料庫管理、雲端報表建立、建置分散式雲端資料庫(AZR304)課程,其中介紹一個用來讓企業建置混合雲時,可以同步企業內的 SQL Server 的資料到 Windows Azure SQL Database(以下簡稱 SQL Database),或是從 SQL Database 同步回企業內部的 SQL Server,這個雙向同步資料的新利器稱之為【資料同步(Data Sync)】。此外,您也可以在 SQL Database 之間進行資料同步處理。
詳細的資料同步流程如下圖所示,本文將重點放在內部部署的 SQL Server 與 SQL Database 同步的介紹。
【佈建 SQL 資料同步預覽伺服器】
首先打開瀏覽器連接至舊版 Windows Azure 管理入口網站,於管理入口網站中點選左側的【資料同步 > 佈建 SQL 資料同步預覽伺服器】。
於使用規定視窗中勾選【我同意上述使用規定】接著按下一步。
選擇您的 Windows Azure 訂閱後按下一步。
接著依照您的 SQL Database 的區域,選擇一個合適的區域來建置 SQL 資料同步伺服器,建議您可以選擇靠近 SQL Database 的區域可以降低資料同步時的延遲時間。
【設定同步處理群組】
接著必須將您的 SQL Server 加入 SQL 資料同步預覽處理模組,請點選下圖紅色框框處,接著依照畫面的提示逐步完成設定。
於步驟 1 輸入同步處理群組名稱,然後按下一步。
於步驟 2 按下圖紅色框框處來加入 SQL Server。這個步驟主要是用來將內部的 SQL Server 加入資料同步群組。
由於第一次使用資料同步功能,因此您必須選擇【將新的 SQL Server 資料庫加入同步處理模組】,在同步處理方向的選擇上,有三種方向可供選擇:
1. 雙向:允許內部 SQL Server 與中樞資料庫互相同步資料。
2. 從中樞同步處理:只允許由中樞資料庫同步資料給內部的 SQL Server。
3. 同步處理到中樞:只允許從內部 SQL Server 同步資料給中樞資料庫。
本文以雙向模式為範例,將分別示範由 SQL Database 更新資料後同步回內部的 SQL Server,以及由內部的 SQL Server 同步資料到 SQL Database。
【安裝 SQL 資料同步預覽代理程式】
由於整個資料同步的過程必須倚靠用戶端同步代理程式來完成,因此在加入新的 SQL Server 資料庫到同步群組前,您必須安裝代理程式,請選擇【安裝新的代理程式】接著按下一步。
請按下載按鈕來下載 SQL 資料同步預覽代理程式。
接著按下圖紅色框框處的 Download 按鈕來下載並安裝SQL 資料同步預覽代理程式。
安裝過程截圖如下:
若您未安裝 Microsoft System CLR Types for Microsoft SQL Server 2012 和 Microsoft SQL Server 2012 Shared Management Objects,SQL 資料同步預覽代理程式會中斷安裝作業,並貼心的提醒您必須安裝上述兩個元件才可以安裝代理程式,請依照畫面提示來安裝必要條件後再重新執行 SQL 資料同步預覽代理程式的安裝。
Microsoft System CLR Types for Microsoft SQL Server 2012 安裝過程截圖如下:
Microsoft SQL Server 2012 Shared Management Objects 安裝過程截圖如下:
接續前面安裝 SQL 資料同步預覽代理程式步驟,您必須設定可以執行 Windows 服務的帳號來執行 SQL 資料同步預覽代理程式,輸入 User Name 時請注意必須輸入【網域或電腦名稱 \ 使用者名稱】的格式,否則安裝時會告訴您沒有適當的權限而導致安裝失敗。
於選擇安裝路徑步驟,您可以直接按 Next。
於確認安裝步驟中直接按 Next。
接著就可以完成代理程式的安裝。
再回到 Windows Azure 管理入口網站來設定代理程式的唯一名稱及產生代理程式金鑰,代理程式名稱本文以 NWDataSyncAgent 為例,您可以依照自己的需求來設定這個名稱。
代理程式金鑰產生後,請按【複製】接著按下一步。
【註冊要同步的 SQL Server 資料庫】
由程式集或開始畫面點選下圖的 Microsoft Data Sync Agent Preview 來設定您要和 SQL Database 同步的 SQL Server 。
於 Microsoft SQL Data Sync Agent Preview 視窗中按【Submit Agent Key】接著貼上前一步驟所複製的金鑰。
若金鑰無誤的話您將可以點選【Register】來註冊您所要同步的資料庫,本文以 Northwind 資料庫為例,輸入相關資訊後按 Save。
截至目前步驟為止,您將看到如下圖的畫面,代表 Northwind 資料庫已經和 SQL 資料同步代理程式順利連接,設定完畢之後請勿關閉 Microsoft SQL Data Sync Agent Preview。
再次回到資料同步設定頁面,當您點選取得資料庫清單後,會顯示您的代理程式並讓您選擇要加入同步群組的資料庫(如下圖所示)。
【建立中樞資料庫】
步驟 3 則是用來建立中樞資料庫(Hub Database),中樞資料庫是用來提供成員資料庫上傳異動資料,並將異動的資料下載到其他成員資料庫,以達到資料同步的目的。首先請按下圖紅色框框處來加入中樞資料庫。
於【將資料庫加入同步群組】視窗中輸入 SQL Database 的伺服器名稱、資料庫名稱以及認證等資訊,由於此一步驟並不會幫您同時建立您要當作中樞資料庫的資料庫,因此您必須事先透過 Windows Azure 或 SQL Database 管理入口網站來建立。
【設定同步排程和衝除解決原則】
步驟四主要是在設定有關同步的間隔時間,您可以設定同步排程間隔最短 5 分鐘最長 1 個月。另外在發生資料衝突時您所希望的衝突解決策略為何?若您選擇的是【中樞獲勝】,當資料發生衝突時會以第一個寫入中樞資料庫的資料列為主,並將之同步到成員資料庫;若選擇【用戶端獲勝】會以最後一筆寫入中樞資料庫的資料列為主來同步到成員資料庫。
【定義用於同步處理的資料庫】
步驟五用來定義同步處理的資料集,換言之您可以在這個步驟定義那些資料表要進行資料同步,請點選【編輯資料集】來進行設定。
若您的資料表有不符合 SQL Database 的限制將會看到如下圖紅色部分的警告訊息,最常見的就是資料表沒有叢集索引。但只要您選擇同步的資料表不違反限制,並不會影響您使用資料同步功能,在此筆者選擇 Customer 以及 Employees 資料表來做為資料同步的示範,其中故意設定資料列篩選條件為 Employees 資料表的EmployeeID 小於等於 5 的資料列才參與資料同步,而 Customer 由於沒有設定資料列篩選條件,因此所有異動都會同步到 SQL Database。
【部署】
設定完內部部署的 SQL Server 以及中樞資料庫後,點選下圖紅色框框處的【部署】來完成第一階段(內部部署 <-> 中樞資料庫)的設定。
接著您將會看到如下圖的部署進度。
部署成功後您將看到如下圖在中樞資料庫以及內部部署的 SQL Server 都出現綠色打勾以及好的字樣。但很不幸的是,在筆者的環境中代理程式不斷警告下一個服務將不再支援這個代理程式的版本,經過測試似乎不影響本文所要呈現的效果,先暫時略過這個警告,後續找到問題發生原因在上來跟大家分享。
【將 SQL Database 加入同步處理群組】
最後一個步驟就是設定您要同步的 SQL Database,請點選下圖紅色框框處。
於【將資料庫加入同步處理群組】視窗中輸入 SQL Database 的伺服器名稱、您要同步的目的資料庫名稱與相關的認證資訊,以及選擇同步處理的方向,在這個地方的同步模式與設定內部部署的 SQL Server 概念類似,筆者就不再贅述。
設定完畢後您將看到如下圖的畫面,請點選【部署】來完成資料同步的設定。
部署完成之後您將會看到 SQL Database 也出現綠色勾勾的圖示,代表已經部署成功。
【測試一】
本文在內部部署的 SQL Server 以及 SQL Database 都選用雙向同步模式,所以我們先來測試從內部的 SQL Server 更新資料,看看是否可以順利同步到 SQL Database。
連接到 SQL Server 後於查詢編輯器中輸入下列 T-SQL 來更新 CustomerID 為 ALFKI 的資料列,將其 Region 資料行更新為 WA。
1: USE Northwind2: GO3:
4: --更新前 Region 為 Null5: SELECT *6: FROM Customers7: WHERE CustomerID = 'ALFKI'8:
9: --將 Region 更新為 WA
10: UPDATE Customers11: SET Region = 'WA'12: WHERE CustomerID = 'ALFKI'13:
14: --更新後 Region 為 WA
15: SELECT *16: FROM Customers17: WHERE CustomerID = 'ALFKI'
然後連接到 SQL Database 執行下列的 T-SQL,您可以由下圖紅色框框處看到,在 SQL Database 上的 Customers 資料表中 CustomerID 為 ALFKI 的資料列,它的 Region 資料行已經由 NULL 被同步為 WA。
1: USE Northwind2: GO3:
4: --更新前 Region 為 Null5: SELECT *6: FROM Customers7: WHERE CustomerID = 'ALFKI'
執行結果如下:
另外一個實驗筆者利用下列的 T-SQL 敘述來更新 Employees 資料表中 Region 資料行為 NULL 的資料列,將之 Region 資料行更新為 n/a。
1: USE Northwind2: GO3:
4: --更新前
5: SELECT *6: FROM Employees7: WHERE Region IS NULL8:
9: --更新Region資料行
10: UPDATE Employees11: SET Region = 'n/a'12: WHERE Region IS NULL13:
14:
15: --更新後
16: SELECT *17: FROM Employees18: WHERE Region = 'n/a'
執行結果如下:
在 SQL Database 中我們可以看到只有 EmployeeID 小於等於 5 的資料才被資料同步服務同步到 SQL Database,而且之前在內部部署的 SQL Server 中對於 Region 等於 null 的資料列更新作業,也順利同步過來了。
【測試二】
測試一主要測試資料同步的方向是由內部部署同步到雲端,接著我們可以來測試 SQL Database 進行異動時,資料是否可以順利同步回企業內部的 SQL Server。
請利用 SSMS 連接到 SQL Database,接著輸入下列的 T-SQL 來將 Customers 資料表 CustomerID 為 ALFKI 資料行,其 Region 資料行更新為 n/a。
1: -- 更新前2: SELECT *3: FROM Customers4: WHERE CustomerID = 'ALFKI'5:
6:
7: --將 ALFKI 的 Region 資料行更新為 n/a
8: UPDATE Customers9: SET Region = 'n/a'10: WHERE CustomerID = 'ALFKI'11:
12:
13: --更新後
14: SELECT *15: FROM Customers16: WHERE CustomerID = 'ALFKI'
執行結果如下:
接著回到內部部署的 SQL Server 執行下列的 T-SQL 敘述,
1: USE Northwind2: GO3:
4: SELECT *5: FROM Customers6: WHERE CustomerID = 'ALFKI'
執行結果如下:
另外有關 SQL Database 上的 Employees 資料表的異動後同步回 SQL Server 的實驗基本上跟 Customers 相同,就留給您自行測試。
【參考資料】
- 朝雲端專業DBA邁進:深入剖析 Windows Azure SQL Database 完整資料庫管理、雲端報表建立、建置分散式雲端資料庫(AZR304)
- Add a Windows Azure SQL Database as a Member
- SQL Azure Data Sync Agent Preview
- Microsoft® SQL Server® 2012 Feature Pack
- Glossary of Terms (SQL Data Sync)
- 設定同步處理群組