全部產品
Search
文件中心

Elastic Compute Service:建立應用一致性快照

更新時間:Oct 25, 2024

如果您對資料一致性有嚴格要求,可以在建立一致性快照組時開啟應用一致性快照功能,應用一致性快照會確保應用程式內部的資料一致並將其包含在快照中。本文介紹如何通過ECS控制台或Go SDK建立Linux和Windows的應用一致性快照。

背景資訊

如果您在建立一致性快照組時開啟應用一致性快照功能,系統將根據實際情況為您建立應用一致性快照或檔案系統一致性快照。

快照類型

說明

應用情境

應用一致性快照

  • 在建立應用一致性快照時,會暫時暫停應用程式的寫操作,確保寫操作結果同步到雲端硬碟中。不僅確儲存儲在雲端硬碟上的資料是一致的,而且應用程式內部(如資料庫)的資料也是一致的。

  • 應用一致性快照通過標籤APPConsistent:True標識。

  • 根據作業系統類型,實現方式如下:

    • Linux:通過執行自訂Shell指令碼(需要您根據應用自行編寫指令碼)實現。應用一致性的效果,由您自己編寫的指令碼負責保證。

    • Windows:通過Windows內建的相關功能實現,例如磁碟區陰影複製服務VSS(Volume Shadow Copy Service)。

對資料一致性有嚴格要求的應用,特別是資料庫和關鍵業務系統,確保在災難恢複時能夠立即恢複到一個邏輯上正確的狀態。

檔案系統一致性快照

  • 在建立應用一致性快照時,如果未設定指令碼或指令碼設定錯誤,最終建立的快照為檔案系統一致性快照。檔案系統一致性快照著重於確保檔案系統資料的一致性,確保在快照建立時刻檔案系統處於一致的狀態。

  • 檔案系統一致性快照通過標籤FsConsistent:True標識。

  • 根據作業系統類型,實現方式如下:

    • Linux:如果無對應的應用指令碼,預設建立檔案系統一致性快照。

    • Windows:如果沒有包含Writer,預設建立檔案系統一致性快照。

適用於需要確保檔案系統整體一致性的情境,比如檔案伺服器、文件管理系統等,特別適合那些關注檔案階層完整性的備份需求。

使用限制

  • 目前僅ESSD類型的雲端硬碟支援建立應用一致性快照,且雲端硬碟未開啟多重掛載功能

  • 不支援跨執行個體建立應用一致性快照,僅支援為單台ECS執行個體的雲端硬碟建立應用一致性快照。

前提條件

  • 確保ECS執行個體的作業系統在以下範圍內:

    • Windows:Windows Server2012 R2及以上作業系統。

    • Linux:CentOS 7.6及以上版本、Ubuntu 18.04及以上版本或Alibaba Cloud Linux 2。

  • ECS執行個體已安裝雲助手Agent。具體操作,請參見安裝雲助手Agent

  • 如果您需要通過Go SDK建立應用一致性快照,需確保:

操作步驟

通過控制台建立

步驟一:為ECS執行個體配置RAM角色

  1. 登入RAM控制台

  2. 建立應用一致性快照相關的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執行個體建立應用一致性快照。

  1. 根據ECS執行個體上的應用,準備對應的指令碼,並提前上傳到ECS執行個體。

    指令碼

    說明

    上傳路徑

    指令碼類型

    指令碼許可權

    指令碼內容

    prescript.sh

    用於在執行可能影響應用程式的操作之前,暫停應用程式的所有寫操作,確保當前的資料狀態不會因操作過程中新產生的資料而不一致。

    /tmp/prescript.sh

    Shell

    僅root使用者具有讀、寫和執行許可權

    需根據實際業務制定,例如為MySQL建立應用一致性快照最佳實務(Linux)

    postscript.sh

    一旦完成了可能影響應用的操作(如備份完成),postscript.sh指令碼會被用於恢複應用程式到正常工作狀態,允許寫操作繼續進行。

    /tmp/postscript.sh

    如何將檔案上傳至ECS執行個體,請參見使用Workbench上傳或下載檔案

    說明

    如果指令碼設定錯誤(例如許可權、上傳路徑或指令碼名稱設定錯誤等),最終建立的快照為檔案系統一致性快照。

  2. 進入ECS執行個體列表頁面。

    1. 登入ECS管理主控台

    2. 在左側導覽列,選擇執行個體與鏡像 > 執行個體

    3. 在頂部功能表列處,選擇目標ECS執行個體所在地區。image.png

  3. 找到目標執行個體,在操作列選擇更多 > 雲端硬碟與鏡像 > 建立快照一致性組

  4. 建立快照一致性組對話方塊中,設定快照一致性組參數。

    1. 選擇需要建立快照一致性組的雲端硬碟並設定其他快照參數。

    2. 設定應用一致性快照。

      • 如果選中啟用應用一致性快照啟用檔案系統IO暫停與恢複,並正確設定指令碼,則建立應用一致性快照。

      • 如果選中啟用應用一致性快照啟用檔案系統IO暫停與恢複,但未設定指令碼或未正確設定指令碼,則建立檔案系統一致性快照。

      說明

      如果執行個體未安裝雲助手,選中啟用應用一致性快照後,ECS執行個體將自動安裝雲助手外掛程式。

  5. 單擊確定

    建立後會返回雲助手命令ID和命令執行ID,您可以根據命令執行ID查看建立結果。命令執行id

