Files
opsxsql/backend
opsx f19a84f37e fix(redis): 集群拓扑解析错误,跨机集群节点被强制指向种子机
【现象】Redis 集群实例查 keys 报 500:
  Redis cluster connection failed: dial tcp 172.19.16.16:6005: connect: connection refused

【根因】handler/redis.go 解析 CLUSTER SLOTS:
  nodeAddr := slot.Nodes[0].Addr                    // Redis 上报的真实地址 172.19.16.30:6005
  if idx := strings.LastIndex(nodeAddr, ":"); idx >= 0 {
      nodeAddr = instance.Host + nodeAddr[idx:]     // 强制改写成 种子机主机 + 原端口
  }
  该逻辑假设「集群所有节点在同一台机器、只是端口不同」。
  对跨机集群(16/30/59 三台)会把所有节点地址破坏成
  172.19.16.16:6002 / :6003 / :6005 —— 这些端口在 16 上根本不存在 → refused。

【修复】
  仅当 Redis 上报空 IP / 127.0.0.1 / 0.0.0.0 时才用配置 host 兜底(NAT/端口映射场景),
  其余情况一律保留 Redis 上报的真实主机地址。

【附带数据修复(非代码)】
  实例 5 host: pre-mysql.astx.club → 172.19.16.2
  原因:pre-mysql.astx.club 公网 DNS 解析到 43.135.53.180(另一环境 MySQL),
       认证失败 → 前端数据库下拉为空、无法选择数据库。

【验证】
  GET /api/v1/redis/4/keys?db=0&pattern=*  → 200
    {"cluster":true,"keys":[{"key":"24H_rate_limit_10001_...","type":"string","ttl":42901000},
                            {"key":"CEX:FOLLOW:FOLLOWERS:TRADFI:97127836","type":"hash"},...]}
  GET /api/v1/redis/4/dbs                 → 200 {"cluster":true,"dbs":[0]}
  GET /api/v1/instances/5/databases       → 200 返回 25 个库
    ["cex_activity","cex_admin","cex_agent",...,"cex_user","cex_xxl_job"]

镜像 sha256:165992ef79d5
2026-10-26 18:01:44 +00:00
..
2026-07-08 08:53:48 +00:00
2026-05-29 15:45:44 +00:00