腾讯云COS对象存储在实际使用中,提供了高达 99.999999999% 的数据存储安全SLA。但是,依然避免不了客户端发起的误删除操作。
在对文件存储高敏感的场景下,我们可以怎么办呢?其实有一种比较理想的功能“版本控制”。
多版本的概念可以理解为根据每个版本号生成一个副本,上传删除也是新的副本。确保在误删除的场景下我们还是可以通过历史版本号对该对象进行恢复。下面我们就来实践一下。
首先,我们要在bucket上开启多版本功能。(多版本一旦开起不可关闭,但是可以暂停)
我们以java sdk为例,陆续执行
效果如下:
在SDK中,我们可以使用如下接口https://cloud.tencent.com/document/product/436/35521
JAVA SDK代码如下
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执行效果如下
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为:
<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>"0b867e53c1d233ce9fe49d54549a2323"</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>"a63c90cc3684ad8b0a2176a6a8fe9005"</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>"693e9af84d3dfcc71e640e005bdc5e2e"</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>"d41d8cd98f00b204e9800998ecf8427e"</ETag>
<Size>0</Size>
<StorageClass>STANDARD</StorageClass>
<Owner>
<ID>1259681344</ID>
<DisplayName>1259681344</DisplayName>
</Owner>
</Version>
</ListVersionsResult>
这里需要注意一下,接口是通过前缀的方式来匹配,上面的代码中,String keyPrefix ="1";
所以会list出来以1开头的全部对象。
实践了List功能后,我们如何对旧版本进行“恢复”?先请看下面的示意图。
这里可以看出,我们是可以使用PUT object - COPY接口来实现久版本对象的“恢复”
测试一下GET当前对象的x-cos-version-id为MTg0NDUxNjAwNjM5NDc3MjAxNjU
以JAVA SDK为例
// 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 删除。