前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >通过COS多版本功能快速批量恢复数据

通过COS多版本功能快速批量恢复数据

原创
作者头像
wainsun
修改2023-05-11 17:43:33
7890
修改2023-05-11 17:43:33
举报

问:线上的业务最怕什么?

答:误删除数据。

继续问:比误删除数据还可怕的是什么呢?

答:删除后无法找回!

COS对象存储有11个9的数据保障级别,但是不保障主动删除的数据,如果真是手欠清空了存储桶。那么真的是无法挽回了。

所以数据备份的事情,一定要防患于未然,提前做好高可用架构。COS产品官网上有详细的高可用架构说明文档https://cloud.tencent.com/document/product/436/37709

以上的理论内容,咱们就不详细说了。这里介绍一下,当真的手残点击了当前桶和备份桶的删除动作后,我们继续多版本的高可用架构如何可以快速的恢复我们想要的数据。

这里介绍一下快速恢复的方案。总结成一句话:遍历所有目标对象,找到第一个非删除版本的数据对象进行拷贝。

场景

  • 第一条为删除标记,第二条为最新版本数据,第三条为次新版本数据。
  • 第一条为最新版本数据。
  • 第一条为最新版本数据,第二条为次新版本是数据。
  • 第一条为删除标记,第二条为删除标记,第三条为最新版本数据,第四条为次新版本数据。
代码语言:javascript
复制
final int maxKeyNum = 400;
ListVersionsRequest listVersionsRequest = new ListVersionsRequest();
listVersionsRequest.withBucketName(srcbucket).withPrefix(keyPrefix).withMaxResults(maxKeyNum);

VersionListing versionListing = cossrcclient.listVersions(listVersionsRequest);
List < String > objectlist = new ArrayList < String > ();

int i = 0;
while (true) {
    List < COSVersionSummary > versionSummaries = versionListing.getVersionSummaries();

    for (COSVersionSummary versionInfo: versionSummaries) {
        // 对相同可key的文件list出来的顺序是版本号由近到远
        i++;

        String versionId = versionInfo.getVersionId();
        String key = versionInfo.getKey();
        long expectedLength = versionInfo.getSize();
        String expectedEtag = versionInfo.getETag();
        Boolean islatest = versionInfo.isLatest();
        Owner owner = versionInfo.getOwner();
        String getStorageClass = versionInfo.getStorageClass();
        Boolean isDeleteMarker = versionInfo.isDeleteMarker();

        System.out.println("Id:" + i); //ID
        System.out.println("versionId:" + versionId); //版本ID
        System.out.println("key:" + key); //对象全称
        System.out.println("islatest:" + islatest); //是否最新
        System.out.println("isDeleteMarker:" + isDeleteMarker); //是否有删除标记
        System.out.println("expectedLength:" + expectedLength); //对象大小
        System.out.println("expectedEtag:" + expectedEtag); //Etag值
        System.out.println("Owner:" + owner.getId() + ":" + owner.getDisplayName()); //资源拥有者ID和名称
        System.out.println("getStorageClass:" + getStorageClass); //对象类型

        if (isDeleteMarker == false) //标记不是删除标记的记录
        {
            if (islatest == true) //标记是最新的记录
            {
                System.out.println("最新版文件,拷贝" + "key:" + key + ",version:" + versionId);
                copyObjectRequest(cosdstclient, srcappid, srcbucket, key, versionId, dstbucket, key);
                objectlist.add(key);
            } else {
                if (!copiedobject(key, objectlist)) {
                    System.out.println("次新文件,拷贝" + "key:" + key + ",version:" + versionId);
                    copyObjectRequest(cosdstclient, srcappid, srcbucket, key, versionId, dstbucket, key);
                    objectlist.add(key);
                }

            }
        }
    }
    if (!versionListing.isTruncated()) {

        break;
    }
    versionListing = cossrcclient.listNextBatchOfVersions(versionListing); //列出下一批版本
    System.out.println("--------------------------------------");
}

这个方法的作用是,while每次400条遍历所有的目标对象。

1.当有DeleteMarker标记时则跳过操作。

2.当islastest为true时,说明这是一个最新版本的数据对象。则进行复制操作。

3.当既不是deletemarker标签,也不是islastest最新版时。我们会找到第一个数据对象,作为筛选后的最新版实体数据,进行复制。

4.复制操作完成后,对象名称加入objectlist,避免再次被覆盖,也就是说,每一个对象,最多只会操作一次复制。

通过这个逻辑,我们只要找到第一个有实体数据的对象,做复制操作,就可以实现所有最新版的复制功能,实现批量的数据恢复。

以下是已复制的object列表。

代码语言:javascript
复制
private static Boolean copiedobject(String object, List < String > objectlist) {
    for (int i = 0; i < objectlist.size(); i++) {
        //System.out.println("object:"+object);
        //System.out.println("objectlist.get(i):"+objectlist.get(i));
        if (object.equals(objectlist.get(i))) {
            return true;
        }
    }
    return false;
}

测试一下,我们做了一份桶的数据清单,如下

备份桶文件列表

这里模拟各种删除场景,之后执行批量恢复脚本,执行结果如下

脚本执行结果

完成后在目标桶查看

目标桶恢复的对象列表

验证成功。

java脚本文件:https://wainsun-1253985742.cos.ap-beijing.myqcloud.com/%E8%84%9A%E6%9C%AC%E6%96%87%E4%BB%B6/DisasterRecovery.rar

python脚本链接:https://github.com/shezhangjun/TencentCOS/tree/master/Python_SDK/COS_Disaster_Recovery

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
相关产品与服务
对象存储
对象存储(Cloud Object Storage,COS)是由腾讯云推出的无目录层次结构、无数据格式限制,可容纳海量数据且支持 HTTP/HTTPS 协议访问的分布式存储服务。腾讯云 COS 的存储桶空间无容量上限,无需分区管理,适用于 CDN 数据分发、数据万象处理或大数据计算与分析的数据湖等多种场景。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档