前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >利用COS多版本避免文件误删除

利用COS多版本避免文件误删除

原创
作者头像
wainsun
发布2020-03-13 11:55:40
6340
发布2020-03-13 11:55:40
举报
文章被收录于专栏:伟哥专栏伟哥专栏

腾讯云COS对象存储在实际使用中,提供了高达 99.999999999% 的数据存储安全SLA。但是,依然避免不了客户端发起的误删除操作。

在对文件存储高敏感的场景下,我们可以怎么办呢?其实有一种比较理想的功能“版本控制”。

多版本的概念可以理解为根据每个版本号生成一个副本,上传删除也是新的副本。确保在误删除的场景下我们还是可以通过历史版本号对该对象进行恢复。下面我们就来实践一下。

首先,我们要在bucket上开启多版本功能。(多版本一旦开起不可关闭,但是可以暂停)

我们以java sdk为例,陆续执行

  1. 上传0B的对象
  2. 上传3B的对象
  3. 上传10B的对象
  4. 删除对象
  5. 上传13B的对象

效果如下:

在SDK中,我们可以使用如下接口https://cloud.tencent.com/document/product/436/35521

JAVA SDK代码如下

代码语言:txt
复制
		String keyPrefix = "1";

		final int maxKeyNum = 20;
		ListVersionsRequest listVersionsRequest = new ListVersionsRequest();
		listVersionsRequest.withBucketName(bucketName).withPrefix(keyPrefix).withMaxResults(maxKeyNum);

		VersionListing versionListing = cosclient.listVersions(listVersionsRequest);
		

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

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

				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();
				

				System.out.println("versionId:" + versionId);//版本ID
				System.out.println("key:" + key);//对象全称
				System.out.println("islatest:" + islatest);//是否最新
				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);//对象类型
				System.out.println("--------------------------------------");
			}
			if (!versionListing.isTruncated()) {
				break;
			}
			versionListing = cosclient.listNextBatchOfVersions(versionListing);
		}	

JAVA执行效果如下

代码语言:javascript
复制
versionId:MTg0NDUxNjAwNjM5NDc3MjAxNjU
key:1.txt
islatest:true
expectedLength:13
expectedEtag:0b867e53c1d233ce9fe49d54549a2323
Owner:1259681344:1259681344
getStorageClass:STANDARD
--------------------------------------
versionId:MTg0NDUxNjAwNjM5NjYwODI2MDM
key:1.txt
islatest:false
expectedLength:0
expectedEtag:null
Owner:1259681344:1259681344
getStorageClass:null
--------------------------------------
versionId:MTg0NDUxNjAwNjQwMTIwNzIxMjk
key:1.txt
islatest:false
expectedLength:10
expectedEtag:a63c90cc3684ad8b0a2176a6a8fe9005
Owner:1259681344:1259681344
getStorageClass:STANDARD
--------------------------------------
versionId:MTg0NDUxNjAwNjQwMzMwMDA4Nzk
key:1.txt
islatest:false
expectedLength:3
expectedEtag:693e9af84d3dfcc71e640e005bdc5e2e
Owner:1259681344:1259681344
getStorageClass:STANDARD
--------------------------------------
versionId:MTg0NDUxNjAwNjQwNDM0MTIzNjA
key:1.txt
islatest:false
expectedLength:0
expectedEtag:d41d8cd98f00b204e9800998ecf8427e
Owner:1259681344:1259681344
getStorageClass:STANDARD
--------------------------------------

API接口返回的XML为:

