接口设计
存在多个灾备恢复组(drsp),每个group有多个节点,且都是邻接表需要将任务存储到数据库,
每个任务还有config.ini 和 主版本信息等。
前后端交互提供如下接口--创建组,查询,删除,更新。
根据数据库设计 和 java部署代码实现,完善和修复接口设计。
- drsp_group(DRSP组表)
| 字段名 | 类型 | 索引 | 允许空 | 默认值 | 备注 |
|---|---|---|---|---|---|
| drsp_group_id | VARCHAR(64) | PK | NO | - | DRSP组唯一ID,SI分配 |
| node_count | INT | - | NO | 0 | 组内节点总数 |
| status | VARCHAR(32) | IDX | NO | 'CREATING' | CREATING/ACTIVE/SWITCHING/FAULT/DELETING |
| config_version | VARCHAR(16) | - | YES | 'v1' | 当前使用的XML流程版本 |
| source_type | VARCHAR(32) | - | NO | 'SI_CREATED' | SI_CREATED=SI创建, RDB_IMPORTED=从RDB导入 |
| created_at | DATETIME | - | NO | CURRENT_TIMESTAMP | 创建时间 |
| updated_at | DATETIME | - | NO | CURRENT_TIMESTAMP | 更新时间(ON UPDATE) |
- drsp_node(DRSP节点表)
| 字段名 | 类型 | 索引 | 允许空 | 默认值 | 备注 |
|---|---|---|---|---|---|
| id | BIGINT | PK AUTO_INCREMENT | NO | - | 自增主键 |
| drsp_group_id | VARCHAR(64) | IDX, FK | NO | - | 所属DRSP组 |
| product_id | INT | IDX | NO | - | GDB产品ID |
| gdb_name | VARCHAR(128) | - | YES | - | GDB显示名称 |
| gdb_tag | VARCHAR(128) | IDX | NO | - | GDB标签(goldendb_tag) |
| cluster_id | INT | IDX | NO | - | 租户ID |
| cluster_name | VARCHAR(128) | - | YES | - | 租户名称 |
| role | VARCHAR(16) | IDX | NO | - | PRIMARY/STANDBY/CASCADE |
| fault_status | VARCHAR(16) | - | NO | 'NONE' | NONE/FAULT |
| created_at | DATETIME | - | NO | CURRENT_TIMESTAMP | |
| updated_at | DATETIME | - | NO | CURRENT_TIMESTAMP |
- drsp_edge(DRSP拓扑边表)
| 字段名 | 类型 | 索引 | 允许空 | 默认值 | 备注 |
|---|---|---|---|---|---|
| id | BIGINT | PK AUTO_INCREMENT | NO | - | |
| drsp_group_id | VARCHAR(64) | IDX, FK | NO | - | 所属DRSP组 |
| source_node_id | BIGINT | IDX, FK | NO | - | 源节点 |
| target_node_id | BIGINT | IDX, FK | NO | - | 目标节点 |
| source_cluster_id | INT | - | NO | - | 冗余:源租户ID |
| target_cluster_id | INT | - | NO | - | 冗余:目标租户ID |
| created_at | DATETIME | - | NO | CURRENT_TIMESTAMP |
List<DrspChain> getDrsp(GdbDrspDto dto);
public class DrspChain {
Set<DrspNode> nodes = new HashSet<>();
List<DrspRelation> relations = new ArrayList<>();
}
@Data
public class DrspNode {
private int productId;
private String productName;
private String gdbTag;
private int clusterId;
private String clusterName;
/* private String managerIp;
private Integer managerPort; private String syncStatus; private String updateTime;*/
public DrspNode() {
}
public DrspNode(String gdbTag, String clusterName) {
this.gdbTag = gdbTag;
this.clusterName = clusterName;
}
}
@Data
public class DrspRelation {
private DrspNode source;
private DrspNode target;
private int relayDelaySeconds;
public DrspRelation(DrspNode source, DrspNode target, int relayDelaySeconds) {
this.source = source;
this.target = target;
this.relayDelaySeconds = relayDelaySeconds;
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
DrspRelation that = (DrspRelation) o;
return Objects.equals(source, that.source) &&
Objects.equals(target, that.target);
}
@Override
public int hashCode() {
return Objects.hash(source, target);
}
}
查询DRSP组列表
路径:GET /api/dbaas/drsp/groups/list
功能:分页查询所有DRSP组,每个节点一行记录。当传入groupId时返回该组的详情。
请求参数(Query):
| 参数 | 类型 | 必填 | 说明 |
|---|---|---|---|
| groupId | String | 否 | 指定时返回该组详情,否则返回列表 |
| page | Integer | 否 | 页码,默认1 |
| pageSize | Integer | 否 | 每页条数,默认20 |
| sortField | String | 否 | 排序字段:drspGroupId / role / syncStatus |
| sort | String | 否 | ASC / DESC |
响应体:
{
"code": 200,
"message": "success",
"data": {
"total": 12,
"list": [
]
}
}
注意事项:
- 同一个DRSP组的多个节点各占一行,
drspGroupId相同 availableActions由后端根据角色、工作模式、同步状态动态计算(参见3.3.5操作按钮与角色关系表)sourceIdentifier格式为gdb_tag.cluster_id,仅灾备/级联节点有值syncStatus/syncDelay/replayDelay仅灾备节点有值
创建DRSP关系
路径:POST /api/dbaas/drsp/deploy
功能:创建DRSP灾备关系。前端选择源端和灾备租户、配置组网拓扑、编辑config.ini后提交。后端执行4阶段部署流程(对应drspDeploy.xml:prepareDrsp → deployDrsp → drspServiceToReadonly → drspReadonlyToSync → drspDeployPostHandle)。
请求体:
{
"version": "v1",
"tenants": [
{"productId": 1, "clusterId": 101, "clusterName": "tenant_a"},
{"productId": 2, "clusterId": 201, "clusterName": "tenant_dr1"},
{"productId": 3, "clusterId": 301, "clusterName": "tenant_dr2"}
],
"topology": {
"edges": [
{"source": {"productId": 1, "clusterId": 101}, "target": {"productId": 2, "clusterId": 201}},
{"source": {"productId": 1, "clusterId": 101}, "target": {"productId": 3, "clusterId": 301}}
]
},
"gdbTags": {
"1": "gdb_prod",
"2": "gdb_dr1",
"3": "gdb_dr2"
},
"configBase64": "W2dkYjNdCnp......",
"tenantPriorities": {
"201": "1",
"301": "2"
}
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| version | String | 否 | XML流程版本,默认使用当前版本 |
| tenants | Array | 是 | 参与DRSP的所有租户(含源+灾备) |
| topology.edges | Array | 是 | 有向边列表,定义复制关系方向(source→target=主→备) |
| gdbTags | Map | 是 | key=productId, value=goldendb_tag标签 |
| configBase64 | String | 是 | 用户确认后的config.ini内容(base64编码) |
| tenantPriorities | Map | 否 | key=clusterId, value=cN_priority优先级 |
响应体:
{
"code": 200,
"message": "success",
"data": {
"drspGroupId": "drsp_group_001",
"taskId": "task_1712492400001_0001"
}
}
注意事项:
- 后端校验:GDB标签全局唯一性(SI创建的范围内)、拓扑无闭环(Kahn拓扑排序)、租户可用性
topology.edges构成有向无环图,中间节点角色自动推导为CASCADE- 入度为0的节点为PRIMARY,出度为0的节点为STANDBY
- 请求中的
configBase64需加密后传递给IA的prepare_drsp接口 - 此接口对应TaskEngine提交参数:
processId=drspDeploy,startVariables包含deploy(DeployParam)和drspConfig(DrspConfig)
扩容灾备租户
路径:POST /api/dbaas/drsp/expand
功能:向已有DRSP组扩容新的灾备租户。流程与创建类似(复用drspDeploy.xml),但需合并已有config。
请求体:
{
"groupId": "drsp_group_001",
"newTenants": [
{"productId": 4, "clusterId": 401, "clusterName": "tenant_dr3"}
],
"newEdges": [
{"source": {"productId": 1, "clusterId": 101}, "target": {"productId": 4, "clusterId": 401}}
],
"gdbTags": {
"4": "gdb_dr3"
},
"configBase64": "W2dkYjNdCnp......",
"tenantPriorities": {
"401": "3"
}
}
| 字段 | 类型 | 必填 | 说明 |
|---|---|---|---|
| groupId | String | 是 | 目标DRSP组ID |
| newTenants | Array | 是 | 新增的灾备租户列表 |
| newEdges | Array | 是 | 新增的复制关系边 |
| gdbTags | Map | 条件 | 新GDB的标签(已有GDB可省略) |
| configBase64 | String | 是 | 合并后的完整config.ini(base64编码) |
| tenantPriorities | Map | 否 | 新租户的优先级 |
响应体:
{
"code": 200,
"message": "success",
"data": {
"taskId": "task_1712492400001_0002"
}
}
注意事项:
- config合并逻辑(详见3.4.1):新租户GDB已在config中→复用;GDB有标签但不在config→导入标签属性;GDB无标签→新配
- 扩容只对新租户执行"服务进只读"和"只读进同步"阶段
- 合并后的config需重新下发给DRSP涉及的所有GDB

浙公网安备 33010602011771号