[redis]redis集群如何选择对外暴漏的节点

3 阅读6分钟

我们假设这个Redis集群是Redis Cluster模式。在Redis Cluster中,客户端只需要知道集群中的部分节点(即任意一个或多个节点的IP和端口),就可以通过重定向(redirect)或MOVED/ASK错误来发现集群中的所有其他节点。因此,我们不需要暴露所有10台服务器的IP。

通常,为了高可用性,我们建议暴露至少3个节点的IP。这样,如果其中一个节点不可用,客户端仍然可以通过其他节点连接到集群。

选择哪3台服务器暴露给客户端,可以考虑以下几点:

  1. 均匀分布:尽量选择分布在不同的物理服务器或不同的机架上,以提高容灾能力。
  2. 负载考虑:选择负载相对较低的节点,避免热点。
  3. 主节点和从节点:在Redis Cluster中,每个主节点都可能有一个或多个从节点。通常,我们暴露主节点的IP,因为主节点负责处理写操作和部分读操作。但是,如果主节点故障,从节点会提升为主节点。因此,也可以考虑暴露一些从节点的IP,但要注意客户端连接从节点可能只能读(除非配置了允许写从节点,但Redis Cluster默认不允许写从节点)。

然而,在Redis Cluster中,客户端连接集群时,最好连接主节点,因为从节点可能会重定向客户端到主节点。但是,如果客户端支持读写分离,也可以连接从节点进行读操作。

在实际操作中,我们可以选择3个主节点,并且这3个主节点尽量分散在不同的物理位置上(如果有多机房部署的话)。如果没有多机房,则选择3个负载相对均衡且稳定的主节点。

如果集群中有10台服务器,假设这10台服务器中有5个主节点和5个从节点(每个主节点有一个从节点),那么我们可以选择3个主节点暴露给客户端。

但是,如果主节点数量不足3个(例如,只有3个主节点,那么每个主节点有多个从节点,但主节点只有3个),那么我们可以选择3个主节点,或者选择2个主节点和1个从节点(但这样可能不如3个主节点好,因为从节点可能不会处理写操作)。

综上所述,建议选择3个主节点,并确保这3个主节点在物理上尽可能分散,以提高可用性。

如果集群的节点分布有特殊性(比如有的节点配置更高,有的节点在网络拓扑中更接近客户端等),也可以根据实际情况调整。

另外,如果使用负载均衡器或代理(如HAProxy、Twemproxy等),则可以通过负载均衡器暴露一个虚拟IP,然后负载均衡器将请求转发到后端的多个Redis节点。这样,客户端只需要知道负载均衡器的IP,而负载均衡器后面可以配置多个Redis节点(包括主节点和从节点)。在这种情况下,负载均衡器可以配置健康检查,自动屏蔽故障节点。

但是,如果直接暴露Redis节点的IP,那么选择3个主节点是一个不错的做法。

总结:选择3个主节点,并确保它们在不同的物理机器上(如果可能的话),且负载相对均衡。




对于 Redis Cluster 集群,通常建议暴露 3 个节点的 IP 地址给客户端。这样的设计既能保证高可用性,又能避免单点故障风险。

选择哪三台服务器?

1. 选择标准

  • 主节点优先:选择主节点(Master)而非从节点(Slave),因为主节点负责处理槽位(slot)数据
  • 物理分布:如果节点分布在不同的机架或可用区,尽量选择分布在不同物理位置的节点
  • 负载均衡:选择当前负载相对较低的节点
  • 稳定性:选择运行稳定、故障率低的节点

2. 具体选择策略

方案A:均匀分布法(推荐)

假设你的 10 台服务器是 5 主 5 从的配置:

Master1 (Slave1) - 节点1
Master2 (Slave2) - 节点2
Master3 (Slave3) - 节点3
Master4 (Slave4) - 节点4
Master5 (Slave5) - 节点5

选择其中 3 个主节点,如 Master1、Master3、Master5,确保它们:

  1. 处理不同的哈希槽范围
  2. 分布在不同的物理服务器上(如果可能)

方案B:负载感知法

  1. 监控所有节点的负载(CPU、内存、网络连接数)
  2. 选择 3 个负载最低的主节点
  3. 定期评估并更新暴露的节点列表

方案C:拓扑感知法

如果集群跨机房或跨可用区部署:

机房A: Master1, Master2, Slave1, Slave2
机房B: Master3, Slave3
机房C: Master4, Master5, Slave4, Slave5

选择原则:

  • 每个机房至少选 1 个节点(如果客户端也分布在不同机房)
  • 优先选择主节点多的机房

3. 实际操作建议

使用负载均衡器(最佳实践)

# 使用 HAProxy/Nginx 作为代理层
upstream redis_cluster {
    # 暴露3个主节点
    server 10.0.1.1:6379 check inter 1s
    server 10.0.1.3:6379 check inter 1s
    server 10.0.1.5:6379 check inter 1s
    # 其他节点作为备份
    server 10.0.1.7:6379 backup
    server 10.0.1.9:6379 backup
}

客户端配置示例

# Redis Cluster 客户端配置(Python redis-py-cluster)
startup_nodes = [
    {"host": "10.0.1.1", "port": 6379},
    {"host": "10.0.1.3", "port": 6379},
    {"host": "10.0.1.5", "port": 6379}
]

4. 监控与维护

  1. 健康检查:对暴露的 3 个节点实施主动健康监控
  2. 动态更新:如果某个暴露节点频繁故障,考虑替换为其他稳定节点
  3. 客户端重试逻辑:确保客户端有完整的重试机制,能在第一个节点不可用时尝试其他节点

5. 为什么是 3 台?

  • 可用性:3 台可以提供足够的冗余,即使 1 台宕机,仍有 2 台可用
  • 性能:客户端连接可以分散到多个节点,避免单点压力过大
  • 发现机制:Redis Cluster 的 Gossip 协议只需要连接少数节点就能发现整个集群拓扑
  • 维护成本:管理 3 个暴露点比管理 10 个更简单

重要注意事项:

  1. 确保客户端实现了完整的 Redis Cluster 协议,能处理 MOVED/ASK 重定向
  2. 定期更新客户端的节点列表,特别是当集群拓扑发生变化时
  3. 考虑使用 DNS 轮询或负载均衡器,这样可以在不修改客户端配置的情况下更换后端节点

按照这个方案,你的客户端就能通过这 3 个入口点成功连接到整个 Redis Cluster 集群。