PowerShell 操作 Azure SQL Active Geo-Replication 實戰

Azure SQL Database Active Geo-Replication簡介》一文中,我們比較全面的介紹了 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 的同學可以參考筆者博文《使用 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 的概念,請先移步這裏

1. 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"。

2. 注意事項

在成功的爲主數據庫創建了從數據庫後,讓我們一起來看看一些需要注意的事項。

  • 細心的朋友們可能已經注意到了,新創建的從數據庫和主數據庫的名字是一樣的。並且還有一個點不太直觀: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。實際操作中的很多細節都未涉及,希望本文能起到拋磚引玉的作用。

發佈了7 篇原創文章 · 獲贊 1 · 訪問量 8915
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章