このトピックでは、CloudOps Orchestration Service (OOS) を使用して、Tair (Redis OSS-compatible)インスタンスのデータをObject Storage Service (OSS) バケットに定期的にバックアップする方法について説明します。 この方法は、データセキュリティの確保、O&Mの簡素化、コスト削減などの問題を解決するのに役立ちます。
前提条件
Function Computeが有効化されています。 詳細については、「関数の迅速な作成」をご参照ください。
背景情報
Tair (Redis OSS-compatible)は、成長するビジネスデータのストレージに関する要件を満たす高性能メモリデータストレージソリューションを提供します。 データのスケジュールされたバックアップは、データセキュリティにとって重要です。 Tair (Redis OSS-compatible)のスケジュールバックアップ機能は、データベース管理の重要な部分です。 この機能は、ディザスタリカバリ、履歴データクエリ、環境クローンなどのシナリオで使用できます。 バックアップサイクルを指定して、ビジネス要件に基づいてTair (Redis OSS-compatible)インスタンスのデータを自動的にバックアップできます。 詳細については、「自動または手動バックアップ」をご参照ください。 ただし、このバックアップ方法には次の欠点があります。
データセキュリティリスク: インスタンスが削除された後、バックアップデータは完全に保存できず、失われる可能性があります。
複雑なO&M操作: データのダウンロードとアップロードを含むバックアップ操作は、手動で実行する必要があります。 これは時間がかかり、エラーを起こしやすい。
O&Mコストの増加: バックアッププロセスを手動で実行する必要があるため、O&Mコストが増加します。 これは、より多くの時間とリソースを消費し、エラーを起こしやすい。
低効率: バックアッププランを使用して、一度に複数のインスタンスをバックアップしたり、リージョン間のインスタンスを一元的にバックアップしたりすることはできません。 これは非効率的であり、管理は複雑である。
不十分な監視とアラート機能: 効率的な監視とアラートのメカニズムがないため、バックアップタスクのステータスを制御できません。 エラーまたは失敗は、最も早い機会に対処することはできません。
これらの欠点に対処するために、Alibaba Cloudは、Tair (Redis OSS-compatible)インスタンスのデータを効率的かつ安全にOSSにバックアップできるOOSベースのバックアップソリューションを提供しています。 このソリューションには次の利点があります。
データセキュリティの向上: バックアップファイルはOSSに自動的にアップロードされます。 OSSの冗長ストレージメカニズムは、ハードウェア障害時のデータの耐久性と可用性を保証します。 さらに、バックアップしたTair (Redis OSS-compatible)インスタンスが削除された場合でも、バックアップファイルを永続的に保存できます。
完全に自動化されたO&M: 設定が完了すると、手動操作を必要とせずに、指定されたバックアップサイクルに基づいてバックアップファイルがOSSに自動的にアップロードされます。 これにより、O&Mワークロードと操作エラーが大幅に削減されます。
リージョン間の複数のインスタンスの集中管理: スケジュールされたバックアップタスクに、一度に複数のTair (Redis OSS-compatible)インスタンスを指定できます。 さらに、OOSを使用すると、複数のリージョンでバックアップファイルをOSSに保存できます。 異なるリージョンにあるTair (Redis OSS-compatible)インスタンスのデータを同じOSSバケットにバックアップできます。
柔軟で費用効果の高いバックアップポリシー: ビジネス要件に基づいてバックアップ頻度を指定し、OSSのライフサイクルポリシーを使用して期限切れのバックアップファイルを自動的にクリアできます。 これにより、より効率的な方法でコストを管理できます。
モニタリングとアラート: OSSとCloudMonitorを使用して、バックアップステータスをリアルタイムでモニタリングできます。 バックアップタスクが失敗したり、その他の問題が発生した場合は、アラート通知をタイムリーに受信して、データのセキュリティを確保できます。
手順
データバックアップ中に課金される場合があります。 詳細については、「自動または手動バックアップ」および「課金の概要」をご参照ください。
OOS コンソール にログインします。
左側のナビゲーションウィンドウで、
を選択します。[スケジュールされたO&M] ページで、[作成] をクリックします。[スケジュールタスクの設定] セクションで、[スケジュールタスクの種類] パラメーターを設定します。
有効な値: 今すぐ実行、指定された時刻に1回実行、および定期的に実行。 [今すぐ実行] を選択した場合、スケジュールされたO&Mタスクは作成後すぐに実行されます。 [指定時刻に1回実行] を選択した場合、スケジュールされたO&Mタスクは指定時刻に1回だけ実行されます。 [定期的に実行] を選択した場合、スケジュールされたO&Mタスクはスケジュールされた時間に基づいて定期的に実行されます。 たとえば、スケジュールされたO&Mタスクを1時間ごとに実行するように指定できます。
この例では、[Periodically実行] が選択されています。 [選択] をクリックするか、CRON式を使用して実行頻度を指定できます。 [選択] をクリックします。 [実行頻度の選択] ダイアログボックスで、[時間] タブをクリックし、[時間] を選択し、[OK] をクリックします。
[テンプレートの選択] セクションで、ACS-Redis-BulkyCreateBackupAndUploadToOSSテンプレートを検索して選択します。
[テンプレートパラメーターの設定] セクションで、バックアップするTair (Redis OSS-compatible)インスタンスが存在するリージョンを [RegionId] ドロップダウンリストから選択します。 [インスタンスの選択] をクリックします。 [インスタンスの選択] ダイアログボックスで、バックアップするインスタンスを選択します。 次に、[OK] をクリックします。
OSSRegionIdおよびOSSBucketNameパラメーターを設定します。
O&Mタスクの実行に必要なRAM (Resource Access Management) ロールを設定します。
OOSのRAMロールを作成します。 詳細については、「OOS への権限を RAM を使用して付与する」をご参照ください。 次のポリシーをRAMロールにアタッチします。
{ "Version": "1", "Statement": [ { "Action": [ "kvstore:CreateBackup", "kvstore:DescribeBackupTasks", "kvstore:DescribeBackups", "kvstore:DescribeInstances" ], "Resource": "*", "Effect": "Allow" }, { "Action": [ "ros:CreateStack", "ros:DeleteStack", "ros:GetStack" ], "Resource": "*", "Effect": "Allow" }, { "Action": "oos:StartExecution", "Resource": "*", "Effect": "Allow" }, { "Action": [ "fc:CreateFunction", "fc:CreateService", "fc:DeleteFunction", "fc:DeleteService", "fc:GetFunction", "fc:GetService", "fc:InvokeFunction" ], "Resource": "*", "Effect": "Allow" }, { "Condition": { "StringEquals": { "acs:Service": "fc.aliyuncs.com" } }, "Action": "ram:PassRole", "Resource": "*", "Effect": "Allow" } ] }
Function Computeがバックアップファイルをダウンロードするために引き受けるAliyunFCDefaultRole RAMロールを作成します。 [ロールの作成] をクリックすると、Function Computeに必要なRAMロールをすばやく作成できます。
[作成] をクリックします。 [パラメーターの確認] メッセージで、[OK] をクリックします。 O&Mタスクが作成されました。
タスクの実行結果を表示します。
a. 指定した時間にO&Mタスクがトリガーされるまで待機し、結果を表示できます。
b. O&Mタスクの詳細ページに移動し、右上隅の [トリガー] をクリックして結果を表示することもできます。
タスクがトリガーされた後、実行ログを表示してタスクの進行状況を確認できます。
OSSに保存されているバックアップファイルを表示します。
実行が終了状態になるまで待ちます。 次に、実行IDをクリックします。
[実行手順と結果] セクションで、[子実行] タブをクリックします。 表示する子実行を見つけて、子実行IDをクリックします。
[出力] タブの [値] 列に表示されるURLをコピーします。
コピーしたURLを使用してOSSコンソールにログインし、保存されているバックアップファイルを表示します。
バックアップファイルの形式は次のとおりです。
Backup_[Instance ID]/[Date in the YYYY-MM-DD format]/[OOS backup task ID]/[Backup file name].rdb
バックアップしたTair (Redis OSS-compatible)インスタンスがクラスターアーキテクチャを使用していない場合、バックアップごとに1つのRDBファイルが生成されます。
バックアップするTair (Redis OSS-compatible)インスタンスがクラスターアーキテクチャを使用している場合、バックアップごとに生成されるRDBファイルの数はシャードの数と同じです。 たとえば、8つのシャードを持つクラスターインスタンスに対して8つのRDBファイルが生成されます。
バックアップファイルは自動的に削除されません。 ビジネス要件に基づいてバックアップファイルを保持または削除できます。
付録
実行フローチャート
実行プロセス全体を次の図に示します。
次の図は、Tair (Redis OSS-compatible)インスタンスのバックアップファイルを作成し、バックアップファイルをOSSにアップロードするプロセスを示しています。
テンプレート
次のサンプルコードは、この例で使用されているACS-Redis-BulkyCreateBackupAndUploadToOSSテンプレートの内容を示しています。
FormatVersion: OOS-2019-06-01
Description:
en: Create Redis backups in batches and upload them to OSS. Backing up redis and using fc to upload the backup to OSS may incur charges. For billing details, please refer to <a href='https://www.alibabacloud.com/help/en/redis/user-guide/automatic-or-manual-backup'>Redis Backup Fee Instructions</a> and <a href='https://www.alibabacloud.com/help/en/functioncompute/fc-2-0/product-overview/billing-overview'>Function calculation billing instructions</a>
name-en: ACS-Redis-BulkyCreateBackupAndUploadToOSS
Parameters:
regionId:
Label:
en: RegionId
Type: String
AssociationProperty: RegionId
Default: '{{ACS::RegionId}}'
targets:
Type: Json
Label:
en: TargetInstance
AssociationProperty: Targets
AssociationPropertyMetadata:
ResourceType: ALIYUN::Redis::Instance
RegionId: regionId
OSSRegionId:
Label:
en: OSSRegionId
Type: String
AssociationProperty: RegionId
OSSBucketName:
Label:
en: OSSBucketName
Type: String
AssociationProperty: ALIYUN::OSS::Bucket::BucketName
AssociationPropertyMetadata:
RegionId: ${OSSRegionId}
rateControl:
Label:
en: RateControl
Type: Json
AssociationProperty: RateControl
Default:
Mode: Concurrency
MaxErrors: 0
Concurrency: 10
OOSAssumeRole:
Label:
en: OOSAssumeRole
Type: String
Default: ''
RamRole: '{{ OOSAssumeRole }}'
Tasks:
- Name: GetInstance
Description:
en: Get the redis instances
Action: ACS::SelectTargets
Properties:
ResourceType: ALIYUN::Redis::Instance
RegionId: '{{ regionId }}'
Filters:
- '{{ targets }}'
Outputs:
InstanceIds:
Type: List
ValueSelector: Instances.Instance[].InstanceId
- Name: CreateBackupAndUploadToOSS
Action: ACS::Redis::CreateBackupAndUploadToOSS
Description:
en: Create backup and upload to OSS
Properties:
regionId: '{{ regionId }}'
instanceId: '{{ ACS::TaskLoopItem }}'
OSSRegionId: '{{ OSSRegionId }}'
OSSBucketName: '{{ OSSBucketName }}'
Loop:
RateControl: '{{ rateControl }}'
Items: '{{ GetInstance.InstanceIds }}'
Outputs:
OSSObjectURLs:
AggregateType: Fn::ListJoin
AggregateField: OSSObjectURL
Outputs:
OSSObjectURL:
Type: String
ValueSelector: .OSSObjectURL + "{{ACS::ExecutionId}}/" | split(".t0") | .[0]
Outputs:
OSSObjectURLs:
Type: List
Value: '{{ CreateBackupAndUploadToOSS.OSSObjectURLs }}'
次のサンプルコードは、Action: ACS::Redis::CreateBackupAndUploadToOSSの内容を示しています。
FormatVersion: OOS-2019-06-01
Description:
en: Create redis backup and upload to OSS
name-en: ACS::Redis::CreateBackupAndUploadToOSS
Parameters:
regionId:
Label:
en: RegionId
Type: String
AssociationProperty: RegionId
instanceId:
Label:
en: InstanceId
Type: String
AssociationProperty: ALIYUN::Redis::Instance::InstanceId
AssociationPropertyMetadata:
RegionId: ${regionId}
OSSRegionId:
Label:
en: OSSRegionId
Type: String
AssociationProperty: RegionId
OSSBucketName:
Label:
en: OSSBucketName
Type: String
AssociationProperty: ALIYUN::OSS::Bucket::BucketName
AssociationPropertyMetadata:
RegionId: ${OSSRegionId}
Default: ''
Tasks:
- Name: CreateBackup
Action: ACS::ExecuteApi
Description:
en: Create backup
Properties:
Service: r-kvstore
API: CreateBackup
Parameters:
RegionId: '{{ regionId }}'
InstanceId: '{{ instanceId }}'
Outputs:
BackupJobID:
Type: String
ValueSelector: .BackupJobID
- Name: WaitForBackupCreated
Action: ACS::WaitFor
Description:
en: Wait for backup created
Retries: 30
DelayType: Exponential
Delay: 2
BackOff: 2
Properties:
Service: r-kvstore
API: DescribeBackupTasks
Parameters:
RegionId: '{{ regionId }}'
InstanceId: '{{ instanceId }}'
BackupJobId: '{{ CreateBackup.BackupJobID }}'
DesiredValues:
- Finished
NotDesiredValues: []
StopRetryValues: []
PropertySelector: .BackupJobs[].BackupProgressStatus
- Name: GetBackupDownloadUrl
Action: ACS::ExecuteApi
Description:
en: Get backup download url
Properties:
Service: r-kvstore
API: DescribeBackups
Parameters:
RegionId: '{{ regionId }}'
InstanceId: '{{ instanceId }}'
BackupJobId: '{{ CreateBackup.BackupJobID }}'
StartTime:
Fn::FormatUTCTime:
- Fn::AddHour:
- '{{ ACS::CurrentUTCTime }}'
- -1
- '%Y-%m-%dT%H:%MZ'
EndTime:
Fn::FormatUTCTime:
- '{{ ACS::CurrentUTCTime }}'
- '%Y-%m-%dT%H:%MZ'
Outputs:
BackupDownloadURL:
Type: List
ValueSelector: .Backups.Backup[].BackupDownloadURL
- Name: UploadBackupToOSS
Action: ACS::FC::ExecuteScript
Description:
en: Upload backup to OSS
Properties:
runtime: python3.10
handler: index.handler
role: acs:ram::{{ACS::AccountId}}:role/AliyunFcDefaultRole
script: |-
import oss2
import requests
def handler(event, context):
auth = oss2.StsAuth(context.credentials.access_key_id, context.credentials.access_key_secret, context.credentials.security_token)
endpoint = 'https://oss-{{OSSRegionId}}.aliyuncs.com'
bucket = oss2.Bucket(auth, endpoint, '{{OSSBucketName}}')
unique_identifier = '{{ACS::TaskLoopItem}}'.split('?')[0].split('/')[-1]
execution_id = '{{ACS::ExecutionId}}'.split('.')[0]
input = requests.get('{{ACS::TaskLoopItem}}')
bucket.put_object(f'Backup_{{InstanceId}}/{{ACS::CurrentDate}}/{execution_id}/{unique_identifier}', input)
Loop:
Items: '{{ GetBackupDownloadUrl.BackupDownloadURL }}'
RateControl:
Mode: Concurrency
MaxErrors: 0
Concurrency: 20
Outputs:
OSSObjectURL:
Type: String
Value: https://oss.console.aliyun.com/bucket/oss-{{OSSRegionId}}/{{OSSBucketName}}/object?path=Backup_{{InstanceId}}/{{ACS::CurrentDate}}/