應用一致性快照是一種確保在建立快照時應用程式的資料處於一致狀態的技術,它不僅捕獲了儲存在雲端硬碟上的未經處理資料,還確保了任何進行中的事務都已完成,記憶體中的資料被寫入磁碟,並且應用程式的狀態是一致的。當您使用應用一致性快照進行復原時,可以直接恢複到一個一致的應用狀態,避免了複雜的日誌復原過程,確保快速穩定的應用啟動。本文介紹如何通過ECS控制台或Go SDK建立Linux和Windows的應用一致性快照。
前提條件
ECS執行個體的作業系統在以下範圍內:
Windows:Windows Server 2022/2019/2016/2012 R2。
Linux:CentOS 7.6及以上版本、Ubuntu 18.04及以上版本和Alibaba Cloud Linux 2/3。
ECS執行個體中的雲端硬碟必須是ESSD PL0/1/2/3或者ESSD AutoPL類型,且檔案系統為EXT3、EXT4、XFS或NTFS。同時,不支援網路檔案系統和共用檔案系統。
ECS執行個體已安裝雲助手Agent。具體操作,請參見安裝雲助手Agent。
說明2017年12月01日之後使用公用鏡像建立的ECS執行個體,已預設預裝雲助手Agent。
已經安裝Go運行環境。
具體操作,請參見下載和安裝Golang。
已經下載和安裝阿里雲Go SDK。
具體操作,請參見開始使用。
背景資訊
預設情況下,您建立的快照為崩潰一致性快照。如果您在建立快照時開啟應用一致性快照功能,系統將根據實際情況為您建立應用一致性快照或者檔案系統一致性快照。
類型 | 說明 | 實現方式 |
應用一致性快照 | 應用一致性快照在快照建立時刻備份記憶體資料及進行中中的資料庫事務,保證應用系統資料和資料庫事務的一致性。通過應用一致性快照,沒有資料的損壞及丟失,避免資料庫啟動時日誌復原,確保應用處於一致性的啟動狀態。 應用一致性快照以標籤 | 根據作業系統類型,實現方式如下:
|
檔案系統一致性快照 | 如果開啟應用一致性功能,但不滿足相關條件,系統將會為您建立檔案系統一致性快照。 檔案系統一致性確保在快照建立時刻同步檔案系統記憶體和磁碟資訊,凍結檔案系統寫操作,使得檔案系統處於一致性的狀態。通過檔案系統一致性快照,可以避免作業系統在重啟後進行chkdsk或fsck等磁碟檢查修複操作。 檔案系統一致性快照以標籤 | 根據作業系統類型,實現方式如下:
|
操作步驟
通過控制台建立
步驟一:為ECS執行個體配置RAM角色
使用阿里雲帳號登入RAM控制台。
建立應用一致性快照相關的RAM角色。具體操作,請參見建立可信實體為阿里雲服務的RAM角色。
樣本為建立一個AppSnapshotRoleName的RAM角色。
建立應用一致性快照相關權限原則。具體操作,請參見建立自訂權限原則。
建立一個AppSnapshotPolicy權限原則,具有查詢快照相關資訊、建立快照、設定標籤和查詢雲端硬碟資訊等相關許可權。您可以直接使用以下策略內容。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:DescribeSnapshot*", "ecs:CreateSnapshot*", "ecs:TagResources", "ecs:DescribeDisks" ], "Resource": [ "*" ], "Condition": {} } ] }
為RAM角色(AppSnapshotRoleName)設定自訂許可權(AppSnapshotPolicy)。具體操作,請參見為RAM角色授權。
為目標執行個體設定RAM角色(AppSnapshotRoleName)。具體操作,請參見通過ECS執行個體RAM角色授權ECS訪問其他雲資源。
步驟二:為執行個體開啟應用一致性快照
Linux執行個體
在Linux執行個體中,您需要根據ECS執行個體上的應用程式定製Shell指令碼(應用凍結指令碼和應用解凍指令碼)實現應用一致性。本節介紹如何為Linux執行個體開啟應用一致性快照。
根據ECS執行個體上的應用,準備對應的應用凍結指令碼和應用解凍指令碼,並上傳到ECS執行個體。
您可以通過FTP或雲助手將應用凍結指令碼和應用解凍指令碼上傳到ECS執行個體。
應用凍結指令碼:使用權限設定為僅root使用者具有讀、寫和執行許可權,儲存路徑為/tmp/prescript.sh。
應用解凍指令碼:使用權限設定為僅root使用者具有讀、寫和執行許可權,儲存路徑為/tmp/postscript.sh。
重要如果指令碼設定錯誤(例如許可權、儲存路徑或檔案名稱設定錯誤等),最終建立的快照為檔案系統一致性快照。
進入ECS執行個體列表頁面。
登入ECS管理主控台。
在左側導覽列,選擇 。
在頂部功能表列處,選擇目標ECS執行個體所在地區。
找到目標執行個體,在操作列中選擇
。在建立快照一致性組對話方塊中,設定快照一致性組參數。
選擇需要建立快照一致性組的雲端硬碟並設定其他快照參數。
設定應用一致性快照。
如果選中啟用應用一致性快照和啟用檔案系統IO凍結及解凍,並正確設定指令碼,則建立應用一致性快照。
如果選中啟用應用一致性快照和啟用檔案系統IO凍結及解凍,但未設定指令碼或未正確設定指令碼,則建立檔案系統一致性快照。
說明選中啟用應用一致性快照後,ECS執行個體將自動安裝雲助手外掛程式。
單擊確定。
建立後會返回雲助手命令ID和命令執行ID,您可以根據命令執行ID查看建立結果。
Windows執行個體
在Windows執行個體中,主要是通過Windows作業系統的磁碟區陰影複製服務實現應用一致性。本節介紹如何為Windows執行個體開啟應用一致性快照。
進入ECS執行個體列表頁面。
登入ECS管理主控台。
在左側導覽列,選擇 。
在頂部功能表列處,選擇目標ECS執行個體所在地區。
找到目標執行個體,在操作列中選擇
。在建立快照一致性組對話方塊中,設定快照一致性組參數。
選擇需要建立快照一致性組的雲端硬碟並設定其他快照參數。
設定應用一致性快照。
如果同時選中啟用應用一致性快照和是否預設包含Writer,則建立應用一致性快照。
如果只選中啟用應用一致性快照,則建立檔案系統一致性快照。
說明選中啟用應用一致性快照後,ECS執行個體將自動安裝雲助手外掛程式。
單擊確定。
建立後會返回雲助手命令ID和命令執行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\",-InstantAccess=true,-EnableFsFreeze=true,-TimeoutInSeconds=30,-PreScriptPath=\"/tmp/prescript.sh\",-PostScriptPath=\"/tmp/postscript.sh\",-InstantAccessRentationDays=1,-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執行個體中不需要建立快照的雲端硬碟。
InstantAccess
Boolean
否
是否開啟快照極速可用功能。取值如下:
true:開啟
false:關閉
說明自2023年10月12日11:00起,快照極速可用能力升級,ESSD PL0/1/2/3及ESSD AutoPL雲端硬碟建立的快照將預設為建立後極速可用,無需額外配置該參數。更多資訊,請參見開啟或關閉快照極速可用功能。
InstantAccessRentationDays
Integer
否
快照極速可用功能保留天數,到期後自動關閉。
取值範圍:1~65536。預設值:1
Name
String
是
快照一致性組名稱。
Description
String
否
快照一致性組描述資訊。
RamRoleName
String
是
ECS執行個體綁定的RAM角色,取值請參見步驟一:為ECS執行個體配置RAM角色。
PreScriptPath
String
否
應用凍結指令碼路徑(/tmp/prescript.sh)。prescript.sh指令碼需要符合以下條件:
在許可權上,僅root作為owner使用者具有讀、寫、執行許可權,即700許可權。
在內容上,指令碼內容需要根據應用自己定製。
說明Linux執行個體建立應用一致性快照時必須設定此參數。如果指令碼設定錯誤(例如許可權、儲存路徑或檔案名稱設定錯誤等),最終建立的快照為檔案系統一致性快照。
PostScriptPath
String
否
應用解凍指令碼路徑(/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\",-InstantAccess=true,-EnableWriters=true,-Description=\"AppSnapshot\",-InstantAccessRentationDays=1,-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執行個體中不需要建立快照的雲端硬碟。
InstantAccess
Boolean
否
是否開啟快照極速可用功能。取值如下:
true:開啟
false:關閉
說明自2023年10月12日11:00起,快照極速可用能力升級,ESSD PL0/1/2/3及ESSD AutoPL雲端硬碟建立的快照將預設為建立後極速可用,無需額外配置該參數。更多資訊,請參見開啟或關閉快照極速可用功能。
InstantAccessRentationDays
Integer
否
快照極速可用功能保留天數,到期後自動關閉。
取值範圍:1~65536。預設值:1
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)。如果建立失敗,您可以根據錯誤碼資訊排查問題。
錯誤碼(ExitCode) | 說明 |
0 | 表示建立成功。 |
1 | 條件檢查錯誤。可能錯誤如下:
|
2 |
|
3 | 可能錯誤如下:
|
4 | 建立快照一致性組失敗。 |
5 | 快照一致性組狀態錯誤。 |
6 | 建立快照一致性組逾時。 |
7 | 快照一致性組內單個雲端硬碟快照的狀態不符合預期。 |
8 | 為快照設定標籤失敗。 |
9 | 執行應用凍結指令碼失敗。 |
10 | 執行應用解凍指令碼失敗。 |
11 | 凍結IO失敗。 |
12 | 解凍IO失敗。 |
13 | ECS執行個體沒有RAM角色授權。 |
14 | 快照個數超過限制。 |
15 | 快照狀態錯誤。 |
16 | 在沒有啟動快照及時可用功能的情況下,前一個快照正在建立中。 |
255 | 未知失敗。 |
相關文檔
您可以為MySQL資料庫或SQL Server資料庫建立應用一致性快照,請參見為MySQL建立應用一致性快照最佳實務(Linux)和為SQL Server建立應用一致性快照最佳實務(Windows)。