代码语言:javascript
复制
<ListVersionsResult>
	<EncodingType>url</EncodingType>
	<Name>mver-1259681344</Name>
	<Prefix>1</Prefix>
	<KeyMarker/>
	<VersionIdMarker/>
	<MaxKeys>20</MaxKeys>
	<IsTruncated>false</IsTruncated>
	<Version>
		<Key>1.txt</Key>
		<VersionId>MTg0NDUxNjAwNjM5NDc3MjAxNjU</VersionId>
		<IsLatest>true</IsLatest>
		<LastModified>2020-03-12T10:42:41.000Z</LastModified>
		<ETag>&quot;0b867e53c1d233ce9fe49d54549a2323&quot;</ETag>
		<Size>13</Size>
		<StorageClass>STANDARD</StorageClass>
		<Owner>
			<ID>1259681344</ID>
			<DisplayName>1259681344</DisplayName>
		</Owner>
	</Version>
	<DeleteMarker>
		<Key>1.txt</Key>
		<VersionId>MTg0NDUxNjAwNjM5NjYwODI2MDM</VersionId>
		<IsLatest>false</IsLatest>
		<LastModified>2020-03-12T10:42:23.000Z</LastModified>
		<Owner>
			<ID>1259681344</ID>
			<DisplayName>1259681344</DisplayName>
		</Owner>
	</DeleteMarker>
	<Version>
		<Key>1.txt</Key>
		<VersionId>MTg0NDUxNjAwNjQwMTIwNzIxMjk</VersionId>
		<IsLatest>false</IsLatest>
		<LastModified>2020-03-12T10:41:37.000Z</LastModified>
		<ETag>&quot;a63c90cc3684ad8b0a2176a6a8fe9005&quot;</ETag>
		<Size>10</Size>
		<StorageClass>STANDARD</StorageClass>
		<Owner>
			<ID>1259681344</ID>
			<DisplayName>1259681344</DisplayName>
		</Owner>
	</Version>
	<Version>
		<Key>1.txt</Key>
		<VersionId>MTg0NDUxNjAwNjQwMzMwMDA4Nzk</VersionId>
		<IsLatest>false</IsLatest>
		<LastModified>2020-03-12T10:41:16.000Z</LastModified>
		<ETag>&quot;693e9af84d3dfcc71e640e005bdc5e2e&quot;</ETag>
		<Size>3</Size>
		<StorageClass>STANDARD</StorageClass>
		<Owner>
			<ID>1259681344</ID>
			<DisplayName>1259681344</DisplayName>
		</Owner>
	</Version>
	<Version>
		<Key>1.txt</Key>
		<VersionId>MTg0NDUxNjAwNjQwNDM0MTIzNjA</VersionId>
		<IsLatest>false</IsLatest>
		<LastModified>2020-03-12T10:41:06.000Z</LastModified>
		<ETag>&quot;d41d8cd98f00b204e9800998ecf8427e&quot;</ETag>
		<Size>0</Size>
		<StorageClass>STANDARD</StorageClass>
		<Owner>
			<ID>1259681344</ID>
			<DisplayName>1259681344</DisplayName>
		</Owner>
	</Version>
</ListVersionsResult>

这里需要注意一下,接口是通过前缀的方式来匹配,上面的代码中,String keyPrefix ="1";

所以会list出来以1开头的全部对象


实践了List功能后,我们如何对旧版本进行“恢复”?先请看下面的示意图。

COS对象存储多版本示意图
COS对象存储多版本示意图

这里可以看出,我们是可以使用PUT object - COPY接口来实现久版本对象的“恢复”

测试一下GET当前对象的x-cos-version-id为MTg0NDUxNjAwNjM5NDc3MjAxNjU

以JAVA SDK为例

代码语言:javascript
复制
// bucket 的命名规则为{name}-{appid} ,此处填写的存储桶名称必须为此格式
String srcBucketName = "mver-125968XXX";
String srcKey = "1.txt";// 要拷贝的源文件
String destBucketName = "mver-1259681XXX";
String destKey = "1.txt";// 要拷贝的目的文件
CopyObjectRequest copyObjectRequest = new CopyObjectRequest(srcBucketName, srcKey, destBucketName, destKey);
copyObjectRequest.setStorageClass(StorageClass.Standard_IA);//我们这里将类型改为低频类型
ObjectMetadata om = new ObjectMetadata();
om.setHeader("Cache-Control", "max-age=1000");//header头更新
om.setHeader("x-cos-copy-source", "mver-1259681344.cos.ap-beijing.myqcloud.com/1.txt?versionId=MTg0NDUxNjAwNjQwNDM0MTIzNjA");
//注意这里   我们要取的源文件的版本号MTg0NDUxNjAwNjQwNDM0MTIzNjA
copyObjectRequest.setNewObjectMetadata(om);
CopyObjectResult copyObjectResult = cosclient.copyObject(copyObjectRequest);		

成功执行后再curl

为我们希望的对象属性,并且该对象会生成一个新的版本号为MTg0NDUxNjAwMDIxODExMzY1OTA

以上就是多版本的List和恢复功能的实践用法,希望能帮助到到家。

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

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

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

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

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