建立全域表

更新時間:
Copy as MD

通過 Java SDK調用 createGlobalTable 介面,在Table Store中建立跨地區全域表,實現資料多地區複製。

使用說明

建立全域表前,先根據業務情境選擇服務模式:

  • 主備模式PRIMARY_SECONDARY):主地區可讀寫,備地區唯讀。資料由主地區單向同步至備地區。適用於本地讀取、容災備份、異地熱備情境。

  • 多活模式PEER_TO_PEER):所有地區均可讀寫。基於最後寫入者獲勝原則(LWW)按行或列解決寫入衝突。適用於多地區低延遲讀寫情境。

建立請求成功後,系統以非同步方式同步資料。調用 DescribeGlobalTable 查看狀態,返回 active 時表示全域表建立完成。

前提條件

  • 在源地區和目標地區分別建立執行個體。

  • 在源地區建立資料表,並按以下要求配置:資料生命週期(TTL)設為 -1(永不到期)、最大版本數設為 1、最大版本偏差設為無限制(Integer.MAX_VALUE)、開啟行版本(updateFullRow 設為 True)。

    重要

    開啟行版本後存在以下限制:

    • 單行資料最多支援 256 列。

    • 寫入資料時不支援手動指定版本號碼,版本號碼由系統自動產生。

    • 執行 Update 操作時,系統需先讀取當前行版本,因此會帶來少量額外讀取負載。

  • 初始化用戶端

    重要

    使用RAM使用者的AccessKey初始化用戶端時,需確保該RAM使用者具有建立全域表的相關許可權。具體 Action 定義請參見Table StoreAPI類型

方法說明

public CreateGlobalTableResponse createGlobalTable(CreateGlobalTableRequest createGlobalTableRequest) throws TableStoreException, ClientException

CreateGlobalTableRequest 參數說明

  • baseTable(必選)BaseTable:基礎資料表資訊,寫操作預設作用於基礎資料表。包含以下參數。

    名稱

    類型

    說明

    regionId(必選)

    String

    地區 ID,例如 cn-hangzhou。

    instanceName(必選)

    String

    執行個體名稱。

    tableName(必選)

    String

    基礎資料表名稱,同時也是全域表名稱。

  • placements(必選)List<Placement>:關聯表的分布位置配置列表。包含以下參數。

    名稱

    類型

    說明

    regionId(必選)

    String

    地區 ID,例如 cn-beijing。

    instanceName(必選)

    String

    執行個體名稱。

    writable(必選)

    boolean

    是否接受寫操作。預設值為 false。主備模式下設為 false(備地區唯讀);多活模式下按需設為 true(允許該地區寫入)。

  • syncMode(必選)SyncMode:資料同步模式。目前僅支援ROW(行級同步)。

  • serveMode(可選)ServeMode:服務模式。取值範圍:

    • PRIMARY_SECONDARY(預設值):主備模式。主地區可讀寫,備地區唯讀。資料由主地區同步至備地區。適用於本地讀取、容災備份、異地熱備情境。

    • PEER_TO_PEER:多活模式。所有地區均可讀寫。基於最後寫入者獲勝原則(LWW)按行或列解決衝突。適用於多地區低延遲讀寫情境。

樣本

建立主備模式的全域表

private static void createGlobalTableExample(SyncClient client){
    // 構造請求
    CreateGlobalTableRequest req = new CreateGlobalTableRequest(
            // 基礎資料表配置,表必須已存在
            new GlobalTableTypes.BaseTable(
                    // 基礎資料表所在地區 ID
                    "cn-hangzhou",
                    // 基礎資料表所在執行個體名稱
                    "i-gt-test",
                    // 基礎資料表名稱(同時也是全域表名稱)
                    "t-gt-test-1"
            ),
            // 資料同步模式:目前僅支援 ROW(行級同步)
            GlobalTableTypes.SyncMode.ROW
    );

    // 添加關聯表(可添加多個)
    req.addPlacement(new GlobalTableTypes.Placement(
            // 關聯表所在地區 ID
            "cn-shanghai",
            // 關聯表所在執行個體名稱,執行個體必須已存在
            // 執行個體中不能存在與基礎資料表同名的表,系統會自動建立
            "i-dest-test",
            // false:備地區唯讀,主備模式下固定設為 false
            false
    ));

    // 設定服務模式為主備模式(PRIMARY_SECONDARY)
    req.setServeMode(GlobalTableTypes.ServeMode.PRIMARY_SECONDARY);

    // 發起請求
    CreateGlobalTableResponse createResp = client.createGlobalTable(req);

    // 列印響應結果
    System.out.println("Global table creation initiated.");
    System.out.println("RequestId: " + createResp.getRequestId());
    System.out.println("GlobalTableId: " + createResp.getGlobalTableId());
}

建立多活模式的全域表

private static void createGlobalTableExample(SyncClient client){
    // 構造請求
    CreateGlobalTableRequest req = new CreateGlobalTableRequest(
            // 基礎資料表配置,表必須已存在
            new GlobalTableTypes.BaseTable(
                    // 基礎資料表所在地區 ID
                    "cn-hangzhou",
                    // 基礎資料表所在執行個體名稱
                    "i-gt-test",
                    // 基礎資料表名稱(同時也是全域表名稱)
                    "t-gt-test-1"
            ),
            // 資料同步模式:目前僅支援 ROW(行級同步)
            GlobalTableTypes.SyncMode.ROW
    );

    // 添加關聯表(可添加多個)
    req.addPlacement(new GlobalTableTypes.Placement(
            // 關聯表所在地區 ID
            "cn-shanghai",
            // 關聯表所在執行個體名稱,執行個體必須已存在
            // 執行個體中不能存在與基礎資料表同名的表,系統會自動建立
            "i-dest-test",
            // true:該地區允許寫入,多活模式下按需設定
            true
    ));

    // 設定服務模式為多活模式(PEER_TO_PEER)
    req.setServeMode(GlobalTableTypes.ServeMode.PEER_TO_PEER);

    // 發起請求
    CreateGlobalTableResponse createResp = client.createGlobalTable(req);

    // 列印響應結果
    System.out.println("Global table creation initiated.");
    System.out.println("RequestId: " + createResp.getRequestId());
    System.out.println("GlobalTableId: " + createResp.getGlobalTableId());
}