接口设计

存在多个灾备恢复组(drsp),每个group有多个节点,且都是邻接表需要将任务存储到数据库,
每个任务还有config.ini 和 主版本信息等。
前后端交互提供如下接口--创建组,查询,删除,更新。

根据数据库设计 和 java部署代码实现,完善和修复接口设计。

  1. 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)
  1. 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
  1. 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
posted @ 2026-04-10 14:49  静水深耕,云停风驻  阅读(2)  评论(0)    收藏  举报