全部產品
Search
文件中心

Tablestore:資料版本和生命週期

更新時間:Nov 21, 2024

使用資料版本以及資料生命週期(TTL)功能,您可以有效管理資料,減少資料存放區空間,降低儲存成本。

最大版本數

最大版本數(Max Versions)表示資料表中的屬性列能夠保留資料的最大版本個數。當屬性列中資料的版本個數超過設定的最大版本數時,系統會自動非同步刪除較早版本的資料。

重要

當前Tablestore未限制最大版本數。但是出於效能與易用性考慮,建議控製版本數在500以內。

建立資料表時,如果未設定最大版本數,則系統會使用預設值1,您也可以自訂屬性列的最大版本數。建立資料表後,您可以通過UpdateTable介面修改資料表的最大版本數。

超過最大版本數的資料版本為無效資料,即使系統還未刪除資料,使用者已無法讀取對應資料。

  • 當調小最大版本數時,如果資料版本個數超過新設的最大版本數,系統會非同步刪除較早版本的資料。

  • 當調大最大版本數時,如果系統還未刪除超過舊的最大版本數的對應版本資料,且對應版本資料在新設的最大版本數範圍中,則對應版本的資料可以重新讀取。

版本號碼

為資料表配置最大版本數後,當您每次更新屬性列的值時,Tablestore均會為該值產生一個新版本,版本的值即為版本號碼(時間戳記),單位為毫秒。

在屬性列中寫入資料時,如果未設定版本號碼,則系統會自動產生資料的版本號碼,您也可以自訂資料的版本號碼。 由於版本號碼的單位為毫秒,在進行TTL比較和有效版本偏差計算時,需要除以1000換算成秒。

  • 當由系統自動產生資料的版本號碼時,系統預設將目前時間的毫秒單位時間戳記(從1970-01-01 00:00:00 UTC計算起的毫秒數)作為屬性列值的版本號碼。

  • 當自訂資料的版本號碼時,屬性列值的版本號碼需要為64位的毫秒單位時間戳記且在有效版本範圍內。

使用版本號碼,您可以實現以下功能:

  • 資料生命週期(TTL)

    版本號碼可以用於定義資料表中屬性列值的生命週期。當屬性列中資料的保留時間長度超過設定的TTL後,系統會自動非同步清理對應版本號碼的資料。

    例如資料的版本號碼為1468944000000(即2016-07-20 00:00:00 UTC+8),如果設定資料表的TTL為86400(一天),則該版本號碼的資料會在2016-07-21 00:00:00 UTC+8到期,系統會自動非同步刪除該版本號碼的資料。

  • 每行資料的版本讀取

    讀取行資料時,您可以指定每列最多讀取的版本個數或者讀取的版本號碼範圍。更多資訊,請參見讀取資料

資料生命週期

資料生命週期是資料表的一個屬性,即資料的儲存時間,單位為秒。當屬性列中資料的保留時間超過設定的TTL時,系統會自動非同步清理超過該屬性列的資料。如果一行中所有屬性列中資料的保留時間均超過了TTL,則系統會自動非同步清理該行資料。

例如資料表的TTL設定為86400(一天),在2016-07-21 00:00:00 UTC+8時,資料表中所有版本號碼小於1468944000000(除以1000換算成秒後即2016-07-20 00:00:00 UTC+8)的屬性列資料均會到期,系統會自動非同步清理對應到期資料。

建立資料表時,如果未設定TTL,則系統會使用預設值-1(表示資料永不到期),您也可以自訂TTL。建立資料表後,您可以通過UpdateTable介面修改TTL。

重要

資料表的TTL和二級索引的TTL是獨立的,且資料表的TTL必須大於等於二級索引的TTL。當資料表上存在二級索引且要修改資料表的TTL時,請根據實際情況進行操作。

  • 如果待設定的資料表的TTL小於其二級索引的TTL,請先使用SDK調用UpdateTable介面將二級索引的TTL修改為不大於目標值,再將資料表的TTL修改為目標值。

  • 如果待設定的資料表的TTL大於或等於二級索引的TTL,請直接將資料表的TTL修改為目標值。

超過TTL的到期資料為無效資料,即使系統還未刪除資料,使用者已無法讀取對應資料。

  • 當調小TTL時,資料表中可能會有資料到期,系統會非同步刪除對應到期資料。

  • 當調大TTL時,如果系統還未刪除在舊的TTL之外以前版本的資料,且對應版本資料在新設的TTL中,則對應版本的資料可以重新讀取。

有效版本偏差

為了避免寫入資料時,自訂的時間戳記與目前時間的偏差超過了資料表的TTL,導致寫入的資料立即到期的問題,您可以設定有效版本偏差。

有效版本偏差(Max Version Offset)是指定的資料版本號碼與系統目前時間偏差的允許最大值,單位為秒。有效版本偏差為正整數,可以大於1970-01-01 00:00:00 UTC時間到目前時間的秒數。

為了保證資料寫入成功,在寫入資料時系統會檢查屬性列資料的版本號碼。屬性列資料的有效版本範圍為[max{資料寫入時間-有效版本偏差,資料寫入時間-資料生命週期},資料寫入時間+有效版本偏差)。只有當屬性列資料的版本號碼(單位為毫秒)除以1000換算為秒後在有效版本範圍時,才能成功寫入資料。

