ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ(仅有把抱怨环境的心境,化为上进的力量,才是成功的保证。——罗曼·罗兰)
ㅤㅤㅤ
ㅤㅤㅤ
ㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤㅤ
使用aws-dynamodb api来进行备份
原理:配置serverless定时器达到定时执行的目的后,再通过对接aws-dynamodb的api,来完成备份表的维护操作
说明:通过api创建的备份表,只能存在暖存储区,保留期为永久,每次备份为全表的数据,可以使用连续备份
优点
缺点
serverless文件配置
functions:
createTableBackPlan:
handler: createBackupPlan
events:
- schedule:
rate:
- cron(* * * * ? *)
input:
tableName: albedo-tenant-table-dev
deleteTableBackPlan:
handler: deleteBackupPlan
events:
- schedule:
rate:
- cron(* * * * ? *)
input:
tableName: albedo-tenant-table-dev
数据库初始化
const { Lambda, DynamoDB } = require('aws-sdk');
const dynammoose = require('dynamoose');
const dayjs = require('dayjs');
// aws链接配置
const dynamodbAwsConf = {
accessKeyId: 'xxx',
secretAccessKey: 'xxx',
region: 'cn-northwest-1'
};
// 初始化dynamodb数据库
const dynamodb = new DynamoDB(dynamodbAwsConf);
// 初始化dynamoose
const db = new dynammoose.aws.sdk.DynamoDB(dynamodbAwsConf);
dynammoose.aws.ddb.set(db);
// 备份表模型
const backupModel = dynamoose.model('backup_table_dev', {
id: {
type: String,
hashKey: true
},
arn: String,
backupTimestamp: Number
});
备份操作代码
// 创建备份
module.exports.createBackupPlan = async (event) => {
// 获取现在的时间
const time = dayjs().format('YYYYMMDDHHmmss');
const timestamp = dayjs().unix();
// 每天凌晨五点开始备份 cron(0 5 * * ? *)
const tableName = event.tableName;
const BackupName = `${tableName}-${time}`;
// 创建备份
const { BackupDetails } = await dynamodb.createBackup({
BackupName,
TableName: tableName
}).promise();
const { BackupArn } = BackupDetails;
// 记录备份
const backupData = {
id: BackupName,
arn: BackupArn,
backupTimestamp: timestamp
};
await backupModel.create(backupData);
}
// 备份还原
module.exports.recoveryBackupPlan = async (event) => {
const obj = JSON.parse(event.body);
const targetTableName = obj.targetTableName;
const backupArn = obj.backupArn;
await dynamodb.restoreTableFromBackup({
TargetTableName: targetTableName,
BackupArn: backupArn
}).promise();
}
// 删除备份
module.exports.deleteBackupPlan = async (event) => {
// 一周之前的时间
const beforeWeekTimestamp = dayjs().subtract(1, 'week').unix();
// 每次删除一周之前的备份表
const list = await backupModel.scan().filter('backupTimestamp').le(beforeWeekTimestamp).all().exec();
// 删除备份
for (const item of list) {
await dynamodb.deleteBackup({ BackupArn: item.arn }).promise();
}
};
登录aws账号,使用控制台操完成备份操作
原理:备份任务完全由aws托管,不用关心底层实现
说明:通过控制台操作备份,可以使用aws提供的所有备份功能,比如备份频率,连续备份,冷存储,保留期等
优点
备份操作方法
备份恢复操作
使用aws-cli脚本命令完成备份操作
原理:备份任务依然由aws完成托管,但通过aws提供的脚本命令来进行操作
说明:功能和aws-dynamodb api一样,主要针对使用命令行,命令行批处理的人员
优点
缺点
命令行管理的核心脚本
aws dynamodb create-backup \
--table-name albedo-tenant-table-dev \
--backup-name albedo-tenant-table-dev-backup
aws dynamodb restore-table-from-backup \
--target-table-name albedo-tenant-table-dev-2 \
--backup-arn arn:aws-cn:dynamodb:cn-northwest-1:302871604782:table/albedo-tenant-table-dev/backup/01666948442788-d27a40cf
aws dynamodb delete-backup \
--backup-arn arn:aws-cn:dynamodb:cn-northwest-1:302871604782:table/albedo-tenant-table-dev/backup/01666948442788-d27a40cf
异地多活方案概述
异地备份的作用
选择对应表的还原选项和目标区域即可