Java SDK 可更新全局表中单个物理表副本的写入权限或主资质。
前提条件
安装Tablestore Java SDK并初始化客户端。更新全局表副本配置需使用 5.17.7 及以上版本。
功能说明
调用 updateGlobalTable 方法更新全局表中的单个物理表副本。每次请求通过地域、实例和表名称定位副本,并至少设置 writable 或 primaryEligible 中的一项:writable 适用于主备模式和多活模式,用于控制副本是否接受写入;primaryEligible 仅适用于主备模式,用于将副本标记为具备主资质。
public UpdateGlobalTableResponse updateGlobalTable(UpdateGlobalTableRequest request) throws TableStoreException, ClientException
主备切换过程中,在关闭原主副本的写入权限前,原主副本和目标副本会同时可写,存在数据不一致风险。请先确认数据同步完成,并将应用写入 Endpoint 切换到目标副本,再尽快关闭原主副本的写入权限。完整操作流程请参见全局表。
以下示例将北京地域的备副本标记为可写并具备主资质。数据同步和应用写入链路准备完成后,关闭杭州地域原主副本的写入权限,完成主副本切换。
String globalTableId = "gt-01234567-89ab-cdef-0123-456789abcdef";
String globalTableName = "example_table";
GlobalTableTypes.UpdatePhyTable newPrimary =
new GlobalTableTypes.UpdatePhyTable(
"cn-beijing", "example-replica-instance", globalTableName);
newPrimary.setWritable(true);
newPrimary.setPrimaryEligible(true);
UpdateGlobalTableResponse prepareResponse = client.updateGlobalTable(
new UpdateGlobalTableRequest(globalTableId, globalTableName, newPrimary));
System.out.println("Prepare request ID: " + prepareResponse.getRequestId());
// 确认数据同步和应用写入链路准备完成后再继续。
GlobalTableTypes.UpdatePhyTable oldPrimary =
new GlobalTableTypes.UpdatePhyTable(
"cn-hangzhou", "example-primary-instance", globalTableName);
oldPrimary.setWritable(false);
UpdateGlobalTableResponse completeResponse = client.updateGlobalTable(
new UpdateGlobalTableRequest(globalTableId, globalTableName, oldPrimary));
System.out.println("Complete request ID: " + completeResponse.getRequestId());
请求成功后,查询全局表信息,确认目标副本已成为可写的主副本,原主副本已成为只读的备副本。
参数说明
UpdateGlobalTableRequest 包含以下参数。
|
名称 |
类型 |
说明 |
|
globalTableId(必选) |
String |
全局表 ID。未记录 ID 时,可以按物理表定位全局表,具体用法请参见查询全局表信息。 |
|
globalTableName(必选) |
String |
全局表名称,必须与基础表名称相同。 |
|
phyTable(必选) |
GlobalTableTypes.UpdatePhyTable |
要更新的物理表副本及其配置。每次请求只能更新一个副本。 |
物理表副本配置
phyTable 的类型为 GlobalTableTypes.UpdatePhyTable,包含以下参数。writable 和 primaryEligible 单独均为可选参数,但必须至少设置一项,否则服务端返回 OTSParameterInvalid。
|
名称 |
类型 |
说明 |
|
regionId(必选) |
String |
要更新的物理表所在地域的 ID,例如 |
|
instanceName(必选) |
String |
要更新的物理表所属实例的名称。 |
|
tableName(必选) |
String |
要更新的物理表名称。全局表中的物理表名称相同。 |
|
writable(可选) |
Boolean |
物理表是否接受写入。设置为 |
|
primaryEligible(可选) |
Boolean |
主备模式下,物理表是否具备主资质。将备副本设置为可写且具备主资质后,其角色变为 |