feat(server): 支持 MySQL 一主多从拓扑调度与复制健康检查

- DeliveryTask/DeploymentResult 新增 target_hosts/target_host_ips 完整节点列表(主节点在前)
- 交付输入支持 replica_count(1-7)与有序 target_hosts,按节点数放大配额/预留/资源用量
- 端口占用与已占主机解析改为逗号列表,兼容存量单主机字段
- 指定主机校验池成员/重复/单机实例数,自动补齐剩余节点或延后调度
- AWX Limit 与回滚覆盖全部节点,extra_vars 下发主从主机与 IP 列表
- completeTask 全节点 TCP 探活,副本经 mysqlReplicationReady 校验复制线程状态
- awxTaskSummary 按服务类型生成摘要;go-sql-driver/mysql 提为直接依赖
This commit is contained in:
Hungerdream
2026-07-31 18:12:05 +08:00
parent 242326ccc5
commit 0ca3af39dc
6 changed files with 392 additions and 46 deletions
+15
View File
@@ -53,6 +53,21 @@ func TestValidateDeliveryInput(t *testing.T) {
if err := validateDeliveryInput(lts, dataDisks); err != nil {
t.Fatalf("8.4 LTS rejected: %v", err)
}
replica := valid
replica.Topology = "primary_replica"
replica.ReplicaCount = 3
replica.TargetHosts = []string{"db-01", "db-02", "db-03", "db-04"}
if err := validateDeliveryInput(replica, dataDisks); err != nil {
t.Fatalf("primary_replica input rejected: %v", err)
}
if got := topologyNodeCount(replica); got != 4 {
t.Fatalf("topologyNodeCount = %d, want 4", got)
}
tooManyReplicas := replica
tooManyReplicas.ReplicaCount = 8
if err := validateDeliveryInput(tooManyReplicas, dataDisks); err == nil {
t.Fatal("replica_count 8 was accepted")
}
for name, mutate := range map[string]func(*MySQLDeliveryInput){
"uppercase namespace": func(in *MySQLDeliveryInput) { in.Namespace = "Team-A" },
"bad instance": func(in *MySQLDeliveryInput) { in.InstanceName = "mysql_01" },