例如當資料表的有效版本偏差為86400(一天),在2016-07-21 00:00:00 UTC+8時,只能寫入版本號碼大於1468944000000(換算成秒後即2016-07-20 00:00:00 UTC+8)並且小於1469116800000(換算成秒後即2016-07-22 00:00:00 UTC+8)的資料。當某一行的某個屬性列資料的版本號碼為1468943999000(換算成秒後即2016-07-19 23:59:59 UTC+8)時,該行資料寫入失敗。

建立資料表時,如果未設定有效版本偏差,則系統會使用預設值86400,您也可以自訂資料有效版本偏差。建立資料表後,您可以通過UpdateTable介面修改有效版本偏差。

使用方式

建立資料表時,您可以配置最大版本數、資料生命週期等參數。您也可以在建立資料表後修改資料版本、資料生命週期等。此處以建立資料表後修改相應配置為例介紹。

說明

關於在建立資料表時進行資料版本或者資料生命週期配置的具體操作,請參見資料表操作

使用控制台

您可以使用控制台修改表的最大版本數、資料生命週期、有效版本偏差等。

  1. 登入Table Store控制台

  2. 概覽頁面,單擊執行個體操作列的執行個體管理

  3. 執行個體詳情頁簽的資料表列表地區,單擊資料表名稱。

  4. 基本詳情頁簽的基本資料地區,單擊修改表屬性

  5. 修改表屬性對話方塊,根據下表說明修改相應配置資訊。

    參數

    描述

    資料生命週期

    資料表中資料的儲存時間。當資料的儲存時間超過設定的資料生命週期時,系統會自動清理超過資料生命週期的資料。單位為秒。

    取值:大於等於86400秒(一天)或-1(資料永不到期)。

    重要

    使用索引時,資料生命週期必須滿足如下條件中的任意一個。

    • 資料表的資料生命週期為-1(資料永不到期)。

    • 資料表的資料生命週期不為-1時,資料表為禁止更新狀態。

      如果已為資料表建立索引,則需要修改是否允許更新後,再修改資料生命週期。

    最大版本數

    資料表中的屬性列能夠保留資料的最大版本個數。當屬性列資料的版本個數超過設定的最大版本數時,系統會自動刪除較早版本的資料。

    取值必須為非0整數。

    重要

    使用索引時,最大版本數必須設定為1。如果已為資料表建立索引,則無法修改最大版本數。

    資料有效版本偏差

    指定的資料版本號碼與系統目前時間偏差的允許最大值,單位為秒。有效版本偏差為正整數,可以大於1970-01-01 00:00:00 UTC時間到目前時間的秒數。

    只有當寫入資料所有列的版本號碼與寫入時時間的差值在資料有效版本偏差範圍內,資料才能成功寫入。

    屬性列的有效版本範圍為[max{資料寫入時間-有效版本偏差,資料寫入時間-資料生命週期},資料寫入時間+有效版本偏差)

    是否允許更新

    是否允許通過UpdateRow更新寫入資料。預設值為,表示允許通過UpdateRow更新寫入資料。

    如果已為資料表建立索引,當要修改資料生命週期時,您需要先設定是否允許更新再進行修改。

    重要

    當要使用多元索引生命週期功能時,您必須設定此參數為,即不允許通過UpdateRow更新寫入資料。關於多元索引生命週期的更多資訊,請參見生命週期管理

  6. 單擊確定

使用命令列工具CLI

您可以使用命令列工具執行如下命令進行配置修改。

執行alter命令修改表的最大版本數或者資料生命週期。更多資訊,請參見更新表

以下樣本用於修改mytable資料表的資料生命週期為86400秒(即1天),最大版本數為1。

alter -t mytable --ttl 86400 --version 1

使用SDK

您可以使用Java SDKGo SDKPython SDKNode.js SDK.NET SDKPHP SDK更新表的最大版本數、資料生命週期、有效版本偏差等屬性。此處以Java SDK為例介紹更新表的使用。

以下樣本用於更新資料表的最大版本數為5、資料生命週期為-1且有效版本偏差為86400。

private static void updateTable(SyncClient client) {
    //資料的到期時間,單位為秒,-1表示資料永不到期。
    int timeToLive = -1;
    //將最大版本數更新為5。
    int maxVersions = 5; 
    //將有效版本偏差更新為86400。單位為秒。
    int maxTimeDeviation=86400;
    TableOptions tableOptions = new TableOptions(timeToLive, maxVersions,maxTimeDeviation);
    //設定表名稱。
    UpdateTableRequest request = new UpdateTableRequest("<TABLE_NAME>");
    request.setTableOptionsForUpdate(tableOptions);
    client.updateTable(request);
}

計費說明

  • 使用資料多版本時,會產生基於版本號碼與各個版本資料的額外儲存費用。

  • 配置生命週期管理清理資料,不會有額外的資料清理費用。但開啟生命週期管理功能後,會在各個屬性列增加時間戳記作為的版本號碼資料,有額外的儲存量產生。

更多資訊,請參見資料存放區量

常見問題

修改資料表生命週期時報錯[table ttl] must be bigger than or equal search index ttl