快照服务是一种无代理(Agentless)的数据备份方式,可以为公有云上服务器实例的云盘创建崩溃一致性快照,用于备份或者恢复整个云盘。也是一种便捷高效的数据容灾手段,常用于以下应用场景:
• 容灾备份:为云盘创建快照,再使用快照创建云盘获取基础数据,实现同城容灾和异地容灾。
• 环境复制:使用系统盘快照创建自定义镜像,再使用自定义镜像创建服务器实例,实现环境复制。
• 提高容错率:出现操作失误时,能及时回滚数据,降低操作风险,实现版本回退。
• 定期创建快照,避免因操作失误或外部攻击等原因导致数据丢失。例如,团队成员不慎在云盘上存储了错误的数据、服务器实例被误释放、应用错误导致了数据错误、或者骇客利用应用漏洞恶意删除业务数据等。
• 执行重要操作前创建一份快照,常见的重要运维操作包括更换操作系统、应用软件升级或业务数据迁移等。
这其中定期自动创建快照的功能(也可称之为自动快照策略)对于实现以上应用场景非常重要,但目前遗憾的是,IBM Cloud上的快照功能目前还不支持自动快照策略,据说官方会在2022年1Q上线此功能。我们在期待之余,其实也可以通过以下两种方式来自己实现IBM Cloud上的自动快照策略功能:
- 利用linux的cron job功能
- 利用IBM Cloud上的Code Engine cron event producer功能
下面我们就具体来看一下这两种方式具体如何实现。
第一种方式利用linux的cron job功能来实现自动快照策略的步骤如下:
- 在一台linux服务器上安装Crontab软件,并创建定时任务
- 编写定时任务脚本,在脚本里通过IBM Cloud CLI命令创建快照
首先我们需要在执行Crontab定时任务的linux机器上(笔者用的是CentOS)安装IBM Cloud CLI工具
curl -sL http://ibm.biz/idt-installer | bash
接下来我们需要安装VPC CLI 插件
ibmcloud plugin install vpc-infrastructure
继续执行以下命令:
export IBMCLOUD_IS_FEATURE_SNAPSHOT=true
ibmcloud is target --gen 2
检测是否已安装Crontab
#crontab
-bash: crontab: command not found
执行 crontab 命令如果报 command not found,就表明没有安装.
使用如下命令安装Crontab
yum install crontabs
查看crontab服务状态:service crond status
手动启动crontab服务:service crond start
接下来我们可以执行crontab –e,添加如下内容:
*/10 * * * * /opt/snapshots.sh
上面命令的含义是每10分钟执行一次snapshots.sh脚本,其中snapshots.sh脚本里包含了生成快照的IBM Cloud CLI命令
然后我们在/opt目录下生成snapshots.sh脚本,内容如下:
vi /opt/snapshots.sh
#!/bin/sh
/usr/local/bin/ibmcloud login --apikey lBSS3sXgk3rFNRv7RQ4ziVcAAQXXXXX -c 3559d775d2e04fXXXXXXb9d4681c09
/usr/local/bin/ibmcloud is snapshot-create --name demo-snapshot-date +%Y-%m-%d-%H-%M-%S
--volume r006-568b3c30-XXXX-4c9e-93e6-8ddc1157b0ca
其中/usr/local/bin/ibmcloud login --apikey lBSS3sXgk3rFNRv7RQ4ziVcAAQXXXXX -c 3559d775d2e04fXXXXXXb9d4681c09命令用来登录ibm cloud,apikey参数表示登录用户的ibm cloud API Key,-c参数表示要登录的ibm cloud账号的ID,可以到以下界面获得
/usr/local/bin/ibmcloud is snapshot-create --name demo-snapshot-date +%Y-%m-%d-%H-%M-%S
--volume r006-568b3c30-XXXX-4c9e-93e6-8ddc1157b0ca是创建快照的命令,其中—name表示要创建的快照的名称,笔者加了个时间戳的后缀,以便区分。–volume表示要创建快照的云盘ID,可以通过以下界面获取
执行如下命令:
chmod 777 /opt/snapshots.sh
过一段时间后,查看快照页面
说明快照已成功自动创建
第二种方式:利用IBM Cloud上的Code Engine cron event producer功能来实现自动快照策略
IBM Cloud Code Engine 是一个完全管理的无服务器平台。 您只需提供容器映像、批处理作业或源代码,IBM Cloud Code Engine 则负责管理和保护底层基础架构。 Code Engine 隐藏了运行时托管环境的复杂性,使开发人员能够专注于代码,而无需操心基础架构管理。 它支持开发人员以统一的用户体验部署各种工件(容器映像、源代码、批处理作业等),并且可以动态缩放产生的应用,甚至缩减至零 - 因此用户仅在工作负载运行时才需要付费。
Code Engine支持cron类型的event producer,当您需要在明确定义的时间间隔或特定时间执行操作时,就可以考虑使用Code Engine的cron event producer。要利用Code Engine实现VPC服务器实例的自动快照策略功能,我们需要做如下事情:
- 创建一个镜像,在该镜像中安装并初始化IBM Cloud CLI命令行工具,登录IBM Cloud账号,并创建快照
- 将镜像上传到Docker镜像仓库
- 在Code Engine上创建App, 并用第二步中上传的镜像创建Job
- 在Code Engine上创建subscription来定期执行第三步中创建的Code Engine App
下面我们来看一下以上每步的具体操作
1. 创建一个镜像,在该镜像中安装并初始化IBM Cloud CLI命令行工具,登录IBM Cloud账号,并创建快照
创建镜像所使用的dockerfile及相关文件如下:
Dockerfile文件
FROM ubuntu:latest
RUN apt update
RUN apt upgrade -y --allow-unauthenticated
RUN apt install -y curl
COPY ./installer.sh .
RUN chmod +x ./installer.sh
RUN ./installer.sh
RUN ibmcloud plugin install vpc-infrastructure
COPY run.sh .
RUN chmod +x run.sh
CMD "./run.sh"
env.sh.temp文件
export REGION=us-south
export RESOURCE_GROUP=Default
export API_KEY= #your api key (IBM Cloud上登录用户的api key)
export NAME_PREFIX=demo-data03
export VOLUME_ID=r006-3f09a953-f704-488f-XXXXX-a842de33f3ce
installer.sh文件
install文件篇幅过长,大家可到https://github.com/threen134/codeEngine下查看下载
run.sh文件
#!/bin/bash
ibmcloud login -r $REGION -g $RESOURCE_GROUP --apikey $API_KEY
ibmcloud is snapshot-create --name ${NAME_PREFIX}-`date +%Y-%m-%d-%H-%M-%S` --volume ${VOLUME_ID}
spar
大家也可以从https://github.com/threen134/codeEngine下载以上文件
2.将镜像上传到Docker镜像仓库
具体上传的过程这里就不累赘了,笔者上传后的镜像路径为docker.io/spark123fgew/ibmcli:v1
3. 在Code Engine上创建App, 并用第二步中上传的镜像创建Job
首先创建Code Engine project
下一步创建Job
4. 在Code Engine上创建subscription来定期执行第三步中创建的Code Engine App
指定自动创建快照的schedule,每10分钟自动创建一个快照
检查快照是否已按Schedule自动创建
从上图可以看到,每隔10分钟会自动创建一个快照。说明使用Code Engine的cron event producer自动创建快照成功。
文档参考;
https://cloud.ibm.com/docs/vpc?topic=vpc-snapshots-vpc-planning
https://cloud.ibm.com/docs/vpc?topic=vpc-infrastructure-cli-plugin-vpc-reference
https://cloud.ibm.com/docs/codeengine?topic=codeengine-subscribe-cron-tutorial
https://cloud.ibm.com/docs/cli?topic=cli-ibmcloud_cli