您可以通过基于最后一次访问时间(LastAccessTime)策略的生命周期规则来自动监测数据的访问模式并识别冷数据,然后将识别出来的冷数据进行存储类型的转换,从而达到数据的冷热分层存储,最终降低存储成本。
使用场景
多媒体场景
某网站的视频、图片存储在OSS上,历史数据会逐渐从热转冷。因此,您可能需要将网站内长时间不被访问的数据保存为低频访问类型。此外,部分数据距离上传时间已久,但仍然是热门访问数据,这部分数据需要继续保存为标准存储类型。在该场景下应选用基于最后一次访问时间的生命周期规则,用于自动识别冷热数据并进行分层存储,从而降低存储成本。
相册或网盘场景
对于长时间没有访问的冷数据,希望设置自定义转储天数,自动将冷数据转为低频访问类型,并确保数据的实时访问。
生命科学场景
基因测序生成的大量业务数据,往往需要根据数据的最后访问时间而非最后修改时间来判断数据的冷热。按以往,客户只能手动通过日志分析或其他方式进行数据冷热的分层管理。但如果选用基于最后一次访问时间的生命周期规则,则可实现由服务端根据最后访问时间来自动识别冷热数据并实现数据分层存储。不仅如此,您还可以在同一条生命周期规则中同时结合最后访问时间与最后修改时间的策略,从而更灵活地进行数据管理。
使用限制
不支持删除数据
不支持基于最后一次访问时间的生命周期规则进行数据删除。
匹配条件
生命周期规则目前仅支持根据前缀和标签进行匹配,不支持通配符匹配、后缀匹配以及正则匹配。
碎片过期限制
不支持对重叠前缀的Object设置两条或两条以上包含碎片过期策略的生命周期规则。示例如下:
示例一
您对整个Bucket设置了一条包含碎片过期策略的生命周期规则,则不支持对Bucket中任意前缀的Object再设置一条包含碎片过期策略的生命周期规则。
示例二
您对某个Bucket中前缀为dir1设置了一条包含碎片过期策略的生命周期规则,则不支持对该Bucket中包含重叠前缀(例如dir1/dir2)的Object再设置一条包含碎片过期策略的生命周期规则。
注意事项
规则数量
单个Bucket最多支持配置1000条生命周期规则,单条生命周期规则中可同时包含最后一次修改时间以及最后一次访问时间的策略。
费用说明
Object监控管理费用
开启访问跟踪后会产生Object监控管理费,但OSS暂不收取该费用。
低频访问不足规定时长容量费用
低频访问类型Object有最低30天的存储时长要求。如果存储时长未达到最低天数要求,还会产生不足规定时长容量费用。该计费项结合生命周期规则的示例说明如下:
示例一:标准类型Object在其创建10天后,通过生命周期将其转换为低频访问类型,过了5天后又将其转回标准存储。此时会产生15天的低频访问不足规定时长容量费用。
示例二:标准类型Object在其创建10天后,通过生命周期将其转换为低频访问类型,过了15天后将其删除。此时会产生5天的低频访问不足规定时长容量费用。
更多信息,请参见存储费用。
低频访问数据取回费用
访问低频访问类型文件产生的费用,按数据取回量计费。更多信息,请参见数据处理费用。
请求费用
通过生命周期规则转换Object存储类型时涉及请求费用。更多信息,请参见请求费用。
覆盖语义
PutBucketLifecycle为覆盖语义。例如,某个Bucket已配置了生命周期规则Rule1,您需要在Rule1基础上继续追加生命周期规则Rule2,您需要执行以下操作。
调用GetBucketLifecycle接口获取当前生命周期规则配置Rule1。
在Rule1基础上叠加Rule2。
调用PutBucketLifecycle接口更新生命周期规则为Rule1+Rule2。
生效时间
生命周期规则创建后的24小时内,OSS会加载规则。规则加载完成后,OSS会在每天的北京时间8:00开始执行规则。
执行完成时间
对于未配置标签的生命周期规则
华东1(杭州)、华东2(上海)、华北2(北京)、华北 3(张家口)、华北6(乌兰察布)、华南1(深圳)、新加坡地域执行10亿或以下次生命周期相关操作(包括Object存储类型转换以及碎片过期),可在24小时内完成。如果生命周期相关操作超出10亿次,则可能超出24小时。
其他地域执行1亿或以下次生命周期相关操作,可在24小时内完成。如果生命周期相关操作超出1亿次,则可能超出24小时。
对于已配置标签的生命周期规则
华东1(杭州)、华东2(上海)、华北2(北京)、华北 3(张家口)、华北6(乌兰察布)、华南1(深圳)、新加坡地域执行5亿或以下次生命周期相关操作(包括Object存储类型转换以及碎片过期),可在24小时内完成。如果生命周期相关操作超出5亿次,则可能超出24小时。
其他地域执行5千万或以下次生命周期相关操作,可在24小时内完成。如果生命周期相关操作超出5千万次,则可能超出24小时。
如果存储空间开启了版本控制,则对Object的每个版本均记为一次操作。
最后一次访问时间更新策略
在生命周期页面打开启用访问跟踪开关后,OSS默认以访问跟踪开启时间作为Bucket中所有Object的最后一次访问时间,如果24小时内,同一个Object有多次GetObject请求,则OSS会将首次GetObject的请求时间记录为Object最后一次访问时间。其他操作(例如PutObject、CopyObject等)会根据操作时间更新Object的最后一次访问时间。
关于哪些操作会更新Object的最后一次访问时间的更多信息,请参见哪些操作会更新Object的LastAccessTime?。
转储的Object类型
基于最后一次访问时间的生命周期规则支持将Object从标准存储类型转为低频访问类型,您还可以选择当Object被访问后是否自动转回标准存储类型。
基于最后一次访问时间的生命周期规则支持将Object从标准存储或低频访问类型转为归档、冷归档或深度冷归档存储类型,也可以选择将Object从归档转为冷归档或深度冷归档存储类型。如果您需要将Object从标准存储或低频访问类型转换为归档、冷归档或深度冷归档存储类型,请提交工单申请转换为归档、冷归档或深度冷归档类型的权限,申请通过后您需要指定转换的目标存储类型。
重要工单申请通过后,如果您基于最后一次访问时间策略将Object从标准存储或低频访问类型转为归档、冷归档或深度冷归档类型,则Bucket中归档、冷归档或深度冷归档类型Object的最后一次访问时间默认为该Bucket开启访问跟踪的时间。
在开通了OSS-HDFS服务的Bucket中配置生命周期规则
如果您对开通了OSS-HDFS服务的Bucket设置或更新为匹配整个Bucket的生命周期规则,需通过NOT元素排除.dlsdata/
,避免因生命周期规则触发的Object存储类型转换行为影响OSS-HDFS数据读写。
操作步骤
使用OSS控制台
登录OSS管理控制台。
单击Bucket 列表,然后单击目标Bucket名称。
在左侧导航栏, 选择数据管理 > 生命周期。
在生命周期页面,打开启用访问跟踪开关,然后单击创建规则。
在创建生命周期规则面板,按如下说明配置生命周期规则。
存储空间未开启版本控制
区域
配置项
说明
基础设置
状态
设置生命周期规则的状态,可选择启动或禁用。
启动生命周期规则后,将按照配置的生命周期规则转换数据存储类型。
禁用生命周期规则后,将中断生命周期任务。
策略
选择生命周期规则作用的Object。您可以选择按前缀匹配或配置到整个Bucket。
是否允许前缀重叠
OSS默认会检查各个生命周期规则的前缀是否重叠。例如,您设置了以下两条包含重叠前缀的生命周期规则:
规则1
指定该Bucket内所有前缀为dir1/的Object在距离最后一次访问时间180天后转为低频访问类型。
规则2
指定该Bucket内所有前缀为dir1/dir2/的Object在距离最后一次访问时间30天后转归档存储类型。
在未选中该选项的情况下,因后台检测到dir1/dir2/目录下的Object同时匹配两条转换规则,因此会拒绝设置以上两条生命周期规则。
在选中该选项的情况下,dir1/dir2/下的Object会在30天后转归档存储类型。dir1/下的其他Object会在180天后转为低频访问类型。
前缀
输入规则要匹配的Object名称的前缀。
前缀设置为img,表示匹配名称以img开头的所有Object,例如imgtest.png、img/example.jpg等。
前缀设置为img/,表示匹配名称以img/开头的所有Object,例如img/example.jpg、img/test.jpg等。
标签
生命周期规则仅针对拥有指定标签Object生效。例如选择了按前缀匹配,设置前缀为img,并设置标签的key为a,value为1。则该规则将匹配所有名称以img开头,标签为a=1的Object。关于对象标签的更多信息,请参见对象标签。
NOT
NOT选项用于设置生命周期规则对指定前缀和标签的Object不生效。
重要开启NOT选项时,前缀和标签必须至少存在一项,即同时设置前缀和标签或者只设置前缀或标签。
NOT语义定义标签中的key不支持与标签配置项中定义的key相同。
开启NOT选项后,不支持设置碎片过期策略。
文件大小
指定生命周期规则生效的文件大小。
指定最小文件:生命周期规则对大于该值的文件大小生效。取值大于0 B,小于5 TB。
指定最大文件:生命周期规则对小于该值的文件大小生效。取值大于0 B,小于等于5 TB。
重要如果在同一条生命周期中,同时配置了指定最小文件和指定最大文件:
确保指定最大文件的值大于指定最小文件的值。
不支持配置碎片执行策略。
不支持配置清除删除标记策略。
文件执行策略设置
文件时间策略
选择Object过期策略,可选择指定天数、指定日期和不启用。选择不启用时,文件过期策略不生效。
生命周期管理规则
配置转换Object存储类型的规则,数据可以转换为如下类型:
低频存储类型(数据被访问后,依旧保留在低频档)
低频存储类型(数据一旦被访问,回到标准档)
归档存储
冷归档存储
深度冷归档存储
例如:当您选择了最后一次访问时间策略,然后将过期天数设置为30,并指定数据在超出指定过期天数后将自动转换为低频存储类型(数据被访问后,依旧保留在低频档),则最后访问日期为2021年09月01日的Object会在2021年10月01日被转换为指定的存储类型。
碎片执行策略设置
碎片过期策略
设置对过期碎片执行的操作。如果选中了标签,则无法配置该选项。您可以选择碎片过期策略的指定天数或指定日期,也可以选择不启用碎片过期策略。当选择不启用时,碎片过期策略不生效。
重要生命周期规则至少包含文件过期策略或碎片过期策略。
碎片规则
根据碎片过期策略选择的过期天数或过期日期设定碎片何时过期,碎片过期后会被自动删除,且删除后不可恢复。
存储空间已开启版本控制
开启版本控制后,基础设置与碎片执行策略设置区域涉及的配置项,与未开启版本控制的配置方法相同。以下表格仅介绍与未开启版本控制相比,开启版本控制后配置项存在的差异。
区域
配置项
说明
当前版本文件执行策略设置
清理对象删除标记
开启版本控制后,清除策略中增加了清理对象删除标记选项,其他选项与未开启版本控制时相同。
选择此选项后,如果当前Object仅有一个版本且为删除标记时,则OSS将删除过期Object的删除标记。如果当前Object有多个版本,且Object的最新版本为删除标记时,则OSS将保留该删除标记。关于删除标记的更多信息,请参见删除标记。
历史版本文件执行策略设置
文件时间策略
设置历史版本文件的过期策略,可选择指定天数和不启用。当选择不启用时,文件过期策略不生效。
生命周期管理规则
设定一个过期天数N,历史版本的Object会在其被转换为历史版本的N天后,并在过期的第二天执行转换存储类型操作。例如设置为30,则在2021年09月01日被转为历史版本的Object会在2021年10月01日被转换为指定存储类型。
重要您可以通过Object下一个版本的最后一次访问时间确定Object被转为历史版本的时间。
单击确定。
生命周期规则保存成功后,您可以在策略列表中查看已设置的生命周期规则。
使用阿里云SDK
仅Java SDK、Go SDK支持基于最后一次访问时间创建生命周期规则。创建基于最后一次访问时间的生命周期规则前,您需要为指定Bucket开启访问跟踪功能。关于基于最后一次访问时间的生命周期规则的代码示例,请参见SDK简介。
Java
import com.aliyun.oss.ClientException;
import com.aliyun.oss.OSS;
import com.aliyun.oss.common.auth.*;
import com.aliyun.oss.OSSClientBuilder;
import com.aliyun.oss.OSSException;
import com.aliyun.oss.model.*;
import java.util.ArrayList;
import java.util.List;
public class Demo {
public static void main(String[] args) throws Exception {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。
String endpoint = "https://oss-cn-hangzhou.aliyuncs.com";
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
EnvironmentVariableCredentialsProvider credentialsProvider = CredentialsProviderFactory.newEnvironmentVariableCredentialsProvider();
// 填写Bucket名称,例如examplebucket。
String bucketName = "examplebucket";
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider);
try {
ossClient.putBucketAccessMonitor(bucketName, AccessMonitor.AccessMonitorStatus.Enabled.toString());
// 指定生命周期规则1。规则中指定前缀为logs,且小于等于64 KB的所有文件在距离最后一次访问时间30天后转为低频访问类型。且再次访问前缀为logs的文件时,这些文件仍保留为低频访问类型。
LifecycleRule lifecycleRule = new LifecycleRule("rule1", "logs", LifecycleRule.RuleStatus.Enabled);
List<LifecycleRule> lifecycleRuleList = new ArrayList<LifecycleRule>();
SetBucketLifecycleRequest setBucketLifecycleRequest = new SetBucketLifecycleRequest(bucketName);
LifecycleRule.StorageTransition storageTransition = new LifecycleRule.StorageTransition();
storageTransition.setStorageClass(StorageClass.IA);
storageTransition.setExpirationDays(30);
storageTransition.setIsAccessTime(true);
storageTransition.setReturnToStdWhenVisit(false);
storageTransition.setAllowSmallFile(true);
List<LifecycleRule.StorageTransition> storageTransitionList = new ArrayList<LifecycleRule.StorageTransition>();
storageTransitionList.add(storageTransition);
lifecycleRule.setStorageTransition(storageTransitionList);
lifecycleRuleList.add(lifecycleRule);
// 指定生命周期规则2。规则中指定前缀为dir,且大于64 KB的所有历史版本文件在距离最后一次访问时间10天后转为低频访问类型。且再次访问前缀为dir的文件时,这些文件将转为标准存储。
LifecycleRule lifecycleRule2 = new LifecycleRule("rule2", "dir", LifecycleRule.RuleStatus.Enabled);
LifecycleRule.NoncurrentVersionStorageTransition noncurrentVersionStorageTransition = new LifecycleRule.NoncurrentVersionStorageTransition();
noncurrentVersionStorageTransition.setStorageClass(StorageClass.IA);
noncurrentVersionStorageTransition.setNoncurrentDays(10);
noncurrentVersionStorageTransition.setIsAccessTime(true);
noncurrentVersionStorageTransition.setReturnToStdWhenVisit(true);
noncurrentVersionStorageTransition.setAllowSmallFile(false);
List<LifecycleRule.NoncurrentVersionStorageTransition> noncurrentVersionStorageTransitionList = new ArrayList<LifecycleRule.NoncurrentVersionStorageTransition>();
noncurrentVersionStorageTransitionList.add(noncurrentVersionStorageTransition);
lifecycleRule2.setNoncurrentVersionStorageTransitions(noncurrentVersionStorageTransitionList);
lifecycleRuleList.add(lifecycleRule2);
setBucketLifecycleRequest.setLifecycleRules(lifecycleRuleList);
// 设置生命周期规则。
ossClient.setBucketLifecycle(setBucketLifecycleRequest);
} catch (OSSException oe) {
System.out.println("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
System.out.println("Error Message:" + oe.getErrorMessage());
System.out.println("Error Code:" + oe.getErrorCode());
System.out.println("Request ID:" + oe.getRequestId());
System.out.println("Host ID:" + oe.getHostId());
} catch (ClientException ce) {
System.out.println("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
System.out.println("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
}
Python
# -*- coding: utf-8 -*-
import oss2
from oss2.credentials import EnvironmentVariableCredentialsProvider
from oss2.models import LifecycleRule, BucketLifecycle, StorageTransition, NoncurrentVersionStorageTransition
# 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
auth = oss2.ProviderAuth(EnvironmentVariableCredentialsProvider())
# yourEndpoint填写Bucket所在地域对应的Endpoint。以华东1(杭州)为例,Endpoint填写为https://oss-cn-hangzhou.aliyuncs.com。
# 填写Bucket名称,例如examplebucket。
bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket')
# 指定生命周期规则1。规则中指定前缀为logs,且大于64 KB的所有文件在距离最后一次访问时间30天后转为低频访问类型。且再次访问前缀为logs的文件时,这些文件仍保留为低频访问类型。
rule1 = LifecycleRule('rule1', 'logs', status=LifecycleRule.ENABLED)
rule1.storage_transitions = [StorageTransition(days=30, storage_class=oss2.BUCKET_STORAGE_CLASS_IA, is_access_time=True, return_to_std_when_visit=False, allow_small_file=True)]
# 指定生命周期规则2。规则中指定前缀为dir,且大于64 KB的所有历史版本文件在距离最后一次访问时间10天后转为低频访问类型。且再次访问前缀为dir的文件时,这些文件将转为标准存储。
rule2 = LifecycleRule('rule2', 'dir', status=LifecycleRule.ENABLED)
rule2.noncurrent_version_sotrage_transitions = [NoncurrentVersionStorageTransition(10, oss2.BUCKET_STORAGE_CLASS_IA, is_access_time=True, return_to_std_when_visit=True, allow_small_file=False)]
lifecycle = BucketLifecycle([rule1, rule2])
# 设置生命周期规则。
result = bucket.put_bucket_lifecycle(lifecycle)
print('设置生命周期成功,返回状态为:' + str(result.status))
Go
package main
import (
"fmt"
"github.com/aliyun/aliyun-oss-go-sdk/oss"
"os"
)
func main() {
// yourBucketName填写Bucket名称。
bucketName := "yourBucketName"
// 从环境变量中获取访问凭证。运行本代码示例之前,请确保已设置环境变量OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。
provider, err := oss.NewEnvironmentVariableCredentialsProvider()
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
// 创建OSSClient实例。
// yourEndpoint填写Bucket对应的Endpoint,以华东1(杭州)为例,填写为https://oss-cn-hangzhou.aliyuncs.com。其它Region请按实际情况填写。
client, err := oss.New("yourEndpoint", "", "", oss.SetCredentialsProvider(&provider))
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
isTrue := true
isFalse := false
// 指定生命周期规则1。规则中指定前缀为logs,且小于等于64 KB的所有文件在距离最后一次访问时间30天后转为低频访问类型。且再次访问前缀为logs的文件时,这些文件仍保留为低频访问类型。
rule1 := oss.LifecycleRule{
ID: "rule1",
Prefix: "logs",
Status: "Enabled",
Transitions: []oss.LifecycleTransition{
{
Days: 30,
StorageClass: oss.StorageIA,
IsAccessTime: &isTrue,
ReturnToStdWhenVisit: &isFalse,
AllowSmallFile: &isTrue,
},
},
}
// 指定生命周期规则2。规则中指定前缀为dir,且大于64 KB的所有历史版本文件在距离最后一次访问时间10天后转为低频访问类型。且再次访问前缀为dir的文件时,这些文件将转为标准存储。
rule2 := oss.LifecycleRule{
ID: "rule2",
Prefix: "dir",
Status: "Enabled",
NonVersionTransitions: []oss.LifecycleVersionTransition{
{
NoncurrentDays: 10,
StorageClass: oss.StorageIA,
IsAccessTime: &isTrue,
ReturnToStdWhenVisit: &isTrue,
AllowSmallFile: &isFalse,
},
},
}
// 设置生命周期规则。
var rules = []oss.LifecycleRule{rule1, rule2}
err = client.SetBucketLifecycle(bucketName, rules)
if err != nil {
fmt.Println("Error:", err)
os.Exit(-1)
}
fmt.Printf("%s\n", "set bucket life cycle success")
}
使用命令行工具ossutil
关于使用ossutil设置生命周期规则的具体操作, 请参见添加或修改生命周期规则。
使用REST API
如果您的程序自定义要求较高,您可以直接发起REST API请求。直接发起REST API请求需要手动编写代码计算签名。更多信息,请参见PutBucketLifecycle。
常见问题
如果针对Bucket内相同前缀的Object创建了两条生命周期规则,其中一条规则基于最后一次修改时间,另外一条规则基于最后一次访问时间,最终执行效果会怎么样?
例如,针对目标存储空间examplebucket创建了两条生命周期规则,规则一指定该Bucket内所有前缀为doc的Object在距离最后一次修改时间30天后删除,规则二指定该Bucket内所有前缀为doc的Object在距离最后一次访问时间30天后转低频访问类型。
由于OSS执行生命周期规则时遵循以用户较低开销为原则,因此仅规则一生效。原因是规则一中指定30天后直接删除与前缀匹配的Object,此后将不再产生费用。而规则二转为低频访问类型仍会收取相关存储费用或者数据取回费用等。
已配置的生命周期规则变更后何时生效,原有规则命中的数据如何处理?
例如,您已经针对前缀为er
的Object配置了距离最后一次访问时间30天后转低频、又过了30天后当Object被访问时选择将其转为标准存储类型的生命周期规则。但是在距离最后一次访问时间的35天后,您将生命周期指定的前缀er
变更为re
,此时原有Object仅转存为低频访问类型,转存为标准存储类型的行为不生效。变更规则命中Object的最后一次访问时间也是从Bucket开启访问跟踪时开始统计。
在已开启版本控制的Bucket内开启智能分层,Bucket内不同版本的Object存储层级如何分布?
在已开启版本控制Bucket内的每一个Object都有唯一的版本ID,且不同版本ID的Object相互独立。因此可能会出现历史版本Object为低频访问类型,但是最新版本Object为标准存储类型的情况。
是否支持关闭访问跟踪?
支持,前提是当前Bucket不存在基于最后一次访问时间的生命周期规则。关闭访问跟踪后,系统将停止追踪Object的最后一次访问时间信息。待下一次开启访问跟踪后,将重新刷新所有Object的最后一次访问时间。
相关文档
最后一次访问时间(LastAccessTime)是Object的一个重要属性,在计费、生命周期规则等场景中均会涉及。在Bucket开启访问跟踪后,部分针对Object的操作可能会更新Object的LastAccessTime,详情请参见哪些操作会更新Object的LastAccessTime?