Redis集群端口和集群总线端口

Posted by     "zengchengjie" on Monday, January 5, 2026

Redis集群端口和集群总线端口

以部署脚本中的: echo " 7001-7006 (Redis服务端口)" echo " 17001-17006 (集群总线端口)"

为例:

问:这两个端口有什么区别

答:这两个端口在Redis集群中扮演完全不同的角色,让我详细解释它们的区别:

端口功能对比表

对比项 Redis服务端口 (7001-7006) 集群总线端口 (17001-17006)
用途 客户端连接和数据操作 集群内部节点间通信
通信对象 客户端应用 ↔ Redis节点 Redis节点 ↔ Redis节点
协议 RESP协议(Redis序列化协议) 集群总线协议(二进制协议)
内容 数据命令(GET/SET等) 心跳、配置更新、故障检测
安全性 通常暴露给应用 应该只对集群内部开放

详细解释

1. Redis服务端口 (7001-7006)

这是客户端使用的端口:

# 客户端连接示例
redis-cli -p 7001
# 或应用程序连接
redis://127.0.0.1:7001

处理的操作:

  • 数据读写(SET、GET、HGET等)
  • 事务操作
  • Lua脚本执行
  • 发布订阅
  • 普通客户端的所有操作

2. 集群总线端口 (17001-17006)

这是Redis节点间通信的端口(Redis默认用此方式找到,也可以在配置文件或者创建的时候加参数进行自定义):

# 计算公式:服务端口 + 10000
7001 + 10000 = 17001
7002 + 10000 = 17002
# 以此类推...

处理的操作:

  • 节点发现:新节点加入时互相发现
  • 心跳检测:定期发送ping/pong检测节点存活
  • 故障转移:主节点故障时,从节点通过总线协商选举
  • 配置传播:集群槽位分配信息同步
  • 复制协调:主从节点间的数据同步协调

实际工作原理示例

假设我们有6个节点的Redis集群:

节点配置:
节点1: 127.0.0.1:7001 (服务端口) -> 127.0.0.1:17001 (总线端口)
节点2: 127.0.0.1:7002 (服务端口) -> 127.0.0.1:17002 (总线端口)
节点3: 127.0.0.1:7003 (服务端口) -> 127.0.0.1:17003 (总线端口)
节点4: 127.0.0.1:7004 (服务端口) -> 127.0.0.1:17004 (总线端口)
节点5: 127.0.0.1:7005 (服务端口) -> 127.0.0.1:17005 (总线端口)
节点6: 127.0.0.1:7006 (服务端口) -> 127.0.0.1:17006 (总线端口)

通信流程示例:

graph TD
    A[客户端应用] -->|GET key| B[7001: 服务端口]
    B --> C{key属于哪个槽?}
    C -->|槽5500| D[查询集群配置]
    D --> E[通过17001总线端口<br>询问其他节点]
    E --> F[节点2回应: 槽5500在7002]
    B --> G[MOVED重定向到7002]
    A --> H[连接7002获取数据]
    
    I[节点1:7001] -->|心跳ping| J[通过17001->17002<br>检查节点2健康]
    J --> K[节点2:17002响应pong]

配置示例

Redis配置文件 (redis.conf)

# 服务端口配置
port 7001

# 集群配置
cluster-enabled yes
cluster-config-file nodes-7001.conf
cluster-node-timeout 15000

# 集群总线端口自动计算:7001 + 10000 = 17001
# 无需显式配置,Redis自动处理

防火墙配置建议

生产环境防火墙规则:

# 允许客户端访问服务端口
sudo iptables -A INPUT -p tcp --dport 7001:7006 -j ACCEPT

# 允许集群内部访问总线端口(限制源IP)
sudo iptables -A INPUT -p tcp --dport 17001:17006 -s 10.0.0.0/24 -j ACCEPT

# 拒绝外部访问总线端口
sudo iptables -A INPUT -p tcp --dport 17001:17006 -j DROP

监控和诊断

查看端口使用情况:

# 查看服务端口连接(客户端连接)
netstat -tlnp | grep :700

# 查看总线端口连接(集群内部连接)
netstat -tlnp | grep :170

# 使用lsof查看
lsof -i :7001  # 查看谁连接了Redis服务
lsof -i :17001 # 查看集群节点间连接

集群通信监控:

# 查看集群节点信息(包含总线端口)
redis-cli -p 7001 cluster nodes

# 输出示例:
# 1a2b3c... 127.0.0.1:7001@17001 myself,master - 0 0 1 connected 0-5460
# 4d5e6f... 127.0.0.1:7002@17002 master - 0 1523012345678 2 connected 5461-10922
# 注意:@17001 就是总线端口

常见问题排查

问题1:集群节点无法通信

# 检查总线端口是否开放
telnet 127.0.0.1 17001

# 查看防火墙规则
sudo iptables -L -n | grep 17001

# 检查集群日志
tail -f /var/log/redis/redis-7001.log | grep cluster

问题2:客户端收到MOVED重定向

# 查看槽位分配
redis-cli -p 7001 cluster slots

# 输出示例:
# 1) 1) (integer) 0        # 起始槽
#    2) (integer) 5460     # 结束槽
#    3) 1) "127.0.0.1"     # 主节点IP
#       2) (integer) 7001  # 主节点端口
#       3) "node-id"
#    4) 1) "127.0.0.1"     # 从节点IP
#       2) (integer) 7004  # 从节点端口
#       3) "node-id"

重要注意事项

  1. 端口映射必须一致:如果使用Docker或NAT,必须确保总线端口也能正确映射
  2. 防火墙配置:总线端口不应该对公网开放,有安全风险
  3. 端口冲突:确保10000-20000范围内没有其他应用占用
  4. 集群规模:6节点集群需要开放12个端口(6个服务端口 + 6个总线端口)

总结

特性 服务端口 总线端口
主要作用 服务客户端请求 维护集群状态
通信频率 高(业务相关) 中(定期心跳)
数据量 大(业务数据) 小(控制消息)
安全性 需鉴权 需网络隔离
可扩展性 可负载均衡 固定内部通信

简单记忆

  • 700X端口:给外部应用用的,做数据操作
  • 170XX端口集群内部自己用的,用来"聊天"协调

这就是为什么Redis集群需要两套端口的原因:一套对外提供服务,一套对内维护集群状态,两者分离确保了集群的稳定性和扩展性。