如果您對資料一致性有嚴格要求,可以在建立一致性快照組時開啟應用一致性快照功能,應用一致性快照會確保應用程式內部的資料一致並將其包含在快照中。本文介紹如何通過ECS控制台或Go SDK建立Linux和Windows的應用一致性快照。
背景資訊
如果您在建立一致性快照組時開啟應用一致性快照功能,系統將根據實際情況為您建立應用一致性快照或檔案系統一致性快照。
快照類型 | 說明 | 應用情境 |
應用一致性快照 |
| 對資料一致性有嚴格要求的應用,特別是資料庫和關鍵業務系統,確保在災難恢複時能夠立即恢複到一個邏輯上正確的狀態。 |
檔案系統一致性快照 |
| 適用於需要確保檔案系統整體一致性的情境,比如檔案伺服器、文件管理系統等,特別適合那些關注檔案階層完整性的備份需求。 |
使用限制
目前僅ESSD類型的雲端硬碟支援建立應用一致性快照,且雲端硬碟未開啟多重掛載功能。
不支援跨執行個體建立應用一致性快照,僅支援為單台ECS執行個體的雲端硬碟建立應用一致性快照。
前提條件
確保ECS執行個體的作業系統在以下範圍內:
Windows:Windows Server2012 R2及以上作業系統。
Linux:CentOS 7.6及以上版本、Ubuntu 18.04及以上版本或Alibaba Cloud Linux 2。
ECS執行個體已安裝雲助手Agent。具體操作,請參見安裝雲助手Agent。
如果您需要通過Go SDK建立應用一致性快照,需確保:
已經安裝Go運行環境。具體操作,請參見下載和安裝Golang。
已經下載並安裝阿里雲Go SDK。具體操作,請參見開始使用。
操作步驟
通過控制台建立
步驟一:為ECS執行個體配置RAM角色
登入RAM控制台。
建立應用一致性快照相關的RAM角色、為RAM角色授權並授予ECS執行個體。具體操作,請參見建立ECS執行個體RAM角色並授予給ECS。其中:
RAM角色:樣本名稱為AppSnapshotRoleName
可信實體類型:阿里雲服務
自訂權限原則:樣本名稱為AppSnapshotPolicy,內容如下:
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:DescribeSnapshot*", "ecs:CreateSnapshot*", "ecs:TagResources", "ecs:DescribeDisks" ], "Resource": [ "*" ], "Condition": {} } ] }
該策略具有查詢快照相關資訊、建立快照、設定標籤和查詢雲端硬碟資訊等許可權。
步驟二:為執行個體建立應用一致性快照
Linux執行個體
在Linux執行個體中,您需要根據ECS執行個體上的應用程式自訂Shell指令碼(prescript.sh和postscript.sh)實現應用一致性。本節介紹如何為Linux執行個體建立應用一致性快照。
根據ECS執行個體上的應用,準備對應的指令碼,並提前上傳到ECS執行個體。
指令碼
說明
上傳路徑
指令碼類型
指令碼許可權
指令碼內容
prescript.sh
用於在執行可能影響應用程式的操作之前,暫停應用程式的所有寫操作,確保當前的資料狀態不會因操作過程中新產生的資料而不一致。
/tmp/prescript.sh
Shell
僅root使用者具有讀、寫和執行許可權
需根據實際業務制定,例如為MySQL建立應用一致性快照最佳實務(Linux)
postscript.sh
一旦完成了可能影響應用的操作(如備份完成),postscript.sh指令碼會被用於恢複應用程式到正常工作狀態,允許寫操作繼續進行。
/tmp/postscript.sh
如何將檔案上傳至ECS執行個體,請參見使用Workbench上傳或下載檔案。
說明如果指令碼設定錯誤(例如許可權、上傳路徑或指令碼名稱設定錯誤等),最終建立的快照為檔案系統一致性快照。
進入ECS執行個體列表頁面。
登入ECS管理主控台。
在左側導覽列,選擇 。
在頂部功能表列處,選擇目標ECS執行個體所在地區。
找到目標執行個體,在操作列選擇
。在建立快照一致性組對話方塊中,設定快照一致性組參數。
選擇需要建立快照一致性組的雲端硬碟並設定其他快照參數。
設定應用一致性快照。
如果選中啟用應用一致性快照和啟用檔案系統IO暫停與恢複,並正確設定指令碼,則建立應用一致性快照。
如果選中啟用應用一致性快照和啟用檔案系統IO暫停與恢複,但未設定指令碼或未正確設定指令碼,則建立檔案系統一致性快照。
說明如果執行個體未安裝雲助手,選中啟用應用一致性快照後,ECS執行個體將自動安裝雲助手外掛程式。
單擊確定。
建立後會返回雲助手命令ID和命令執行ID,您可以根據命令執行ID查看建立結果。
Windows執行個體
在Windows執行個體中,主要是通過Windows作業系統的磁碟區陰影複製服務VSS實現應用一致性。本節介紹如何為Windows執行個體開啟應用一致性快照。
進入ECS執行個體列表頁面。
登入ECS管理主控台。
在左側導覽列,選擇 。
在頂部功能表列處,選擇目標ECS執行個體所在地區。
找到目標執行個體,在操作列中選擇
。在建立快照一致性組對話方塊中,設定快照一致性組參數。
選擇需要建立快照一致性組的雲端硬碟並設定其他快照參數。
設定應用一致性快照。
如果同時選中啟用應用一致性快照和是否預設包含Writer,則建立應用一致性快照。
如果只選中啟用應用一致性快照,則建立檔案系統一致性快照。
說明選中啟用應用一致性快照後,ECS執行個體將自動安裝雲助手外掛程式。
單擊確定。
建立後會返回雲助手命令ID和命令執行ID,您可以根據命令執行ID查看建立結果。
步驟三:檢查快照建立結果
建立應用一致性快照後,您可以在雲助手頁面查看是否建立成功,並在快照頁面查看建立的快照一致性組和快照資訊。
在雲助手頁面,查看應用一致性快照是否成功建立。
在快照頁面查看建立的快照一致性組和快照資訊。
在左側導覽列,選擇 。
單擊快照一致性組頁簽,找到已建立的快照一致性組,單擊快照一致性組ID查看快照詳情。
在快照資訊地區,根據快照的標籤資訊,查看建立的快照是應用一致性快照還是檔案系統一致性快照。
如果顯示
APPConsistent:True
標籤,表示建立的是應用一致性快照如果顯示
FsConsistent: True
標籤,表示建立的是檔案系統一致性快照
通過Go SDK建立
步驟一:為ECS執行個體配置RAM角色
通過調用介面AttachInstanceRamRole為目標ECS執行個體設定RAM角色(樣本為AppSnapshotRoleName)。
以下為Go SDK程式碼範例:
package main
import (
"fmt"
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
)
func main() {
// 請確保代碼運行環境設定了環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 工程代碼泄露可能會導致AccessKey泄露,並威脅帳號下所有資源的安全性。以下程式碼範例使用環境變數擷取AccessKey的方式進行調用,建議使用更安全的STS方式。
client, err := ecs.NewClientWithAccessKey(
"cn-hangzhou",
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
//調用AttachInstanceRamRole為執行個體綁定RAM角色
request := ecs.CreateAttachInstanceRamRoleRequest()
request.Scheme = "https"
request.RamRoleName = "AppSnapshotRoleName" //設定RAM角色名稱
request.InstanceIds = "[\"i-bp17r83nppqf141v****\"]" //設定執行個體ID
response, err := client.AttachInstanceRamRole(request)
if err != nil {
fmt.Print(err.Error())
}
fmt.Println(response.String())
}
調用結果樣本如下所示,返回參數說明,請參見AttachInstanceRamRole。
步驟二:調用RunCommand為執行個體建立應用一致性快照
Linux執行個體
通過調用雲助手介面RunCommand為一台或多台Linux執行個體建立應用一致性快照。
以下為Go SDK程式碼範例:
package main
import (
"fmt"
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
)
func main() {
// 請確保代碼運行環境設定了環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 工程代碼泄露可能會導致AccessKey泄露,並威脅帳號下所有資源的安全性。以下程式碼範例使用環境變數擷取AccessKey的方式進行調用,建議使用更安全的STS方式。
client, err := ecs.NewClientWithAccessKey(
"cn-hangzhou", //設定執行個體所在地區
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
//調用RunCommand為執行個體建立應用一致性快照。
request := ecs.CreateRunCommandRequest()
request.Scheme = "https"
request.Type = "RunShellScript"
//建立應用一致性快照的命令,具體資訊,請參見CommandContent內容說明。
request.CommandContent = "acs-plugin-manager --exec --plugin app-snapshot-plugin --params=-RamRoleName=\"AppSnapshotRoleName\",-EnableFsFreeze=true,-TimeoutInSeconds=30,-PreScriptPath=\"/tmp/prescript.sh\",-PostScriptPath=\"/tmp/postscript.sh\",-ExcludeDiskId=\"\",-Name=\"LinuxApp1\""
request.InstanceId = &[]string{"i-bp17r83nppqf141v****"} //設定執行個體ID
response, err := client.RunCommand(request)
if err != nil {
fmt.Print(err.Error())
}
fmt.Printf("response is %#v\n", response)
}
CommandContent參數中內容說明:
acs-plugin-manager --exec --plugin app-snapshot-plugin
:表示執行雲助手外掛程式app-snapshot-plugin
。--params=
表示外掛程式的配置參數,具體參數說明,如下表所示。參數
類型
是否必傳
描述
ExcludeDiskId
String
否
ECS執行個體中不需要建立快照的雲端硬碟。
Name
String
是
快照一致性組名稱。
Description
String
否
快照一致性組描述資訊。
RamRoleName
String
是
ECS執行個體綁定的RAM角色,取值請參見步驟一:為ECS執行個體配置RAM角色。
PreScriptPath
String
否
prescript.sh指令碼路徑(/tmp/prescript.sh)。prescript.sh指令碼需要符合以下條件:
在許可權上,僅root作為owner使用者具有讀、寫、執行許可權,即700許可權。
在內容上,指令碼內容需要根據應用自行定製。
重要Linux執行個體建立應用一致性快照時必須設定此參數。如果指令碼設定錯誤(例如許可權、儲存路徑或檔案名稱設定錯誤等),最終建立的快照將是檔案系統一致性快照。
PostScriptPath
String
否
postscript.sh指令碼路徑(/tmp/postscript.sh)。postscript.sh指令碼需要符合以下條件:
在許可權上,僅root作為owner使用者具有讀、寫、執行許可權,即700許可權。
在內容上,指令碼內容需要根據應用自行定製。
重要Linux執行個體建立應用一致性快照時必須設定此參數。如果指令碼設定錯誤(例如許可權、儲存路徑或檔案名稱設定錯誤等),最終建立的快照將是檔案系統一致性快照。
EnableFsFreeze
Boolean
否
是否在建立儲存快照前使用Linux的FsFreeze機制確保檔案系統處於唯讀一致性。
預設為True。
TimeoutInSeconds
Integer
否
IO逾時時間。
預設為30秒。
ScriptTimeoutInSeconds
Integer
否
指令碼執行逾時時間。
預設值為1800秒。
調用結果樣本如下所示,返回參數說明,請參見RunCommand。
Windows執行個體
通過調用雲助手API介面RunCommand為一台或多台Windows執行個體建立應用一致性快照。
以下為Go SDK樣本:
package main
import (
"fmt"
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
)
func main() {
// 請確保代碼運行環境設定了環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 工程代碼泄露可能會導致AccessKey泄露,並威脅帳號下所有資源的安全性。以下程式碼範例使用環境變數擷取AccessKey的方式進行調用,建議使用更安全的STS方式。
client, err := ecs.NewClientWithAccessKey(
"cn-hangzhou", //設定執行個體所在地區
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
request := ecs.CreateRunCommandRequest()
request.Scheme = "https"
request.Type = "RunBatScript"
//建立應用一致性快照的命令,具體資訊,請參見CommandContent內容說明。
request.CommandContent = "acs-plugin-manager --exec --plugin app-snapshot-plugin-win --params=-RamRoleName=\"AppSnapshotRoleName\",-EnableWriters=true,-Description=\"AppSnapshot\",-ExcludeDiskId=\"\",-Name=\"APPSnapshot-1\""
request.InstanceId = &[]string{"i-bp11vqwgh574****"} //設定執行個體ID
request.Timeout = "1800"
response, err := client.RunCommand(request)
if err != nil {
fmt.Print(err.Error())
}
fmt.Printf("response is %#v\n", response)
}
CommandContent參數中內容說明:
acs-plugin-manager --exec --plugin app-snapshot-plugin-win
:表示執行雲助手外掛程式app-snapshot-plugin-win
。--params=
表示外掛程式的配置參數,具體參數說明,如下表所示。參數
類型
是否必傳
描述
ExcludeDiskId
String
否
ECS執行個體中不需要建立快照的雲端硬碟。
Name
String
是
快照一致性組名稱。
Description
String
否
快照一致性組描述資訊。
RamRoleName
String
是
ECS執行個體綁定的RAM角色,取值請參見步驟一:為ECS執行個體配置RAM角色。
EnableWriters
Boolen
否
是否設定應用一致性快照。取值如下:
true:建立應用一致性快照
false:建立檔案系統一致性快照
預設值為true。
調用結果樣本如下所示,返回參數說明,請參見RunCommand。
步驟三:調用DescribeInvocationResults查看快照建立結果
通過調用介面DescribeInvocationResults查看是否執行成功。
以下為Go SDK樣本:
package main
import (
"fmt"
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
)
func main() {
// 請確保代碼運行環境設定了環境變數ALIBABA_CLOUD_ACCESS_KEY_ID和ALIBABA_CLOUD_ACCESS_KEY_SECRET。
// 工程代碼泄露可能會導致AccessKey泄露,並威脅帳號下所有資源的安全性。以下程式碼範例使用環境變數擷取AccessKey的方式進行調用,建議使用更安全的STS方式。
client, err := ecs.NewClientWithAccessKey(
"cn-hangzhou", //設定執行個體所在地區
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
//通過DescribeInvocationResults查詢結果
request := ecs.CreateDescribeInvocationResultsRequest()
request.Scheme = "https"
request.InvokeId = "t-hz01qsegaxi****" //命令執行ID,可在上一步驟的執行結果中查看。
request.InstanceId = "i-bp17r83nppqf141v****" //執行個體ID
request.CommandId = "c-hz01qsegaxd****" //命令ID,可在上一步驟的執行結果中查看。
response, err := client.DescribeInvocationResults(request)
if err != nil {
fmt.Print(err.Error())
}
fmt.Printf("response is %#v\n", response)
}
調用結果樣本如下,返回參數說明,請參見DescribeInvocationResults。
ExitCode返回錯誤碼資訊,取值為
0
表示執行成功;如果取值不為0
,請根據錯誤碼資訊排查問題。更多資訊,請參見錯誤碼資訊。Output為命令執行後的輸出資訊,內容通過Base64編碼。
如果執行成功,Output內容經過Base64解碼後會包含建立的快照一致性組ID,如下所示。
[snapshotgroup="ssg-bp170v57ca9j01jb****"][message="Finish whole Processes of Snapshot successfully"]
錯誤碼資訊
錯誤碼(ExitCode) | 說明 |
0 | 表示建立成功。 |
1 | 條件檢查錯誤。可能錯誤如下:
|
2 |
|
3 | 可能錯誤如下:
|
4 | 建立快照一致性組失敗。 |
5 | 快照一致性組狀態錯誤。 |
6 | 建立快照一致性組逾時。 |
7 | 快照一致性組內單個雲端硬碟快照的狀態不符合預期。 |
8 | 為快照設定標籤失敗。 |
9 | 執行postscript.sh指令碼失敗。 |
10 | 執行postscript.sh指令碼失敗。 |
11 | 暫停IO失敗。 |
12 | 恢複IO失敗。 |
13 | ECS執行個體沒有RAM角色授權。 |
14 | 快照個數超過限制。 |
15 | 快照狀態錯誤。 |
16 | 在沒有啟動快照及時可用功能的情況下,前一個快照正在建立中。 |
255 | 未知失敗。 |
相關文檔
您可以為MySQL資料庫或SQL Server資料庫建立應用一致性快照,請參見為MySQL建立應用一致性快照最佳實務(Linux)和為SQL Server建立應用一致性快照最佳實務(Windows)。