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