PowerShell 操作 Azure SQL Active Geo-Replication

sparkdev發表於2017-05-27

前文中我們比較全面的介紹了 Azure SQL Database Active Geo-Replication 的主要特點和優勢。接下來我們將從自動化的角度介紹如何通過 PowerShell 在專案中實現 Active Geo-Replication 的操作。

從 Azure PowerShell 開始

MS 專門為管理 Azure 寫了一套 PowerShell 元件稱為 Azure PowerShell。我們就是要使用這套元件中提供的介面來操作 Active Geo-Replication。遺憾的是這套元件不會被 Windows 預設安裝。所以請參考 MSDN 上的說明先安裝 Azure PowerShell。不喜歡讀 MSDN 的同學可以參考筆者博文《Azure 基礎:用 PowerShell 自動釋出 CloudServices》中的 “安裝 powershell 的 azure module”小節,會簡潔一些。

在 PowerShell 中登入 Azure

操作 Azure 中的任何資源都需要進行身份認證,所以第一步需要在 PowerShell 中登入 Azure,並且選擇正確的 Azure subscription。
登入 Azure 的命令:

Login-AzureRmAccount

請按照提示輸入您的賬號和密碼。然後選擇當前的 subscription:

Select-AzureRmSubscription -SubscriptionId xxxxxxxx-xxxx-xxxx-xxxx-xxxxxxxxxxxx

Select-AzureRmSubscription 命令的使用場景是:當您有多個 subscription 時,需要通過設定當前 subscription 的方式告訴 PowerShell 命令到底是操作的哪些資源。當然,如果您只有一個 subscription的話就不需要執行這個命令。

新增一個從資料庫

終於進入正題了!假設我們有一個叫 blogdb 的資料庫,它執行在資料庫伺服器 blogtestsvr 中, 這個資料庫伺服器被部署在 East Asia (東亞),我們打算為 blogdb 建立一個從資料庫,從資料庫所執行的資料庫伺服器 blogtestsvr2 部署在 Central US (美國中部)。blogtestsvr 和 blogtestsvr2 都屬於同一個資源組 sqltest。如果您還不是太瞭解主從資料庫或是 Active Geo-Replication 的概念,請先移步這裡

New-AzureRmSqlDatabaseSecondary 命令

New-AzureRmSqlDatabaseSecondary 是專門為一個已經存在的資料庫建立從資料庫的命令,並且在從資料庫建立完成後開始資料的複製。還有一個叫 Start-AzureSqlDatabaseCopy 的命令可以做同樣的事情,但 Start-AzureSqlDatabaseCopy 命令的功能過於繁雜,所以需要建立從資料庫時最好還是使用 New-AzureRmSqlDatabaseSecondary。下面的命令為 blogdb 建立第一個從資料庫:

$db = Get-AzureRmSqlDatabase –DatabaseName "blogdb" -ResourceGroupName "sqltest" -ServerName "blogtestsvr"
$secondaryLink = $db | New-AzureRmSqlDatabaseSecondary –PartnerResourceGroupName "sqltest" –PartnerServerName "blogtestsvr2" -AllowConnections "All"

先去 portal 上檢查一下結果:

藍色的六邊形表示主資料庫,綠色的六邊形表示我們剛建立的從資料庫,注意從資料庫顯示的狀態為 ”Readable”。同時資料庫被標識在地圖上的位置就是真實的資料中心的地理位置。上圖說明 PowerShell 命令已經成功的為blogdb建立了從資料庫。簡單說說上面的命令:
Get-AzureRmSqlDatabase 命令用來獲得主資料庫的資訊,然後傳遞給 New-AzureRmSqlDatabaseSecondary 命令,不然的話 New-AzureRmSqlDatabaseSecondary 的引數列表會很長且含義不清晰。
New-AzureRmSqlDatabaseSecondary 命令的引數主要用來指出從資料庫所在的 resource group, 和 server name。還有 AllowConnections 引數,請把它配置為 "All"。

注意事項

在成功的為主資料庫建立了從資料庫後,讓我們一起來看看一些需要注意的事項。
細心的朋友們可能已經注意到了,新建立的從資料庫和主資料庫的名字是一樣的。並且還有一個不太直觀東西是也一樣的:Service level,說白了就是從資料庫和主資料庫收的錢是一樣的!當然您可以單獨設定從資料庫的 Service level 從而節省預算。
從資料庫的建立是被分成兩個過程的,即建立資料庫和複製資料。資料庫的建立可能很快,但複製資料就不一定了,主要看庫的大小。由於這兩步都完成後 New-AzureRmSqlDatabaseSecondary 命令才會返回,所以當您的資料庫比較大時,這條命令執行的時間會比較長。
還有就是當同名的資料庫已經存在時,New-AzureRmSqlDatabaseSecondary 命令會返回錯誤:

移除從資料庫

知道了怎麼建立從資料庫當然也要能夠把它移除,下面我們使用 Remove-AzureRmSqlDatabaseSecondary 命令把剛才建立的從資料庫移除掉。

$db = Get-AzureRmSqlDatabase –DatabaseName "blogdb" -ResourceGroupName "sqltest" -ServerName "blogtestsvr"
$secondaryLink = $db | Get-AzureRmSqlDatabaseReplicationLink –PartnerResourceGroup "sqltest" –PartnerServerName "blogtestsvr2"
$secondaryLink | Remove-AzureRmSqlDatabaseSecondary

命令本身沒什麼可解釋的,執行完成後去 portal 上看看,從資料庫已經不見了。噢,等等… 好像從資料庫並沒有被刪除掉啊!是的,Remove-AzureRmSqlDatabaseSecondary 命令只是移除了主從資料庫之間的關係,而不會刪除從資料庫。相反,此時的從資料庫已經變成了一個可讀寫的獨立資料庫。

災難恢復

下面讓我們把焦點定位到 Active Geo-Replication 的主要用例:災難恢復。當故障發生在主資料庫時。我們需要通過 Set-AzureRmSqlDatabaseSecondary 命令儘快的把一個從資料庫轉換為主資料庫。

$db = Get-AzureRmSqlDatabase –DatabaseName "blogdb" –ResourceGroupName "sqltest" –ServerName "blogtestsvr2”
$db | Set-AzureRmSqlDatabaseSecondary -PartnerResourceGroupName "sqltest" -Failover

看看 portal 上現在的情況:

搞定!原來只讀的從資料庫已經變成了可讀寫的主資料庫。注意上圖中主從資料庫各自的位置,是不是它們已經轉換了角色呢!
接下來讓我們簡單瞭解下 Set-AzureRmSqlDatabaseSecondary 命令,及使用中需要注意的事項。
Set-AzureRmSqlDatabaseSecondary 命令的執行也分為兩個階段。首先是切換資料複製操作的同步模式,完成所有到從資料庫的資料複製 (切換角色前要保證主從庫中的內容是一樣的)。然後是切換主從資料庫的角色。角色切換完成後就開始從新的主資料庫向新的從資料庫同步資料。當然切換的過程是有代價的,MSDN 上說大概有0到25秒的時間資料庫將不可用,但這個時間不會超過1分鐘。

總結

本文使用 Azure PowerShell 提供的介面實現了建立、移除及恢復 Azure SQL Database Active Geo-Replication 的操作。雖然看上去 PowerShell 指令碼還挺多的 (主要是引數多),但涉及到的核心介面只有三個:New-AzureRmSqlDatabaseSecondary,Remove-AzureRmSqlDatabaseSecondary 和 Set-AzureRmSqlDatabaseSecondary。鑑於個人知識有限,裡面的很多細節都沒有涉及,全當是拋磚引玉吧。

相關文章