すべてのプロダクト
Search
ドキュメントセンター

Tablestore:グローバルテーブルの作成

最終更新日:Apr 30, 2026

Tablestore でグローバルテーブルを作成し、リージョン間でデータをレプリケートすることで、高可用性と低レイテンシーでのアクセスを実現します。

注意事項

グローバルテーブルを作成する前に、サービスモードを選択してください。

  • プライマリセカンダリモード (PRIMARY_SECONDARY):プライマリリージョンが読み取りおよび書き込みを処理します。セカンダリリージョンは読み取り専用です。データはプライマリリージョンからセカンダリリージョンへ同期されます。このモードは、ローカル読み取り、ディザスタリカバリ、ホットスタンバイに適しています。

  • マルチアクティブモード (PEER_TO_PEER):すべてのリージョンが読み取りおよび書き込みを処理します。競合は行または列レベルで「最後に書き込んだものが勝つ (LWW)」方式により解決され、最新のタイムスタンプを持つバージョンが保持されます。このモードは、複数リージョンにわたる低レイテンシーの読み取りおよび書き込みに適しています。

作成リクエストが成功すると、システムは非同期でリージョン間のデータをレプリケートします。DescribeGlobalTable を呼び出してステータスをモニターしてください。グローバルテーブルのステータスが active に変化した時点で、利用可能になります。

前提条件

作業を開始する前に、以下の要件を満たしていることを確認してください。

  • ソースリージョンおよびターゲットリージョンの両方にインスタンスが作成済みであること

  • ソースリージョンに以下の構成を持つテーブルが存在すること:生存時間 (TTL) が -1(データが有効期限切れにならない)、バージョンの最大数が 1、最大バージョンオフセットが無制限 (Integer.MAX_VALUE)、行バージョン管理が有効 (updateFullRowTrue に設定)

    重要

    行バージョン管理を有効にすると、以下の制限が適用されます。

    • 1 行あたり最大 256 列まで含めることができます。

    • バージョン番号はシステムによって自動的に生成されます。データ書き込み時に手動で指定することはできません。

    • Update 操作では、まず現在の行バージョンが読み取られるため、読み取り負荷が若干増加します。

  • クライアントが設定済みであること

    重要

    Resource Access Management (RAM) ユーザーの AccessKey を使用してクライアントを初期化する場合、その RAM ユーザーにはグローバルテーブルを作成する権限が必要です。必要な Action 定義については、「Tablestore API オペレーション」をご参照ください。

メソッド

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
    ));

    // サービスモードをプライマリセカンダリ (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());
}