Windows執行個體

在Windows執行個體中,主要是通過Windows作業系統的磁碟區陰影複製服務VSS實現應用一致性。本節介紹如何為Windows執行個體開啟應用一致性快照。

  1. 進入ECS執行個體列表頁面。

    1. 登入ECS管理主控台

    2. 在左側導覽列,選擇執行個體與鏡像 > 執行個體

    3. 在頂部功能表列處,選擇目標ECS執行個體所在地區。image.png

  2. 找到目標執行個體,在操作列中選擇更多 > 雲端硬碟與鏡像 > 建立快照一致性組

  3. 建立快照一致性組對話方塊中,設定快照一致性組參數。

    1. 選擇需要建立快照一致性組的雲端硬碟並設定其他快照參數。

    2. 設定應用一致性快照。

      • 如果同時選中啟用應用一致性快照是否預設包含Writer,則建立應用一致性快照。

      • 如果只選中啟用應用一致性快照,則建立檔案系統一致性快照。

      說明

      選中啟用應用一致性快照後,ECS執行個體將自動安裝雲助手外掛程式。

  4. 單擊確定

    建立後會返回雲助手命令ID和命令執行ID,您可以根據命令執行ID查看建立結果。命令執行id

步驟三:檢查快照建立結果

建立應用一致性快照後,您可以在雲助手頁面查看是否建立成功,並在快照頁面查看建立的快照一致性組和快照資訊。

  1. 雲助手頁面,查看應用一致性快照是否成功建立。

    1. 登入ECS管理主控台

    2. 在左側導覽列,選擇營運與監控 > 雲助手

    3. 單擊命令執行結果頁簽。

    4. 單擊目標命令執行ID,查看執行結果。

      image.png

      如上圖所示,ExitCode傳回值為0,表示雲助手上建立應用一致性快照執行成功,此時回顯資訊中會顯示快照一致性組ID。

      說明

      如果ExitCode傳回值不為0,請根據ExitCode錯誤碼資訊排查相關問題。更多資訊,請參見錯誤碼資訊

  2. 快照頁面查看建立的快照一致性組和快照資訊。

    1. 在左側導覽列,選擇儲存與快照 > 快照

    2. 單擊快照一致性組頁簽,找到已建立的快照一致性組,單擊快照一致性組ID查看快照詳情。

    3. 快照資訊地區,根據快照的標籤資訊,查看建立的快照是應用一致性快照還是檔案系統一致性快照。

      • 如果顯示APPConsistent:True標籤,表示建立的是應用一致性快照

        image.png

      • 如果顯示FsConsistent: True標籤,表示建立的是檔案系統一致性快照

        image.png

通過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秒。

調用結果樣本如下所示,返回參數說明,請參見RunCommandlinux

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。

調用結果樣本如下所示,返回參數說明,請參見RunCommandwin查詢結果

步驟三:調用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

條件檢查錯誤。可能錯誤如下:

  • 雲端硬碟類型不支援。

  • 快照名稱不符合要求。

  • 網路不通。

  • ECS執行個體沒有RAM角色授權。

  • 作業系統版本不支援。

2

--params後設定的參數類型或個數錯誤。

3

可能錯誤如下:

  • ECS執行個體沒有掛載ESSD雲端硬碟。

  • ECS執行個體的RAM角色未設定快照介面的存取權限。

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)