[redis]集群对外提供节点

11 阅读2分钟

问题: 假如我有一个包含10台服务器构成的redis集群, 那我我该如何给客户端提供接入的ip呢?

对于 Redis 集群,客户端不需要知道所有 10 台服务器的 IP。通常只需要配置其中几个节点的地址即可,客户端会自动发现整个集群的拓扑结构

Redis 集群的连接机制

1. 基本连接方式

客户端只需要知道集群中的少数几个节点(通常 2-3 个)作为入口点:

  • 连接任意一个节点,客户端会获取整个集群的拓扑信息
  • 如果连接的节点不可用,可以尝试其他已知节点

2. 客户端发现机制

当客户端连接上集群后:

  • 通过 CLUSTER NODESCLUSTER SLOTS 命令获取集群完整拓扑
  • 自动建立到所有主节点的连接
  • 知道每个槽位(slot)由哪个节点负责

3. 推荐的配置方式

// 示例:Jedis (Java) 客户端
Set<HostAndPort> jedisClusterNodes = new HashSet<>();
// 只需配置部分节点,不一定要全部
jedisClusterNodes.add(new HostAndPort("192.168.1.101", 6379));
jedisClusterNodes.add(new HostAndPort("192.168.1.102", 6379));
jedisClusterNodes.add(new HostAndPort("192.168.1.103", 6379));

JedisCluster jedis = new JedisCluster(jedisClusterNodes);

4. 实际部署建议

  • 生产环境:通常配置 3-5 个节点地址,保证高可用
  • 为什么不全配
    • 节点可能动态变化(扩容/缩容)
    • 减少配置维护工作
    • 客户端会自动发现新节点
    • 避免因单个节点配置错误导致连接失败

5. 故障处理

如果配置的初始节点全部不可用:

  • 客户端连接失败
  • 需要人工干预或通过服务发现机制更新节点列表

6. 最佳实践

# 应用配置文件
redis:
  cluster:
    nodes:
      - 192.168.1.101:6379
      - 192.168.1.102:6379
      - 192.168.1.103:6379
    # 不需要列出所有10台

7. 智能客户端特性

现代 Redis 客户端(如 Lettuce、Jedis、Redisson)都支持:

  • 自动拓扑刷新
  • 连接池管理
  • 故障转移处理
  • 槽位重定向(MOVED/ASK 响应)

总结

不需要告诉客户端所有 10 台服务器的 IP,只需要提供集群中的几个种子节点即可。这是 Redis 集群设计的一大优势,简化了客户端的配置和管理。建议在客户端配置中提供至少3个不同物理服务器上的节点地址,以确保高可用性。