Redis 域名端集群是指 Redis Cluster 在组网与寻址过程中,节点以“域名 + 端口”方式对外暴露、通告并被客户端路由的部署形态。其核心机制包含 双端口模型、节点通告(cluster announce)、槽位路由与重定向 三部分。

一、双端口机制:Redis Cluster 每个节点监听两类端口。一个是 客户端端口(redis.conf 中 port,默认 6379),供应用连接;另一个是 集群总线端口(cluster bus port),用于节点间 gossip 心跳、故障检测与配置传播,默认在客户端端口基础上 +10000(如 6379 对应 16379)。旧版本总线端口由 port + 10000 隐式派生,Redis 7.x 起可通过 cluster-port 显式指定。采用域名接入时,两个端口都必须在 DNS 记录与安全组/防火墙中同时放行,否则节点无法加入集群或持续被判定为 PFAIL。
二、域名通告机制:Redis Cluster 节点间通信与客户端重定向默认使用 IP。为支持域名寻址,Redis 提供 cluster-announce-ip(可填写域名)与 7.0 引入的 cluster-announce-hostname,节点在 gossip 报文中将该地址通告给集群其他节点;配合 cluster-announce-client-port、cluster-announce-bus-port 可分别通告对外客户端端口与总线端口。客户端在收到 MOVED/ASK 时拿到的 host 即为通告值,因此 通告域名必须能被所有客户端与节点解析。
三、端点类型控制:Redis 7.0 增加 cluster-preferred-endpoint-type,决定 CLUSTER SLOTS / CLUSTER SHARDS 及重定向报文中返回给客户端的端点形式,取值为 ip(默认,返回 IP)、hostname(返回 cluster-announce-hostname 指定的域名)、unknown-endpoint(隐藏端点,强制客户端通过已建立连接拓扑发现节点)。云上(如 AWS ElastiCache、阿里云 Tair)常将端点类型设为 hostname,使客户端仅依赖域名即可完成全拓扑路由。
四、客户端路由流程:客户端(Jedis、Lettuce、redis-py、go-redis 等)启动时通过域名解析出任一节点,执行 CLUSTER SLOTS / CLUSTER SHARDS 拉取槽位映射表并在本地缓存;写命令经 CRC16(key) mod 16384 定位目标节点,直连执行;若目标不负责该槽,节点返回 MOVED host:port(域名形态),客户端刷新本地映射表并重试;在槽位迁移过程中目标节点返回 ASK,客户端仅对本次请求临时重定向,不更新缓存,避免映射表抖动。
五、DNS 缓存与连接池隐患:域名方案的最大风险是解析结果过期。JVM 默认缓存正向查找结果 30 秒(networkaddress.cache.ttl),部分容器/宿主机配置为永久缓存,当节点域名对应 IP 发生漂移(云实例切换、故障转移)时,客户端仍连旧 IP 导致连接超时。生产环境应将 cache.ttl 调低(如 5~10 秒),并让客户端在连接失败/重定向时触发重新解析;同时连接池需开启对异常节点的剔除与拓扑刷新(如 Lettuce 的 adaptiveTopologyRefresh、Jedis 的 topologyRefresh)。
六、运维与排错要点:1)DNS 需为集群每个节点配置独立 A 记录,避免单一域名轮询带多 IP——Cluster 拓扑要求每个节点独立可寻址;2)TLS 集群(rediss://)下客户端端口与总线端口均受 tls-port 影响,证书 SAN 必须覆盖通告域名;3)节点出现 cluster state FAIL 或长期 handshake 失败时,优先用 CLUSTER NODES 检查通告地址(flags 列 hostname 字段)与解析是否一致;4)跨 VPC/NAT 环境必须保证通告的是对端可达域名,而非内部 IP,否则 gossip 与重定向会指向不可达地址。

查看详情

查看详情