创建全局表

更新时间:
复制 MD 格式

Java SDK 可创建主备或多活模式的全局表,在多个地域的数据表之间同步数据。

前提条件

  • 安装Tablestore Java SDK并初始化客户端。创建全局表需使用 5.17.7 及以上版本。

  • 源地域和目标地域均已创建 Tablestore 实例。

  • 源地域中已创建基础表,且数据生命周期(TTL)为 -1、最大版本数为 1、最大版本偏差为 Integer.MAX_VALUEupdateFullRowtrue

功能说明

调用 createGlobalTable 方法,以已有数据表为基础创建跨地域全局表。全局表支持主备模式和多活模式。创建时,服务会在目标实例中自动创建与基础表同名的副本表,因此目标实例中不能已有同名数据表。

public CreateGlobalTableResponse createGlobalTable(CreateGlobalTableRequest createGlobalTableRequest) throws TableStoreException, ClientException
说明

createGlobalTable 是异步接口。请求成功仅表示创建任务已发起。调用 describeGlobalTable 查询状态,当 statusACTIVE 时,全局表创建完成。

重要

开启整行更新(updateFullRowtrue)后存在以下限制:

  • 单行数据最多支持 256 列。

  • 写入数据时不能手动指定版本号,版本号由服务自动生成。

  • 执行 UpdateRow 操作时,服务会先读取当前行,因此会增加读负载。

以下示例分别创建主备模式和多活模式的全局表。

主备模式

以下示例创建主备模式的全局表。基础表可读写,副本表只读。省略 serveMode 时使用默认值 PRIMARY_SECONDARY

GlobalTableTypes.BaseTable baseTable = new GlobalTableTypes.BaseTable(
        "cn-hangzhou", "source-instance", "example_table");
CreateGlobalTableRequest request = new CreateGlobalTableRequest(
        baseTable, GlobalTableTypes.SyncMode.ROW);
request.addPlacement(new GlobalTableTypes.Placement(
        "cn-beijing", "replica-instance", false));

CreateGlobalTableResponse response = client.createGlobalTable(request);
System.out.println("GlobalTableId: " + response.getGlobalTableId());
System.out.println("Status: " + response.getStatus());

多活模式

以下示例创建多活模式的全局表。将目标副本设置为可写,并将 serveMode 设置为 PEER_TO_PEER,使基础表和副本表均可接受写入。

GlobalTableTypes.BaseTable baseTable = new GlobalTableTypes.BaseTable(
        "cn-hangzhou", "source-instance", "example_table");
CreateGlobalTableRequest request = new CreateGlobalTableRequest(
        baseTable, GlobalTableTypes.SyncMode.ROW);
request.addPlacement(new GlobalTableTypes.Placement(
        "cn-beijing", "replica-instance", true));
request.setServeMode(GlobalTableTypes.ServeMode.PEER_TO_PEER);

CreateGlobalTableResponse response = client.createGlobalTable(request);
System.out.println("GlobalTableId: " + response.getGlobalTableId());
System.out.println("Status: " + response.getStatus());

参数说明

CreateGlobalTableRequest 包含以下参数。

名称

类型

说明

baseTable(必选)

BaseTable

基础表信息。基础表是创建全局表时已存在的数据表。

placements(必选)

List<Placement>

副本位置列表。至少添加一个目标地域的副本位置。

syncMode(必选)

SyncMode

数据同步模式。当前仅支持 ROW,表示按行同步。

serveMode(可选)

ServeMode

服务模式。取值范围:

  • PRIMARY_SECONDARY:主备模式,默认值。基础表可读写,副本表只读,数据从基础表所在地域同步到副本所在地域。

  • PEER_TO_PEER:多活模式,支持多个可写副本。写入冲突按最后写入者获胜(LWW)原则以行或列为粒度处理。

基础表

baseTable 的类型为 BaseTable,包含以下参数。

名称

类型

说明

regionId(必选)

String

基础表所在地域的 ID,例如 cn-hangzhou

instanceName(必选)

String

基础表所属实例的名称。

tableName(必选)

String

基础表名称,也是全局表名称。

副本位置

placements[] 中每个元素的类型为 Placement,包含以下参数。

名称

类型

说明

regionId(必选)

String

副本所在地域的 ID,例如 cn-beijing

instanceName(必选)

String

副本所属实例的名称。

writable(必选)

boolean

副本是否接受写操作。主备模式下设置为 false;多活模式下根据该副本是否需要接受写入设置。

返回值

CreateGlobalTableResponse 包含以下与创建结果直接相关的字段。

字段

类型

说明

globalTableId

String

通过 getGlobalTableId() 获取全局表 ID。查询、绑定、更新或解绑全局表时需要使用该 ID。

status

GlobalTableStatus

通过 getStatus() 获取当前状态。创建任务发起后,可调用 describeGlobalTable 查询状态,直到状态变为 ACTIVE