Skip to content

10. Redis Cluster

10.1 什么是 Redis Cluster?

🌐 比喻:如果主从复制是「一个老大带几个小弟」,那 Cluster 就像一个「联盟」——多个节点各自管理一部分数据(16384 个哈希槽),共同承担压力。

  • 数据自动分片到多个节点
  • 每个主节点可以有从节点(高可用)
  • 节点之间通过 Gossip 协议通信
  • 支持在线扩缩容

10.2 哈希槽(Hash Slot)

Redis Cluster 将数据空间划分为 16384 个槽(Slot),每个节点负责一部分槽。

bash
# 计算 key 属于哪个槽
CLUSTER KEYSLOT "user:1001"
bash
(integer) 8106

📝 备注: 使用{hash_tag}可以让多个 key 落在同一个槽中:user:{1001}:name和user:{1001}:age会落在同一个槽,支持跨 key 操作。

10.3 集群搭建

bash
# 准备 6 个节点配置文件(3 主 + 3 从)
# 每个 redis-cluster.conf 中添加:
cluster-enabled yes
cluster-config-file nodes-6379.conf
cluster-node-timeout 5000

# 使用 redis-cli 创建集群
redis-cli --cluster create \
  192.168.1.101:6379 \
  192.168.1.102:6379 \
  192.168.1.103:6379 \
  192.168.1.104:6379 \
  192.168.1.105:6379 \
  192.168.1.106:6379 \
  --cluster-replicas 1

# 查看集群信息
redis-cli -c -h 192.168.1.101 CLUSTER INFO

# 查看节点信息
redis-cli -c -h 192.168.1.101 CLUSTER NODES

# 查看槽分配
redis-cli -c -h 192.168.1.101 CLUSTER SLOTS
bash
cluster_state:ok
cluster_slots_assigned:16384
cluster_slots_ok:16384
cluster_slots_pfail:0
cluster_slots_fail:0
cluster_known_nodes:6
cluster_size:3

10.4 集群扩缩容

bash
# 添加新节点
redis-cli --cluster add-node 192.168.1.107:6379 192.168.1.101:6379

# 重新分配槽(扩容时需要)
redis-cli --cluster reshard 192.168.1.101:6379
# 按提示输入要迁移的槽数量和目标节点 ID

# 移除节点(先迁移槽,再删除)
redis-cli --cluster del-node 192.168.1.101:6379 <node-id>

# 添加从节点
redis-cli --cluster add-node 192.168.1.108:6379 192.168.1.101:6379 \
  --cluster-slave --cluster-master-id <master-node-id>

⚠️ 注意: 在集群中执行KEYS *只会返回当前节点的键。使用redis-cli --cluster check进行集群健康检查。