您可以通過最後一次訪問時間策略的生命週期規則,自動監測資料訪問模式並識別冷資料。然後,將冷資料進行儲存類型轉換,實現資料智能階層式存放區,最終降低儲存成本。
情境說明
某多媒體網站的資料需要根據最後訪問時間來判斷冷熱。傳統方法需要手動分析日誌,但使用基於最後訪問時間的生命週期規則,可以自動識別並階層式存放區資料。
根據以上情境描述,將資料分類儲存在examplebucket的不同路徑下,並且希望將某些資料到達指定時間後轉換為更低成本的儲存類型。
儲存路徑 | 儲存情境 | 生命週期策略 | 效果 |
data/ | 儲存wmv直播視頻,上傳後僅前兩個月有少量訪問,之後基本無訪問 | 距離最後一次訪問時間200天后轉為低頻訪問類型(資料被訪問後,依舊停留在低頻檔) | 達到指定天數後轉換儲存類型,未命中資料保留標準儲存類型 |
儲存mp4電影視頻資料,大部分檔案每半年內都會被頻繁訪問 | |||
log/ | 儲存大量的日誌資料,少量檔案近三個月內有若干次訪問記錄,所有檔案上傳半年後基本沒有訪問記錄 |
|
基於最後一次訪問時間的生命週期策略,OSS會自動識別並分級儲存冷熱資料。例如,data/路徑下頻繁訪問的mp4視頻保留標準儲存類型,半年內未訪問的mp4視頻在200天后轉為低頻訪問類型。如果配置基於最後一次修改時間的生命週期規則,則data/路徑下的資料只能基於最後一次修改時間進行儲存類型轉換或者刪除,無法根據檔案訪問熱度實現智能階層式存放區。
以上情境配置的生命週期策略和建議動作僅供參考,您需要結合自身的業務情境靈活配置生命週期規則。
前提條件
開啟訪問跟蹤。
將標準儲存或者低頻訪問類型轉換為歸檔、冷歸檔或深度冷歸檔類型,您需要提交工單申請。
重要工單申請通過後,如果您基於最後一次訪問時間策略將Object從標準儲存或低頻訪問類型轉為歸檔、冷歸檔或深度冷歸檔類型,則Bucket中歸檔、冷歸檔或深度冷歸檔類型Object的最後一次訪問時間預設為該Bucket開啟訪問跟蹤的時間。
操作步驟
使用OSS控制台
開啟訪問跟蹤。
登入OSS管理主控台。
單擊Bucket 列表,然後單擊目標Bucket名稱。
在左側導覽列,選擇資料管理 > 生命週期。
在生命週期頁面,開啟啟用訪問跟蹤開關。
說明開啟訪問跟蹤後,OSS預設以訪問跟蹤開啟時間作為Bucket中所有Object的最後一次訪問時間。
配置生命週期規則。
在生命週期頁面,單擊創建規則。
在建立生命週期規則面板,按以下說明分別配置基於首碼data/以及首碼log/的生命週期規則。
基於data/的生命週期規則
按以下說明配置基於data/的生命週期規則的必要參數,其他參數保留預設配置。
配置項
說明
狀態
選中啟動。
策略
選中按首碼匹配。
前綴
輸入
data/。檔案時間策略
選中指定天數。
生命週期管理規則
下拉選擇最後一次訪問時間,輸入200天后,資料自動轉換成低頻訪問類型(資料被訪問後,依舊停留在低頻檔)。
基於log/的生命週期規則
按以下說明配置基於log/的生命週期規則的必要參數,其他參數保留預設配置。
配置項
說明
狀態
選中啟動。
策略
選中按首碼匹配。
前綴
輸入
log/。檔案時間策略
選中指定天數。
生命週期管理規則
下拉選擇最後一次訪問時間,輸入120天后,資料自動轉換成低頻訪問類型(資料被訪問後,依舊停留在低頻檔)。
下拉選擇最後一次訪問時間,輸入250天后,資料自動轉換成歸檔類型。
單擊確定。
使用阿里雲SDK
僅Java SDK、Python SDK、Go SDK支援基於最後一次訪問時間建立生命週期規則。建立基於最後一次訪問時間的生命週期規則前,您需要為指定Bucket開啟訪問跟蹤功能。
開啟訪問跟蹤。
Java
import com.aliyun.oss.*; import com.aliyun.oss.common.auth.*; import com.aliyun.oss.common.comm.SignVersion; import com.aliyun.oss.model.AccessMonitor; 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"; // 填寫Bucket所在地區。以華東1(杭州)為例,Region填寫為cn-hangzhou。 String region = "cn-hangzhou"; // 建立OSSClient執行個體。 // 當OSSClient執行個體不再使用時,調用shutdown方法以釋放資源。 ClientBuilderConfiguration clientBuilderConfiguration = new ClientBuilderConfiguration(); clientBuilderConfiguration.setSignatureVersion(SignVersion.V4); OSS ossClient = OSSClientBuilder.create() .endpoint(endpoint) .credentialsProvider(credentialsProvider) .clientConfiguration(clientBuilderConfiguration) .region(region) .build(); try { // 開啟Bucket的訪問跟蹤狀態。Bucket開啟訪問跟蹤狀態後,如果需要修改Bucket的訪問跟蹤狀態為Disabled,請確保Bucket不存在基於Last Access Time匹配規則的生命週期規則。 ossClient.putBucketAccessMonitor(bucketName, AccessMonitor.AccessMonitorStatus.Enabled.toString()); } 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 # 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數OSS_ACCESS_KEY_ID和OSS_ACCESS_KEY_SECRET。 auth = oss2.ProviderAuthV4(EnvironmentVariableCredentialsProvider()) # 填寫Bucket所在地區對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 endpoint = "https://oss-cn-hangzhou.aliyuncs.com" # 填寫Endpoint對應的Region資訊,例如cn-hangzhou。注意,v4簽名下,必須填寫該參數 region = "cn-hangzhou" # examplebucket填寫儲存空間名稱。 bucket = oss2.Bucket(auth, endpoint, "examplebucket", region=region) # 開啟Bucket的訪問跟蹤狀態。Bucket開啟訪問跟蹤狀態後,如果需要修改Bucket的訪問跟蹤狀態為Disabled,請確保Bucket不存在基於LastAccessTime匹配規則的生命週期規則。 bucket.put_bucket_access_monitor("Enabled")Go
package main import ( "context" "flag" "log" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials" ) // 定義全域變數 var ( region string // 儲存地區 bucketName string // 儲存空間名稱 ) // init函數用於初始化命令列參數 func init() { flag.StringVar(®ion, "region", "", "The region in which the bucket is located.") flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.") } // 主函數,啟用儲存桶的訪問跟蹤 func main() { // 解析命令列參數 flag.Parse() // 檢查bucket名稱是否為空白 if len(bucketName) == 0 { flag.PrintDefaults() log.Fatalf("invalid parameters, bucket name required") } // 檢查region是否為空白 if len(region) == 0 { flag.PrintDefaults() log.Fatalf("invalid parameters, region required") } // 載入預設配置並設定憑證提供者和地區 cfg := oss.LoadDefaultConfig(). WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()). WithRegion(region) // 建立OSS用戶端 client := oss.NewClient(cfg) // 建立啟用儲存空間訪問跟蹤的請求 request := &oss.PutBucketAccessMonitorRequest{ Bucket: oss.Ptr(bucketName), AccessMonitorConfiguration: &oss.AccessMonitorConfiguration{ Status: oss.AccessMonitorStatusEnabled, // 啟用訪問跟蹤 }, } // 執行啟用儲存空間訪問跟蹤的操作 putResult, err := client.PutBucketAccessMonitor(context.TODO(), request) if err != nil { log.Fatalf("failed to put bucket access monitor %v", err) } // 列印啟用儲存空間訪問跟蹤的結果 log.Printf("put bucket access monitor result: %#v\n", putResult) }為首碼
data/以及首碼log/配置基於最後一次訪問時間的生命週期規則。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 Lifecycle { 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執行個體。 // 當OSSClient執行個體不再使用時,調用shutdown方法以釋放資源。 OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); try { String ruleId1 = "rule1"; String ruleId2 = "rule2"; // 指定首碼為data/。 String matchPrefix = "data/"; // 指定首碼為log/。 String matchPrefix2 = "log/"; SetBucketLifecycleRequest request = new SetBucketLifecycleRequest(bucketName); // 在生命週期規則1中指定首碼為data/的所有檔案在距離最後一次訪問時間200天后轉為低頻訪問類型。且再次訪問首碼為data/的檔案時,這些檔案仍保留為低頻訪問類型。 List<LifecycleRule.StorageTransition> storageTransitions = new ArrayList<LifecycleRule.StorageTransition>(); LifecycleRule.StorageTransition storageTransition = new LifecycleRule.StorageTransition(); storageTransition.setStorageClass(StorageClass.IA); storageTransition.setExpirationDays(200); storageTransition.setIsAccessTime(true); storageTransition.setReturnToStdWhenVisit(false); storageTransitions.add(storageTransition); LifecycleRule rule = new LifecycleRule(ruleId1, matchPrefix, LifecycleRule.RuleStatus.Enabled); rule.setStorageTransition(storageTransitions); request.AddLifecycleRule(rule); // 在生命週期規則2中指定首碼為log/的所有檔案在距離最後一次訪問時間120天后轉為低頻訪問類型。且再次訪問首碼為log/的檔案時,這些檔案仍保留為低頻訪問類型。 List<LifecycleRule.StorageTransition> storageTransitions2 = new ArrayList<LifecycleRule.StorageTransition>(); LifecycleRule.StorageTransition storageTransition2 = new LifecycleRule.StorageTransition(); storageTransition2.setStorageClass(StorageClass.IA); storageTransition2.setExpirationDays(120); storageTransition2.setIsAccessTime(true); storageTransition2.setReturnToStdWhenVisit(false); storageTransitions2.add(storageTransition2); // 同一規則中指定首碼為log/的所有檔案在距離最後一次訪問時間250天后轉為歸檔類型。 LifecycleRule.StorageTransition storageTransition3 = new LifecycleRule.StorageTransition(); storageTransition3.setStorageClass(StorageClass.Archive); storageTransition3.setExpirationDays(250); storageTransition3.setIsAccessTime(true); storageTransition3.setReturnToStdWhenVisit(false); storageTransitions2.add(storageTransition3); LifecycleRule rule2 = new LifecycleRule(ruleId2, matchPrefix2, LifecycleRule.RuleStatus.Enabled); rule2.setStorageTransition(storageTransitions2); request.AddLifecycleRule(rule2); VoidResult result = ossClient.setBucketLifecycle(request); System.out.println("返回狀態代碼:"+result.getResponse().getStatusCode()+" set lifecycle succeed"); } 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 # 從環境變數中擷取訪問憑證。運行本程式碼範例之前,請確保已設定環境變數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中指定首碼為data/的所有檔案在距離最後一次訪問時間200天后轉為低頻訪問類型。且再次訪問首碼為data/的檔案時,這些檔案仍保留為低頻訪問類型。 rule1 = LifecycleRule('rule1', 'data/', status=LifecycleRule.ENABLED) rule1.storage_transitions = [StorageTransition(days=200, storage_class=oss2.BUCKET_STORAGE_CLASS_IA, is_access_time=True, return_to_std_when_visit=False)] # 在生命週期規則2中指定首碼為log/的所有檔案在距離最後一次訪問時間120天后轉為低頻訪問類型。且再次訪問首碼為log/的檔案時,這些檔案仍保留為低頻訪問類型。 # 同一規則中指定首碼為log/的所有檔案在距離最後一次訪問時間250天后轉為歸檔類型。 rule2 = LifecycleRule('rule2', 'log/', status=LifecycleRule.ENABLED) rule2.storage_transitions = [StorageTransition(days=120, storage_class=oss2.BUCKET_STORAGE_CLASS_IA, is_access_time=True, return_to_std_when_visit=False), StorageTransition(days=250, storage_class=oss2.BUCKET_STORAGE_CLASS_ARCHIVE, is_access_time=True, return_to_std_when_visit=False)] lifecycle = BucketLifecycle([rule1, rule2]) # 設定生命週期規則。 result = bucket.put_bucket_lifecycle(lifecycle) print('設定生命週期成功,返回狀態為:' + str(result.status))Go
package main import ( "context" "flag" "log" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss" "github.com/aliyun/alibabacloud-oss-go-sdk-v2/oss/credentials" ) // 定義全域變數 var ( region string // 儲存地區 bucketName string // 儲存空間名稱 ) // init函數用於初始化命令列參數 func init() { flag.StringVar(®ion, "region", "", "The region in which the bucket is located.") flag.StringVar(&bucketName, "bucket", "", "The name of the bucket.") } func main() { // 解析命令列參數 flag.Parse() // 檢查bucket名稱是否為空白 if len(bucketName) == 0 { flag.PrintDefaults() log.Fatalf("invalid parameters, bucket name required") } // 檢查region是否為空白 if len(region) == 0 { flag.PrintDefaults() log.Fatalf("invalid parameters, region required") } // 載入預設配置並設定憑證提供者和地區 cfg := oss.LoadDefaultConfig(). WithCredentialsProvider(credentials.NewEnvironmentVariableCredentialsProvider()). WithRegion(region) // 建立OSS用戶端 client := oss.NewClient(cfg) // 建立設定儲存空間生命週期規則的請求 request := &oss.PutBucketLifecycleRequest{ Bucket: oss.Ptr(bucketName), // 儲存空間名稱 LifecycleConfiguration: &oss.LifecycleConfiguration{ Rules: []oss.LifecycleRule{ { // 在生命週期規則1中指定首碼為data/的所有檔案在距離最後一次訪問時間200天后轉為低頻訪問類型。且再次訪問首碼為data/的檔案時,這些檔案仍保留為低頻訪問類型 ID: oss.Ptr("rule1"), Status: oss.Ptr("Enabled"), Prefix: oss.Ptr("data/"), Transitions: []oss.LifecycleRuleTransition{ { Days: oss.Ptr(int32(200)), StorageClass: oss.StorageClassIA, IsAccessTime: oss.Ptr(true), // 設定為true,基於最後一次訪問時間策略 ReturnToStdWhenVisit: oss.Ptr(false), }, }, }, { // 在生命週期規則2中指定首碼為log/的所有檔案在距離最後一次訪問時間120天后轉為低頻訪問類型。且再次訪問首碼為log/的檔案時,這些檔案仍保留為低頻訪問類型 // 同一規則中指定首碼為log/的所有檔案在距離最後一次訪問時間250天后轉為歸檔類型。 ID: oss.Ptr("rule2"), Status: oss.Ptr("Enabled"), Prefix: oss.Ptr("log/"), Transitions: []oss.LifecycleRuleTransition{ { Days: oss.Ptr(int32(120)), StorageClass: oss.StorageClassIA, IsAccessTime: oss.Ptr(true), // 設定為true,基於最後一次訪問時間策略 ReturnToStdWhenVisit: oss.Ptr(false), }, { Days: oss.Ptr(int32(250)), StorageClass: oss.StorageClassArchive, IsAccessTime: oss.Ptr(true), ReturnToStdWhenVisit: oss.Ptr(false), }, }, }, }, }, } // 執行設定儲存空間生命週期規則的操作 result, err := client.PutBucketLifecycle(context.TODO(), request) if err != nil { log.Fatalf("failed to put bucket lifecycle %v", err) } // 列印設定儲存空間生命週期規則的結果 log.Printf("put bucket lifecycle result:%#v\n", result) }
使用命令列工具ossutil
ossutil2.0
開啟訪問跟蹤。
在本地config1.xml檔案中配置開啟訪問跟蹤。
<?xml version="1.0" encoding="UTF-8"?> <AccessMonitorConfiguration> <Status>Enabled</Status> </AccessMonitorConfiguration>為目標Bucket設定訪問跟蹤狀態。
ossutil api put-bucket-access-monitor --bucket bucketname --access-monitor-configuration file://config1.xml
為首碼data/以及首碼/log配置基於最後一次訪問時間的生命週期規則。
在本地config2.xml檔案中配置以下生命週期規則。
<?xml version="1.0" encoding="UTF-8"?> <LifecycleConfiguration> <Rule> <ID>rule1</ID> <Prefix>data/</Prefix> <Status>Enabled</Status> <Transition> <Days>200</Days> <StorageClass>IA</StorageClass> <IsAccessTime>true</IsAccessTime> <ReturnToStdWhenVisit>false</ReturnToStdWhenVisit> </Transition> </Rule> <Rule> <ID>rule2</ID> <Prefix>log/</Prefix> <Status>Enabled</Status> <Transition> <Days>120</Days> <StorageClass>IA</StorageClass> <IsAccessTime>true</IsAccessTime> <ReturnToStdWhenVisit>false</ReturnToStdWhenVisit> </Transition> <Transition> <Days>250</Days> <StorageClass>Archive</StorageClass> <IsAccessTime>true</IsAccessTime> <ReturnToStdWhenVisit>false</ReturnToStdWhenVisit> </Transition> </Rule> </LifecycleConfiguration>為目標Bucket設定生命週期規則。
ossutil api put-bucket-lifecycle --bucket bucketname --lifecycle-configuration file://config2.xml
ossutil1.0
開啟訪問跟蹤。
在本地config1.xml檔案中配置開啟訪問跟蹤。
<?xml version="1.0" encoding="UTF-8"?> <AccessMonitorConfiguration> <Status>Enabled</Status> </AccessMonitorConfiguration>為目標Bucket設定訪問跟蹤狀態。
ossutil access-monitor --method put oss://examplebucket/ config1.xml
為首碼data/以及首碼/log配置基於最後一次訪問時間的生命週期規則。
在本地config2.xml檔案中配置以下生命週期規則。
<?xml version="1.0" encoding="UTF-8"?> <LifecycleConfiguration> <Rule> <ID>rule1</ID> <Prefix>data/</Prefix> <Status>Enabled</Status> <Transition> <Days>200</Days> <StorageClass>IA</StorageClass> <IsAccessTime>true</IsAccessTime> <ReturnToStdWhenVisit>false</ReturnToStdWhenVisit> </Transition> </Rule> <Rule> <ID>rule2</ID> <Prefix>log/</Prefix> <Status>Enabled</Status> <Transition> <Days>120</Days> <StorageClass>IA</StorageClass> <IsAccessTime>true</IsAccessTime> <ReturnToStdWhenVisit>false</ReturnToStdWhenVisit> </Transition> <Transition> <Days>250</Days> <StorageClass>Archive</StorageClass> <IsAccessTime>true</IsAccessTime> <ReturnToStdWhenVisit>false</ReturnToStdWhenVisit> </Transition> </Rule> </LifecycleConfiguration>為目標Bucket設定生命週期規則。
ossutil lifecycle --method put oss://examplebucket config2.xml
使用REST API
如果您的程式自訂要求較高,您可以直接發起REST API請求。直接發起REST API請求需要手動編寫代碼計算簽名。更多資訊,請參見PutBucketAccessMonitor和PutBucketLifecycle。