也谈轻量云自动快照备份

之前在轻量云进行快照备份都是手工处理的,一般是升级系统或者版本发布的时候进行备份。但是这个备份机制有个比较麻烦的问题在于快照并不是非常及时。例如用户上传的头像文件,这些是存在服务器上的,手工备份就有点麻烦。

前几天看到杜郎的《腾讯云轻量应用服务器初体验》里面提到了自动备份脚本,体验了一下,能用,但是备份策略有点过于简单。轻量云一共可以创建两个快照,但是至于保留策略,提供了两种,一个是保留旧的,一个是保留新的。

代码的处理逻辑也很简单粗暴:

# 删除之前较早一个备份,就是列表里的第二个,状态需要正常才能删除
                SnapshotState = (get_rest['SnapshotSet'][Instanceidx]['SnapshotState'])
                if SnapshotState == 'NORMAL':
                    SnapshotId = (get_rest['SnapshotSet'][Instanceidx]['SnapshotId'])
                    DeleteSnapshots_re = DeleteSnapshots(SecretId, SecretKey, SnapshotId, region)
                    if DeleteSnapshots_re != False:
                        # 删除之前一个后,再进行备份
                        print('已经删除完成快照ID为{0}的快照,现在准备开始备份实例'.format(SnapshotId))
                        CreateInstanceSnapshot(SecretId, SecretKey, region, InstanceIds)

这个参数Instanceidx 本质上其实是个数组索引,所以要么删除第一个,要么删除第二个。如果我想长期保留一个快照该怎么办?答案是,没办法。哈哈哈。

先来说下这个东西怎么配置吧。

1.新建函数服务,选择从头开始,输入函数你改成,运行环境选 python 2.7

2. 事件函数,选择本地上传zip 包,文件下载地址:https://github.com/obaby/TencentLighthouseAutoSnapshot/blob/main/Lighthouse-Auto-Snapshot.zip

 

3.配置所需参数除了图上的,还需要添加KeepPolicy 1 或者 2

参数说明:

:param SecretId: str 腾讯云账号SecretId
:param SecretKey: str 腾讯云账号SecretKey

从这个地址创建或者查看:https://console.cloud.tencent.com/cam/capi
Regions_InstanceIds 为区域:实例 id 拼接,通过冒号拼接
实例地域
    "ap-beijing", "ap-chengdu", "ap-guangzhou", "ap-hongkong", "ap-nanjing", "ap-shanghai", "ap-singapore", "ap-tokyo", "eu-moscow", "na-siliconvalley"

eg:
ap-shanghai:guimiquan

将 guimiquan 替换为你的轻量云实例 id,实例与所在区域需要一致
:param Instanceidx: int 0:删除最新的保留最早的备份,这样可以有一个固定备份,1:删除最早
:param KeepPolicy: int 快照保留策略 1:默认删除逻辑 根据上述删除策略进行快照删除 2:保留特定扩展名的快照(如果快照名称包含 keep 或者 保留 将不会删除该快照),如果都包含按照上述删除策略删除快照

4. 触发器,每天零点,或者自定义

5.测试

 

6. 备份效果

为了满足自己的要求,增加了一项功能,也就是添加了一个KeepPolicy参数,如果快照名称包含 keep 或者 保留 两个说明,那么会删除其他的快照,如果所有的快照都包含这个标记,那么会根据删除策略删除较久或者较新的快照。在这个机制下就可以自己定义要长期保留的快照了。

代码实现(未做优化,简单粗暴型):

def main(SecretId, SecretKey, region, InstanceIds, Instanceidx=1, KeepPolicy=2):
    """
    GOGO
    :param SecretId: str 腾讯云账号SecretId
    :param SecretKey: str 腾讯云账号SecretKey
    :param region: str 实例地域
    :param InstanceIds: str 实例ID
    param Instanceidx: int 0:删除最新的保留最早的备份,这样可以有一个固定备份,1:删除最早
    """
    get_rest = get_info(SecretId, SecretKey, region, InstanceIds)
    if get_rest != False:
        TotalCount = get_rest['TotalCount']
        # 快照数
        if TotalCount < 2:
            # 直接备份
            CreateInstanceSnapshot(SecretId, SecretKey, region, InstanceIds)
        elif TotalCount == 2:
            if KeepPolicy ==1:
                # 删除之前较早一个备份,就是列表里的第二个,状态需要正常才能删除
                SnapshotState = (get_rest['SnapshotSet'][Instanceidx]['SnapshotState'])
                if SnapshotState == 'NORMAL':
                    SnapshotId = (get_rest['SnapshotSet'][Instanceidx]['SnapshotId'])
                    DeleteSnapshots_re = DeleteSnapshots(SecretId, SecretKey, SnapshotId, region)
                    if DeleteSnapshots_re != False:
                        # 删除之前一个后,再进行备份
                        print('已经删除完成快照ID为{0}的快照,现在准备开始备份实例'.format(SnapshotId))
                        CreateInstanceSnapshot(SecretId, SecretKey, region, InstanceIds)
            else:
                # 使用其他保留策略 备份名称中包含 keep 或者 保留 字样的快照保留 如果都保留,按照 0 1 策略删除
                snapshots = get_rest['SnapshotSet']
                snapshot_id = None
                for s in snapshots:
                    if 'keep' in  s['SnapshotName'] or u'保留' in  s['SnapshotName']:
                        continue
                    else:
                        snapshot_id = s['SnapshotId']
                if snapshot_id is not None:
                    print('准备删除快照ID为{0}的快照'.format(snapshot_id))
                    DeleteSnapshots_re = DeleteSnapshots(SecretId, SecretKey, snapshot_id, region)
                    if DeleteSnapshots_re != False:
                        # 删除之前一个后,再进行备份
                        print('已经删除完成快照ID为{0}的快照,现在准备开始备份实例'.format(snapshot_id))
                        CreateInstanceSnapshot(SecretId, SecretKey, region, InstanceIds)
                else:
                    print('多个快照都被设置为长期保存,根据删除策略进行快照删除')
                    SnapshotState = (get_rest['SnapshotSet'][Instanceidx]['SnapshotState'])
                    if SnapshotState == 'NORMAL':
                        SnapshotId = (get_rest['SnapshotSet'][Instanceidx]['SnapshotId'])
                        DeleteSnapshots_re = DeleteSnapshots(SecretId, SecretKey, SnapshotId, region)
                        if DeleteSnapshots_re != False:
                            # 删除之前一个后,再进行备份
                            print('已经删除完成快照ID为{0}的快照,现在准备开始备份实例'.format(SnapshotId))
                            CreateInstanceSnapshot(SecretId, SecretKey, region, InstanceIds)
        else:
            print('当前快照数量存在问题,请登录腾讯云后台检查并删除多余的快照后操作')
            time.sleep(5)
            exit()

 

项目开源地址:

https://github.com/obaby/TencentLighthouseAutoSnapshot

☆版权☆

* 网站名称:obaby@mars
* 网址:https://h4ck.org.cn/
* 个性:https://oba.by/
* 本文标题: 《也谈轻量云自动快照备份》
* 本文链接:https://h4ck.org.cn/2024/06/17331
* 短链接:https://oba.by/?p=17331
* 转载文章请标明文章来源,原文标题以及原文链接。请遵从 《署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5 CN) 》许可协议。


You may also like

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注