ビジネスにデータの一貫性に関する厳しい要件がある場合は、スナップショット一貫性のあるグループを作成するときに、アプリケーション一貫性のあるスナップショット機能を有効にできます。 この機能により、アプリケーション内のデータが一貫してスナップショットに含まれるようになります。 このトピックでは、Elastic Compute Service (ECS) コンソールまたはAlibaba Cloud SDK for Goを使用して、LinuxおよびWindowsインスタンス用のアプリケーション一貫性のあるスナップショットを作成する方法について説明します。
背景情報
スナップショット一貫性グループを作成するときにアプリケーション一貫性のあるスナップショット機能を有効にすると、システムは実際の状況に基づいてアプリケーション一貫性またはファイルシステム一貫性のあるスナップショットを作成します。 次の表に、2種類のスナップショットを示します。
スナップショットタイプ | 説明 | シナリオ |
Application-consistent snapshot |
| データの一貫性を厳密に要求するアプリケーション、特にデータベースや重要なビジネスシステムに適しています。 アプリケーション一貫性のあるスナップショットを使用して、ディザスタリカバリの最も早い機会にアプリケーションを復元できます。 |
ファイルシステムの一貫性のあるスナップショット |
| ファイルサーバーやドキュメント管理システムなど、ファイルシステム全体の一貫性を確保するシナリオに適しています。 これにより、ファイル階層の整合性を確保するためのバックアップ要件を満たすことができます。 |
制限事項
アプリケーション一貫性のあるスナップショットは、マルチアタッチ機能が無効になっているエンタープライズSSD (ESSD) でのみサポートされます。
同じECSインスタンスにのみ接続されているクラウドディスクに対して、アプリケーションに一貫性のあるスナップショットを作成できます。
前提条件
ECSインスタンスが作成され、次のいずれかのオペレーティングシステムバージョンが実行されます。
Windows: Windows Server 2012 R2以降。
Linux: CentOS 7.6以降、Ubuntu 18.04以降、またはAlibaba Cloud Linux 2。
Cloud Assistant AgentがECSインスタンスにインストールされています。 詳細については、「Cloud Assistant Agentのインストール」をご参照ください。
Alibaba Cloud SDK for Goを使用してアプリケーションの一貫性のあるスナップショットを作成する場合は、次の項目に注意してください。
Goランタイム環境がダウンロードされ、インストールされます。 詳細については、「ダウンロードとインストール」をご参照ください。
Alibaba Cloud SDK for Goがダウンロードされ、インストールされます。 詳細については、「Alibaba Cloud SDK V1.0 For Goの使用を開始する」をご参照ください。
手順
ECSコンソールでのアプリケーション一貫性のあるスナップショットの作成
手順1: RAMロールを設定し、ECSインスタンスにアタッチする
RAMロールを作成し、RAMロールにアプリケーション整合性のあるスナップショットを作成する権限を付与してから、RAMロールをECSインスタンスにアタッチします。 詳細については、「インスタンスRAMロールを使用して他のAlibaba CloudサービスのリソースへのECSアクセスを許可する」トピックの「インスタンスRAMロールを作成し、インスタンスRAMロールをECSインスタンスにアタッチする」セクションをご参照ください。 次のパラメータに注意してください。
RAMロール名: 例: AppSnapshotRoleName。
Selected Trusted Entity: システムはこのパラメーターをAlibaba Cloud Serviceに設定します。
カスタムポリシー: 例: AppSnapshotPolicyが使用されます。 次のサンプルコードは、ポリシーの内容の例を示します。
{ "Version": "1", "Statement": [ { "Effect": "Allow", "Action": [ "ecs:DescribeSnapshot*", "ecs:CreateSnapshot*", "ecs:TagResources", "ecs:DescribeDisks" ], "Resource": [ "*" ], "Condition": {} } ] }
このポリシーは、スナップショット情報の照会、スナップショットの作成、タグの指定、およびディスク情報の照会に対する権限を付与します。
手順2: インスタンスのアプリケーション一貫性のあるスナップショットの作成
Linuxインスタンス
Linuxインスタンスでは、アプリケーションの一貫性を確保するために、インスタンスにデプロイされたアプリケーションに基づいて、prescript.shやpostscript.shなどのカスタムシェルスクリプトをコンパイルします。 次のセクションでは、Linuxインスタンスのアプリケーション一貫性のあるスナップショットを作成する方法について説明します。
ECSインスタンスのアプリケーションに基づいてスクリプトを準備し、事前にスクリプトをECSインスタンスにアップロードします。
スクリプト
説明
パス
データ型
権限
コンテンツ
prescript.sh
アプリケーションに影響を与える可能性のある操作を実行する前に、アプリケーションへのすべての書き込み操作を一時停止するために使用します。 これにより、運用中に新しいデータが生成されることによるデータの不整合を防ぎます。
/tmp/prescript.sh
シェル
スクリプトに対する読み取り、書き込み、および実行権限があるのは、rootユーザーのみです。
スクリプトの内容は、ビジネス要件に基づいてコンパイルされます。 詳細については、「MySQLがデプロイされているLinuxインスタンスのアプリケーション一貫性のあるスナップショットを作成するためのベストプラクティス」トピックの「prescript.shおよびpostscript.shスクリプトファイルの作成」をご参照ください。
postscript.sh
データのバックアップなど、アプリケーションに影響を与える可能性のある操作が完了した後、postscript.shスクリプトを実行してアプリケーションを復元し、書き込み操作を再開できます。
/tmp/postscript.sh
ECSインスタンスにファイルをアップロードする方法については、「ワークベンチを使用してインスタンスにファイルをアップロードし、インスタンスからファイルをダウンロードする方法」をご参照ください。
説明権限、ストレージパス、スクリプト名などのスクリプト設定が無効な場合は、アプリケーションの一貫性のあるスナップショットではなく、ファイルシステムの一貫性のあるスナップショットが作成されます。
ECSコンソールの [インスタンス] ページに移動します。
左側のナビゲーションウィンドウで、 .
上部のナビゲーションバーで、ECSインスタンスが存在するリージョンを選択します。
スナップショットを作成するインスタンスを見つけ、[操作] 列の
を選択します。[スナップショット一貫性グループの作成] ダイアログボックスで、スナップショット一貫性グループのパラメーターを設定します。
スナップショット一貫性グループを作成するクラウドディスクを選択し、他のスナップショットパラメーターを設定します。
[Application-consistent Snapshot] セクションでパラメーターを設定します。
[アプリケーションの一貫性のあるスナップショットの有効化] および [ファイルシステムのI/O中断と再開の有効化] を選択し、スクリプトを正しく設定すると、アプリケーションの一貫性のあるスナップショットが作成されます。
[アプリケーションの一貫性のあるスナップショットの有効化] および [ファイルシステムのI/O中断と再開の有効化] を選択したが、スクリプトを設定しないか、スクリプトを誤って設定すると、ファイルシステムの一貫性のあるスナップショットが作成されます。
説明インスタンスにCloud Assistantをインストールせず、[アプリケーションの一貫性のあるスナップショットの有効化] を選択した場合、Cloud Assistantプラグインはインスタンスに自動的にインストールされます。
[OK] をクリックします。
スナップショット整合性グループを作成すると、次の図に示すように、Cloud AssistantコマンドIDとタスクID (InvokeId) を示すメッセージが表示されます。 タスクIDに基づいて、アプリケーションに整合性のあるスナップショットが作成されているかどうかを確認できます。
Windowsインスタンス
Windowsインスタンスは、アプリケーションの一貫性を確保するためにVSSを使用します。 このセクションでは、Windowsインスタンスのアプリケーション一貫性のあるスナップショット機能を有効にする方法について説明します。
ECSコンソールの [インスタンス] ページに移動します。
左側のナビゲーションウィンドウで、 .
上部のナビゲーションバーで、ECSインスタンスが存在するリージョンを選択します。
アプリケーションの一貫性のあるスナップショット機能を有効にするインスタンスを見つけ、[操作] 列の
を選択します。[スナップショット一貫性グループの作成] ダイアログボックスで、スナップショット一貫性グループのパラメーターを設定します。
スナップショット一貫性グループを作成するクラウドディスクを選択し、他のスナップショットパラメーターを設定します。
[Application-consistent Snapshot] セクションでパラメーターを設定します。
[アプリケーションの一貫性のあるスナップショットの有効化] および [デフォルトでライターを含む] を選択した場合、アプリケーションの一貫性のあるスナップショットが作成されます。
[アプリケーションの一貫性のあるスナップショットの有効化] のみを選択すると、ファイルシステムの一貫性のあるスナップショットが作成されます。
説明インスタンスにCloud Assistantをインストールせず、[アプリケーションの一貫性のあるスナップショットの有効化] を選択した場合、Cloud Assistantプラグインはインスタンスに自動的にインストールされます。
[OK] をクリックします。
スナップショット整合性グループが作成されると、次の図に示すように、Cloud AssistantコマンドIDとタスクIDを示すメッセージが表示されます。 タスクIDに基づいて、アプリケーションに整合性のあるスナップショットが作成されているかどうかを確認できます。
手順3: アプリケーションの一貫性のあるスナップショットが作成されているかどうかの確認
スナップショット一貫性グループを作成したら、ECS Cloud Assistantページに移動し、アプリケーション一貫性のあるスナップショットが作成されているかどうかを確認します。 次に、[スナップショット] ページに移動し、スナップショット整合性グループとそのグループに属するアプリケーション整合性スナップショットに関する情報を表示します。
ECSクラウドアシスタントページで、アプリケーション一貫性のあるスナップショットが作成されているか確認します。
左側のナビゲーションウィンドウで、 .
コマンド実行結果タブをクリックします。
前の手順で取得したタスクIDを [タスクID] 列で見つけ、タスクIDをクリックして実行結果を表示します。
ExitCodeの戻り値は、前の図に示すように
0
されます。 これは、アプリケーションの一貫性のあるスナップショットがCloud Assistantで期待どおりに作成されることを示します。 この場合、スナップショット一致グループのIDがコマンド出力に表示されます。説明ExitCodeの戻り値が
0
でない場合はエラーとなります。 ExitCode列の値に基づいて問題をトラブルシューティングします。 詳細については、このトピックのエラーコードセクションを参照してください。
スナップショットページで、作成したスナップショット整合性グループとそのグループに属するスナップショットに関する情報を表示します。
左側のナビゲーションウィンドウで、 .
[スナップショット一貫性のあるグループ] タブをクリックします。 作成したスナップショット整合性グループを見つけ、スナップショット整合性グループのIDをクリックしてスナップショットの詳細を表示します。
スナップショット情報セクションでは、タグに基づいて、スナップショットがアプリケーション一貫性のあるスナップショットであるか、ファイルシステム一貫性のあるスナップショットであるかを確認します。
APPConistent: True
タグが表示された場合、アプリケーションに対応したスナップショットが作成されます。FsConsistent:True
タグが表示された場合、ファイルシステムの一貫性のあるスナップショットが作成されます。
Alibaba Cloud SDK for Goを使用したアプリケーションの一貫性のあるスナップショットの作成
手順1: RAMロールの設定とECSインスタンスへのアタッチ
AttachInstanceRamRoleを呼び出して、RAMロールをECSインスタンスにアタッチできます。 この例では、AppSnapshotRoleNameという名前のRAMロールが使用されます。
Alibaba Cloud SDK for Goのサンプルコード:
package main
import (
"fmt"
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
)
func main() {
// Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variables are configured in the code runtime.
// If the project code is leaked, the AccessKey pair may be leaked and the security of all resources in your account is compromised. The following sample code provides an example on how to use environment variables to obtain an AccessKey pair and use the AccessKey pair to call API operations. We recommend that you use Security Token Service (STS) tokens, which provide higher security.
client, err := ecs.NewClientWithAccessKey(
"cn-hangzhou",
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
// Call the AttachInstanceRamRole operation to attach the specified RAM role to the instance.
request := ecs.CreateAttachInstanceRamRoleRequest()
request.Scheme = "https"
request.RamRoleName = "AppSnapshotRoleName" // Specify the name of the RAM role.
request.InstanceIds = "[\"i-bp17r83nppqf141v****\"]" // Specify the ID of the instance.
response, err := client.AttachInstanceRamRole(request)
if err != nil {
fmt.Print(err.Error())
}
fmt.Println(response.String())
}
次のような応答が返されます。 レスポンスのパラメーターの詳細については、「AttachInstanceRamRole」をご参照ください。
手順2: RunCommand操作を呼び出して、インスタンスのアプリケーション一貫性のあるスナップショットを作成します
Linuxインスタンス
RunCommand操作を呼び出して、Cloud Assistantを使用して、1つ以上のLinuxインスタンスのアプリケーション整合性のあるスナップショットを作成します。
Alibaba Cloud SDK for Goのサンプルコード:
package main
import (
"fmt"
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
)
func main() {
// Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variables are configured in the code runtime.
// If the project code is leaked, the AccessKey pair may be leaked and the security of all resources in your account is compromised. The following sample code shows how to use environment variables to obtain an AccessKey pair and use the AccessKey pair to call API operations. We recommend that you use STS tokens, which provide higher security.
client, err := ecs.NewClientWithAccessKey(
"cn-hangzhou", // Specify the region in which the instance resides.
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
// Call the RunCommand operation to create application-consistent snapshots for the instance.
request := ecs.CreateRunCommandRequest()
request.Scheme = "https"
request.Type = "RunShellScript"
// Specify the command content used to create application-consistent snapshots. For more information, see the following description of the CommandContent parameter.
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****"} // Specify the ID of the instance.
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
Cloud Assistantプラグインを実行します。-- params=
: プラグインのパラメーター。 下表に、各パラメーターを説明します。パラメーター
データ型
必須
説明
ExcludeDiskId
String
任意
スナップショットから除外するディスク。
名前
String
必須
スナップショット整合性グループの名前。
説明
String
任意
snapshot-consistentグループの説明。
RamRoleName
String
必須
インスタンスにアタッチされたRAMロール。 RAMロールの名前については、このトピックの「手順1: RAMロールを設定してECSインスタンスにアタッチする」をご参照ください。
PreScriptPath
String
任意
prescript.shスクリプトが格納されているパス。 例: /tmp/prescript.sh. prescript.shスクリプトは、次の要件を満たす必要があります。
rootユーザーのみが、所有者としてのスクリプトに対する読み取り、書き込み、および実行権限 (chmod 700) を付与されます。
ビジネス要件に基づいてカスタムスクリプトコンテンツをコンパイルします。
重要このパラメーターは、Linuxインスタンスのアプリケーション一貫性のあるスナップショットを作成する場合に必要です。 スクリプトに権限、パス、ファイル名などの無効な設定が含まれている場合、アプリケーションの一貫性のあるスナップショットではなく、ファイルシステムの一貫性のあるスナップショットが作成されます。
PostScriptPath
String
任意
postscript.shスクリプトが格納されているパス。 例: /tmp/postscript.sh。 postscript.shスクリプトは、次の要件を満たす必要があります。
rootユーザーのみが、所有者としてのスクリプトに対する読み取り、書き込み、および実行権限 (chmod 700) を付与されます。
ビジネス要件に基づいてカスタムスクリプトをコンパイルします。
重要このパラメーターは、Linuxインスタンスのアプリケーション一貫性のあるスナップショットを作成する場合に必要です。 スクリプトに権限、パス、ファイル名などの無効な設定が含まれている場合、アプリケーションの一貫性のあるスナップショットではなく、ファイルシステムの一貫性のあるスナップショットが作成されます。
EnableFsFreeze
ブール値
継続しない
スナップショットを作成する前に、Linux FsFreezeを有効にしてファイルシステムを読み取り専用状態にするかどうかを指定します。
デフォルト値は True です。
TimeoutInSeconds
Integer
継続しない
I/O操作のタイムアウト期間。
デフォルト値:30。 単位は秒です。
ScriptTimeoutInSeconds
Integer
継続しない
スクリプト実行のタイムアウト時間。
デフォルト値: 1800 単位は秒です。
次のような応答が返されます。 レスポンス内のパラメーターについては、「RunCommand」をご参照ください。
Windowsインスタンス
RunCommand操作を呼び出して、Cloud Assistantを使用して、1つ以上のWindowsインスタンスのアプリケーション一貫性のあるスナップショットを作成します。
Alibaba Cloud SDK for Goのサンプルコード:
package main
import (
"fmt"
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
)
func main() {
// Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variables are configured in the code runtime.
// If the project code is leaked, the AccessKey pair may be leaked and the security of all resources in your account is compromised. The following sample code provides an example on how to use environment variables to obtain an AccessKey pair and use the AccessKey pair to call API operations. We recommend that you use STS tokens, which provide higher security.
client, err := ecs.NewClientWithAccessKey(
"cn-hangzhou", // Specify the region in which the instance resides.
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
request := ecs.CreateRunCommandRequest()
request.Scheme = "https"
request.Type = "RunBatScript"
// Specify the command content used to create application-consistent snapshots. For more information, see the following description of the CommandContent parameter.
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****"} // Specify the ID of the instance.
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
Cloud Assistantプラグインを実行します。-- params=
: プラグインのパラメーター。 下表に、各パラメーターを説明します。パラメーター
データ型
必須
説明
ExcludeDiskId
String
任意
スナップショットから除外するディスク。
名前
String
必須
スナップショット整合性グループの名前。
説明
String
任意
snapshot-consistentグループの説明。
RamRoleName
String
必須
インスタンスにアタッチされたRAMロール。 RAMロールの名前については、このトピックの「手順1: RAMロールを設定してECSインスタンスにアタッチする」をご参照ください。
EnableWriters
ブーレン
継続しない
アプリケーション一貫性のあるスナップショットを作成するかどうかを指定します。 有効な値:
true: アプリケーション一貫性のあるスナップショットを作成します。
false: ファイルシステムの一貫性のあるスナップショットを作成します。
デフォルト値:true
次のような応答が返されます。 レスポンス内のパラメーターについては、「RunCommand」をご参照ください。
手順3: DescribeInvocationResults操作を呼び出して、スナップショットが作成されているかどうかを確認します
DescribeInvocationResults操作を呼び出して、Cloud Assistantコマンドが期待どおりに実行されているかどうかを確認します。
Alibaba Cloud SDK for Goのサンプルコード:
package main
import (
"fmt"
"os"
"github.com/aliyun/alibaba-cloud-sdk-go/services/ecs"
)
func main() {
// Make sure that the ALIBABA_CLOUD_ACCESS_KEY_ID and ALIBABA_CLOUD_ACCESS_KEY_SECRET environment variables are configured in the code runtime.
// If the project code is leaked, the AccessKey pair may be leaked and the security of all resources in your account is compromised. The following sample code provides an example on how to use environment variables to obtain an AccessKey pair and use the AccessKey pair to call API operations. We recommend that you use STS tokens, which provide higher security.
client, err := ecs.NewClientWithAccessKey(
"cn-hangzhou", // Specify the region ID of the instance.
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_ID"),
os.Getenv("ALIBABA_CLOUD_ACCESS_KEY_SECRET"))
// Call the DescribeInvocationResults operation to check whether snapshots are created.
request := ecs.CreateDescribeInvocationResultsRequest()
request.Scheme = "https"
request.InvokeId = "t-hz01qsegaxi****" // The task ID of the command. You can obtain the task ID in the response in the previous step.
request.InstanceId = "i-bp17r83nppqf141v****" // The instance ID.
request.CommandId = "c-hz01qsegaxd****" // The command ID. You can obtain the command ID in the response in the previous step.
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-encodedされるコマンド出力を示します。
コマンドが正常に実行された場合、次の例に示すように、Outputの値がBase64-encodedされ、作成されたスナップショット整合性グループのIDが含まれます。
[snapshotgroup="ssg-bp170v57ca9j01jb****"][message="Finish whole Processes of Snapshot successfully"]
エラーコード
エラーコード (ExitCode) | 説明 |
0 | アプリケーションの一貫性のあるスナップショットが期待どおりに作成されました。 |
1 | 1つ以上の条件が満たされない。 次のいずれかのエラーが発生する可能性があります。
|
2 |
|
3 | 次のいずれかのエラーが発生する可能性があります。
|
4 | スナップショット整合性グループは作成できません。 |
5 | snapshot-consistentグループが期待した状態ではありません。 |
6 | スナップショット整合性グループの作成要求がタイムアウトしました。 |
7 | スナップショット整合性グループ内のディスクスナップショットが期待された状態ではありません。 |
8 | スナップショットにタグを追加することはできません。 |
9 | postscript.shスクリプトの実行に失敗しました。 |
10 | postscript.shスクリプトの実行に失敗しました。 |
11 | ファイルシステムのI/Oを中断できません。 |
12 | ファイルシステムのI/Oを再開できません。 |
13 | インスタンスにRAMロールがアタッチされていません。 |
14 | スナップショットの数が上限を超えました。 |
15 | スナップショットが期待された状態ではありません。 |
16 | 以前のスナップショットが作成中であり、インスタントアクセス機能が無効になっているため、スナップショットを作成できません。 |
255 | 不明なエラーが発生しました。 |
関連ドキュメント
MySQLまたはSQL Serverデータベースのアプリケーション一貫性のあるスナップショットを作成できます。 詳細については、「MySQLがデプロイされているLinuxインスタンスのアプリケーション一貫性のあるスナップショットを作成するためのベストプラクティス」または「SQL ServerがデプロイされているWindowsインスタンスのアプリケーション一貫性のあるスナップショットを作成するためのベストプラクティス」をご参照ください。