什么是 Redis Cluster?

Redis Cluster 是 Redis 官方提供的分布式集群方案,具备以下核心能力:

特性

说明

✅ 数据自动分片

使用 16384 个哈希槽(hash slots)分布数据

✅ 高可用

主节点宕机,从节点自动提升为主

✅ 去中心化

节点间通过 Gossip 协议通信,无中心节点

✅ 水平扩展

支持在线添加/删除节点(需 rehash)

✅ 客户端直连

客户端可连接任意节点,自动重定向

Redis Cluster 核心原理

1️⃣ 数据分片:哈希槽(Hash Slot)

Redis Cluster 将整个键空间划分为 16384 个哈希槽(0 ~ 16383)

  • 每个 key 通过 CRC16(key) % 16384 计算出所属槽
  • 每个主节点负责一部分槽(如 0-5500, 5501-11000, 11001-16383)
  • 客户端根据 key 找到对应节点进行操作
# 示例:key = "user:1001"
CRC16("user:1001") % 16384 = 1234 → 由负责槽 1234 的主节点处理

2️⃣ 高可用:主从复制 + 故障转移

  • 每个主节点(master)可配置一个或多个从节点(replica)
  • 当主节点宕机,其从节点通过 Gossip 协议检测并发起选举
  • 多数主节点投票通过后,从节点晋升为新主
  • 客户端收到 -MOVED 重定向,自动连接新主节点

📌 无需哨兵(Sentinel):故障转移由集群内部自动完成!

3️⃣ 节点通信:Gossip 协议

  • 所有节点之间通过 Gossip 协议交换状态信息(ping/pong)
  • 每秒随机选择几个节点发送心跳
  • 用于:故障检测、配置更新、节点发现
  • 端口规则:客户端端口 + 10000(如 6379 → 集群通信端口 16379)

实战:部署三主三从 Redis Cluster

1. 准备 6 个 Redis 实例(端口 7000~7005)

创建配置文件 redis-7000.conf(其他类似):

port 7000
daemonize yes
pidfile /var/run/redis_7000.pid
cluster-enabled yes
cluster-config-file nodes-7000.conf
cluster-node-timeout 5000
appendonly yes

启动所有实例:

redis-server redis-7000.conf
redis-server redis-7001.conf
# ... 7002 ~ 7005

2. 创建集群(使用 redis-cli --cluster

redis-cli --cluster create \127.0.0.1:7000 \127.0.0.1:7001 \127.0.0.1:7002 \127.0.0.1:7003 \127.0.0.1:7004 \127.0.0.1:7005 \--cluster-replicas 1

📌 --cluster-replicas 1 表示每个主节点配 1 个从节点,自动分配角色。

3. 验证集群状态

redis-cli -p 7000 cluster info
redis-cli -p 7000 cluster nodes

输出应显示:

  • 3 个 master 节点,3 个 replica 节点
  • 所有槽已分配(cluster_state:ok

Redis Cluster 是构建大规模、高可用 Redis 系统的终极方案。它通过去中心化的架构、自动分片与故障转移,解决了单机与主从模式的扩展性瓶颈。无论是架构师还是后端开发者,掌握 Redis Cluster 都是构建现代分布式系统的必备技能。