您可以通過基于最后一次訪問時間(Last Access Time)策略的生命周期規則來自動監測數據的訪問模式并識別冷數據,然后將識別出來的冷數據進行存儲類型的轉換,從而達到數據的智能分層存儲,最終降低存儲成本。
場景說明
假設某多媒體網站產生了大量的數據,且數據均以標準存儲類型進行存儲,而這些數據往往需要根據數據的最后訪問時間而非最后修改時間來判斷數據的冷熱。按以往,用戶只能手動通過日志分析或其他方式進行數據冷熱的分層管理。但如果選用基于最后一次訪問時間的生命周期規則,則可實現由服務端根據最后訪問時間來自動識別冷熱數據并實現數據分層存儲。
根據以上場景描述,將數據分類存儲在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.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.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"; // 創建OSSClient實例。 OSS ossClient = new OSSClientBuilder().build(endpoint, credentialsProvider); 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.ProviderAuth(EnvironmentVariableCredentialsProvider()) # 填寫Bucket所在地域對應的Endpoint。以華東1(杭州)為例,Endpoint填寫為https://oss-cn-hangzhou.aliyuncs.com。 # 填寫Bucket名稱,例如examplebucket。 bucket = oss2.Bucket(auth, 'https://oss-cn-hangzhou.aliyuncs.com', 'examplebucket') # 開啟Bucket的訪問跟蹤狀態。Bucket開啟訪問跟蹤狀態后,如果需要修改Bucket的訪問跟蹤狀態為Disabled,請確保Bucket不存在基于LastAccessTime匹配規則的生命周期規則。 bucket.put_bucket_access_monitor("Enabled")
Go
package main import ( "fmt" "github.com/aliyun/aliyun-oss-go-sdk/oss" "os" ) func main() { /// 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量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) } // 填寫Bucket名稱。 bucketName := "examplebucket" // 為examplebucket開啟訪問跟蹤。 access := oss.PutBucketAccessMonitor{ Status: "Enabled", } err = client.PutBucketAccessMonitor(bucketName,access) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } fmt.Println("put bucket access monitor success!") }
為前綴
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實例。 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 ( "fmt" "github.com/aliyun/aliyun-oss-go-sdk/oss" "os" ) func main() { // yourBucketName填寫Bucket名稱。 bucketName := "examplebucket" // 從環境變量中獲取訪問憑證。運行本代碼示例之前,請確保已設置環境變量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("https://oss-cn-hangzhou.aliyuncs.com", "", "", oss.SetCredentialsProvider(&provider)) if err != nil { fmt.Println("Error:", err) os.Exit(-1) } isTrue := true isFalse := false // 在生命周期規則1中指定前綴為data/的所有文件在距離最后一次訪問時間200天后轉為低頻訪問類型。且再次訪問前綴為data/的文件時,這些文件仍保留為低頻訪問類型。 rule1 := oss.LifecycleRule{ ID: "rule1", Prefix: "data/", Status: "Enabled", Transitions: []oss.LifecycleTransition{ { Days: 200, StorageClass: oss.StorageIA, IsAccessTime: &isTrue, ReturnToStdWhenVisit: &isFalse, }, }, } // 在生命周期規則2中指定前綴為log/的所有文件在距離最后一次訪問時間120天后轉為低頻訪問類型。且再次訪問前綴為log/的文件時,這些文件仍保留為低頻訪問類型。 rule2 := oss.LifecycleRule{ ID: "rule2", Prefix: "log/", Status: "Enabled", Transitions: []oss.LifecycleTransition{ { Days: 120, StorageClass: oss.StorageIA, IsAccessTime: &isTrue, ReturnToStdWhenVisit: &isFalse, }, { // 同一規則中指定前綴為log/的所有文件在距離最后一次訪問時間250天后轉為歸檔類型。 Days: 250, StorageClass: oss.StorageArchive, IsAccessTime: &isTrue, ReturnToStdWhenVisit: &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
開啟訪問跟蹤。
在本地config1.xml文件中配置開啟訪問跟蹤。
<?xml version="1.0" encoding="UTF-8"?> <AccessMonitorConfiguration> <Status>Enabled</Status> </AccessMonitorConfiguration>
為目標Bucket設置訪問跟蹤狀態。
ossutil access-monitor --method put oss://examplebucket/ config.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。