IT博客汇
  • 首页
  • 精华
  • 技术
  • 设计
  • 资讯
  • 扯淡
  • 权利声明
  • 登录 注册

    也谈轻量云自动快照备份

    obaby发表于 2024-06-14 09:11:58
    love 0

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

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

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

    # 删除之前较早一个备份,就是列表里的第二个,状态需要正常才能删除
                    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



沪ICP备19023445号-2号
友情链接