1. 背景概述
腾讯云轻量应用服务器(Lighthouse)相较于云服务器(CVM)具有简单易用、开箱即用、一站式整合、性价比高等优点,但也存在一些功能限制:比如不能像云服务器一样创建快照策略,且存在快照配额限制(每个地域内的免费快照总数量上限为已创建实例数乘以2,且最多不超过10个),并且目前还不能付费创建额外的快照。对于需要定期备份数据或者有回滚需求的开发者而言不算太友好。
好在轻量应用服务器提供了快照相关接口,利用相关 API 即可实现自定义快照备份。但仍受限于单机2个免费快照额度,若快照数量已达2个,备份时需要先删除一份快照才可成功创建一份新的快照。
2. 环境准备
- 轻量应用服务器(Lighthouse)
- Node.js 环境(本例版本v16.15.0)
- 腾讯云 API 访问密钥
- crontab(按计划执行cron 任务)
3. 服务器准备
本例使用的轻量应用服务器(Lighthouse)基础配置如下:
- 地域:南京
- 镜像:CentOS 8.2
- 实例套餐:CPU: 2核、内存: 4GB、60GB SSD云硬盘、流量包1000GB/月(带宽:6Mbps)
3.1 安装 Node.js
具体下载地址及安装可参见 Node.js 官方网站。
安装完成后,可配置使用腾讯镜像源以达到最佳下载速度:
代码语言:shell复制npm config set registry http://mirrors.cloud.tencent.com/npm/ //公网可用镜像源
或
npm config set registry http://mirrors.tencentyun.com/npm/ //腾讯云内网可用镜像源
3.2 安装 crontab
3.2.1 检查是否已安装过 crontab 服务
代码语言:shell复制rpm -qa |grep crontab
若提示类似 crontabs-1.11-6.20121102git.el7.noarch
的输出则表示已安装,可忽略下一小节。
3.2.2 安装 crontab 服务
代码语言:shell复制yum install vixie-cron
yum install crontabs
其中:vixie-cron 软件包是 cron 主程序;crontabs 软件包是用来安装、卸装、或列举守护进程的程序。
3.2.3 启动 crontab 服务
代码语言:shell复制service crond start //启动服务
service crond stop //关闭服务
service crond restart //重启服务
service crond reload //重新载入配置
service crond status //查看定时任务状态
chkconfig crond on //设置开机自动启动服务
chkconfig crond off //取消开机自动启动crond服务
3.2.4 crontab 用法简述
代码语言:shell复制# Example of job definition:
# .---------------- minute (0 - 59)
# | .------------- hour (0 - 23)
# | | .---------- day of month (1 - 31)
# | | | .------- month (1 - 12) OR jan,feb,mar,apr ...
# | | | | .---- day of week (0 - 6) (Sunday=0 or 7) OR sun,mon,tue,wed,thu,fri,sat
# | | | | |
# * * * * * user-name command to be executed
由以上可知一条定时任务主要由 minute hour day month week command
组成:
- minute:分钟,0到59之间的任何整数
- hour:小时,0到23之间的任何整数
- day:日期,1到31之间的任何整数
- month:月份,1到12之间的任何整数
- week:星期几,0到7之间的任何整数,0或7代表星期日
- command:要执行的命令,可以是系统命令,也可以是脚本文件
以 hour 字段为例:
*
取值范围内的数字,表示每小时执行一次/
指定时间的间隔频率,如 */3 表示每3小时执行一次-
从某个数字到某个数字,如 2-4 表示第2、3、4小时各执行一次,
自定义分散的时刻,如 3,5,7 表示第3、5、7小时各执行一次
3.3 获取腾讯云 API 访问密钥
打开 API 密钥管理控制台,会提示我们使用子账号密钥。为了避免主账号密钥泄露造成云上资产损失,以及方便做权限隔离,我们按照提示选择切换使用子账号密钥
,然后跟随指引创建子账号。
4. 自定义快照
4.1 自定义快照代码
此处借助 API Explorer 平台、轻量应用服务器快照相关接口文档、Node.js SDK 4.0 文档,编写如下代码:
代码语言:javascript复制// Depends on tencentcloud-sdk-nodejs version 4.0.3 or higher
const tencentcloud = require("tencentcloud-sdk-nodejs");
const LighthouseClient = tencentcloud.lighthouse.v20200324.Client;
const clientConfig = {
credential: {
secretId: "*****************", //填写子账户的 SecretId 及 SecretKey
secretKey: "*****************",
},
region: "ap-********", //填写轻量应用服务器所属地域
profile: {
httpProfile: {
endpoint: "lighthouse.tencentcloudapi.com",
},
},
};
const client = new LighthouseClient(clientConfig);
const params = {
"Filters": [
{
"Name": "instance-id", //填写轻量应用服务器的实例 ID
"Values": [
"lhins-*******" //按照【实例 ID 】进行过滤。
]
}
]
};
client.DescribeSnapshots(params).then(
(data) => {
deletesnapshot_id = data.SnapshotSet[0].SnapshotId //获取指定实例快照列表的第1个快照id
//deletesnapshot_id = data.SnapshotSet[1].SnapshotId //获取指定实例快照列表的第2个快照id
//查询所得的快照列表是按照时间由近到远排序的,故:
//删除第1个快照:循环删除最近的快照,创建一份最新的快照,保存历史第一个快照
//删除第2个快照:循环删除最远的快照,保留最新的两份快照
const deletesnapshot = {
"SnapshotIds": [
deletesnapshot_id
]
};
client.DeleteSnapshots(deletesnapshot).then(
(data) => {
console.log('删除最近的快照, 成功');
//console.log('删除最远的快照, 成功');
console.log(data);
const createsnapshot = {
"InstanceId": "lhins-*******" //填写轻量应用服务器的实例 ID
};
client.CreateInstanceSnapshot(createsnapshot).then(
(data) => {
console.log('创建新快照, 成功');
console.log(data);
},
(err) => {
console.log('创建新快照, 失败');
console.error("error", err);
}
);
},
(err) => {
console.log('删除最近的快照, 失败');
console.error("error", err);
}
);
},
(err) => {
console.log('查看快照列表, 失败');
console.error("error", err);
}
);
将以上代码保存(以保存为snapshot.js为例)并对应修改相关内容,在项目目录安装 Node.js SDK 4.0
代码语言:javascript复制npm install tencentcloud-sdk-nodejs --save
Tips:
- 更改第32、33行注释即可选择不同的快照方案
- 直接参考的 API Explorer 做的简单代码实现,未考虑快照数<2等其他情况,实例下已有2个快照时才有效
- 轻量应用服务器的实例 ID 在控制台的实例信息可找到,即括号内 ID
- Region 字段的可选值如下表所示:
地域 | 取值 |
---|---|
华北地区(北京) | ap-beijing |
西南地区(成都) | ap-chengdu |
华南地区(广州) | ap-guangzhou |
港澳台地区(中国香港) | ap-hongkong |
亚太南部(孟买) | ap-mumbai |
华东地区(南京) | ap-nanjing |
华东地区(上海) | ap-shanghai |
亚太东南(新加坡) | ap-singapore |
亚太东北(东京) | ap-tokyo |
欧洲地区(法兰克福) | eu-frankfurt |
欧洲地区(莫斯科) | eu-moscow |
美国西部(硅谷) | na-siliconvalley |
4.2 设置定时任务
终端输入 crontab -e
后编写想要执行的定时任务:
0 1 * * * node /项目目录/snapshot.js //表示每天凌晨1点执行快照备份
0 1 */2 * * node /项目目录/snapshot.js //表示每2天凌晨1点执行快照备份
0 1 * * 1 node /项目目录/snapshot.js //表示每周一凌晨1点执行快照备份
更多自定义规则可参考前文 crontab 用法简述自行自定义设置~