通过 Java SDK调用 createGlobalTable 接口,在表格存储中创建跨地域全局表,实现数据多地域复制。
使用说明
创建全局表前,先根据业务场景选择服务模式:
主备模式(
PRIMARY_SECONDARY):主地域可读写,备地域只读。数据由主地域单向同步至备地域。适用于本地读取、容灾备份、异地热备场景。多活模式(
PEER_TO_PEER):所有地域均可读写。基于最后写入者获胜原则(LWW)按行或列解决写入冲突。适用于多地域低延迟读写场景。
创建请求成功后,系统以异步方式同步数据。调用 DescribeGlobalTable 查看状态,返回 active 时表示全局表创建完成。
前提条件
在源地域和目标地域分别创建实例。
-
在源地域创建数据表,并按以下要求配置:数据生命周期(TTL)设为
-1(永不过期)、最大版本数设为1、最大版本偏差设为无限制(Integer.MAX_VALUE)、开启行版本(updateFullRow设为True)。重要开启行版本后存在以下限制:
单行数据最多支持 256 列。
写入数据时不支持手动指定版本号,版本号由系统自动生成。
执行
Update操作时,系统需先读取当前行版本,因此会带来少量额外读取负载。
-
重要
使用RAM用户的AccessKey初始化客户端时,需确保该RAM用户具有创建全局表的相关权限。具体 Action 定义请参见表格存储的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
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());
}