也谈轻量云自动快照备份

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

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

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

# 删除之前较早一个备份,就是列表里的第二个,状态需要正常才能删除
                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://nai.dog/
* 个性:https://oba.by/
* 本文标题: 《也谈轻量云自动快照备份》
* 本文链接:https://www.nai.dog/2024/06/17331
* 短链接:https://oba.by/?p=17331
* 转载文章请标明文章来源,原文标题以及原文链接。请遵从 《署名-非商业性使用-相同方式共享 2.5 中国大陆 (CC BY-NC-SA 2.5 CN) 》许可协议。


You may also like

22 comments

  1. Level 1
    Google Chrome 86 Google Chrome 86 Windows 10 Windows 10 cn上海市 联通

    只用过阿里云的轻云服务器,快照备份从来没用过,只会宝塔保存数据

        1. 公主 Queen 
          Google Chrome 124 Google Chrome 124 Android 10 Android 10 cn山东省烟台市芝罘区 联通

          阿里的一直是收费的 不过好在价格还ok 主要是存储费用

  2. Level 5
    Firefox 127 Firefox 127 Windows 10 Windows 10 cn云南省丽江市 电信

    有技术就是不一样,我都是用宝塔或者1Panel备份,磁盘和第三方同时备份存储。

  3.  Level 5
    IBrowse r IBrowse r Android 12 Android 12 cn河南省 联通

    宝塔的插件比较多,嵌入对接主流的存储,更适合新手,就像我这种,看不懂太深的文章,只能仔细观赏每张图。 mosking

    1. 公主 Queen 
      Google Chrome 118 Google Chrome 118 Mac OS X 10.15 Mac OS X 10.15 cn山东省青岛市 联通

      没用过面板,还是各种命令行以及工具更合适

  4.  Level 5
    Microsoft Edge 126 Microsoft Edge 126 GNU/Linux GNU/Linux cn广东省珠海市 电信

    系统的备份都可以代码自动化做的么,我一般是手动点创建快照的

      1.  Level 5
        Microsoft Edge 123 Microsoft Edge 123 Windows 11 Windows 11 cn广东省珠海市 电信

        看到了,是个开源的方案,厂商都开放了一些接口了呀,进步了

  5. Level 2
    Google Chrome 125 Google Chrome 125 Android 14 Android 14 cn广东省广州市 移动

    别提备份了😭我不是刚换了域名和服务器吗?我只备份了主站的源码跟数据库,最近又搞了台电脑,我之前的博客有各种解决问题,现在之前服务器到期了,想要数据又不想续费😔

    1. 公主 Queen 
      Google Chrome 118 Google Chrome 118 Mac OS X 10.15 Mac OS X 10.15 cn山东省青岛市 联通

      如果有必要就再续点,没必要就自己再折腾。
      还是搬历史数据更方便吧

发表回复

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