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"
重要注意事项
- 端口映射必须一致:如果使用Docker或NAT,必须确保总线端口也能正确映射
- 防火墙配置:总线端口不应该对公网开放,有安全风险
- 端口冲突:确保10000-20000范围内没有其他应用占用
- 集群规模:6节点集群需要开放12个端口(6个服务端口 + 6个总线端口)
总结
| 特性 | 服务端口 | 总线端口 |
|---|---|---|
| 主要作用 | 服务客户端请求 | 维护集群状态 |
| 通信频率 | 高(业务相关) | 中(定期心跳) |
| 数据量 | 大(业务数据) | 小(控制消息) |
| 安全性 | 需鉴权 | 需网络隔离 |
| 可扩展性 | 可负载均衡 | 固定内部通信 |
简单记忆:
- 700X端口:给外部应用用的,做数据操作
- 170XX端口:集群内部自己用的,用来"聊天"协调
这就是为什么Redis集群需要两套端口的原因:一套对外提供服务,一套对内维护集群状态,两者分离确保了集群的稳定性和扩展性。