【玩转Lighthouse】利用快照接口 API 实现 Lighthouse 定期自定义快照

2022-05-05 11:56:54 浏览数 (4)

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 密钥管理控制台,会提示我们使用子账号密钥。为了避免主账号密钥泄露造成云上资产损失,以及方便做权限隔离,我们按照提示选择切换使用子账号密钥,然后跟随指引创建子账号。

风险提示,选择切换使用子账号密钥风险提示,选择切换使用子账号密钥
选择自定义创建选择自定义创建
1. 默认第一个选项即可1. 默认第一个选项即可
2. 设置用户名并勾选编程访问即可2. 设置用户名并勾选编程访问即可
3. 搜索框搜索Lighthouse,选择轻量应用服务器全读写访问权限3. 搜索框搜索Lighthouse,选择轻量应用服务器全读写访问权限
4. 点击完成即可4. 点击完成即可
获得子账户的 SecretId 及 SecretKey,保存备用获得子账户的 SecretId 及 SecretKey,保存备用

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
轻量应用服务器的实例 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 后编写想要执行的定时任务:

代码语言:javascript复制
0 1 * * * node /项目目录/snapshot.js  //表示每天凌晨1点执行快照备份
0 1 */2 * * node /项目目录/snapshot.js  //表示每2天凌晨1点执行快照备份
0 1 * * 1 node /项目目录/snapshot.js  //表示每周一凌晨1点执行快照备份

更多自定义规则可参考前文 crontab 用法简述自行自定义设置~

0 人点赞