Tablestore でグローバルテーブルを作成し、リージョン間でデータをレプリケートすることで、高可用性と低レイテンシーでのアクセスを実現します。
注意事項
グローバルテーブルを作成する前に、サービスモードを選択してください。
プライマリセカンダリモード (
PRIMARY_SECONDARY):プライマリリージョンが読み取りおよび書き込みを処理します。セカンダリリージョンは読み取り専用です。データはプライマリリージョンからセカンダリリージョンへ同期されます。このモードは、ローカル読み取り、ディザスタリカバリ、ホットスタンバイに適しています。マルチアクティブモード (
PEER_TO_PEER):すべてのリージョンが読み取りおよび書き込みを処理します。競合は行または列レベルで「最後に書き込んだものが勝つ (LWW)」方式により解決され、最新のタイムスタンプを持つバージョンが保持されます。このモードは、複数リージョンにわたる低レイテンシーの読み取りおよび書き込みに適しています。
作成リクエストが成功すると、システムは非同期でリージョン間のデータをレプリケートします。DescribeGlobalTable を呼び出してステータスをモニターしてください。グローバルテーブルのステータスが active に変化した時点で、利用可能になります。
前提条件
作業を開始する前に、以下の要件を満たしていることを確認してください。
ソースリージョンおよびターゲットリージョンの両方にインスタンスが作成済みであること
-
ソースリージョンに以下の構成を持つテーブルが存在すること:生存時間 (TTL) が
-1(データが有効期限切れにならない)、バージョンの最大数が1、最大バージョンオフセットが無制限 (Integer.MAX_VALUE)、行バージョン管理が有効 (updateFullRowがTrueに設定)重要行バージョン管理を有効にすると、以下の制限が適用されます。
1 行あたり最大 256 列まで含めることができます。
バージョン番号はシステムによって自動的に生成されます。データ書き込み時に手動で指定することはできません。
各
Update操作では、まず現在の行バージョンが読み取られるため、読み取り負荷が若干増加します。
-
重要
Resource Access Management (RAM) ユーザーの AccessKey を使用してクライアントを初期化する場合、その RAM ユーザーにはグローバルテーブルを作成する権限が必要です。必要な
Action定義については、「Tablestore API オペレーション」をご参照ください。
メソッド
public CreateGlobalTableResponse createGlobalTable(CreateGlobalTableRequest createGlobalTableRequest) throws TableStoreException, ClientException
例
プライマリセカンダリモードでのグローバルテーブルの作成
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());
}