前言 #
在高并发场景下,单节点 Redis 往往无法满足业务需求。无论是容量限制还是性能瓶颈,都促使我们必须将 Redis 扩展到多节点架构。本文将手把手带你搭建一个生产级的 Redis Cluster 集群。
环境准备 #
我准备了 6 台虚拟机,计划部署 3 主 3 从的架构:
| 节点 | IP | 端口 | 角色 |
|---|---|---|---|
| node-1 | 192.168.1.101 | 6379 | Master |
| node-2 | 192.168.1.102 | 6379 | Master |
| node-3 | 192.168.1.103 | 6379 | Master |
| node-4 | 192.168.1.104 | 6379 | Slave |
| node-5 | 192.168.1.105 | 6379 | Slave |
| node-6 | 192.168.1.106 | 6379 | Slave |
核心配置 #
每个节点的 redis.conf 需要开启集群模式:
# 开启集群模式
cluster-enabled yes
# 集群配置文件(自动生成)
cluster-config-file nodes.conf
# 节点超时时间
cluster-node-timeout 5000
# 开启 AOF 持久化
appendonly yes
# 绑定 IP
bind 0.0.0.0
# 保护模式关闭
protected-mode no集群创建 #
使用 Redis 自带的 redis-cli --cluster create 命令:
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--cluster-replicas 1 表示每个主节点分配 1 个从节点。
槽位分配原理 #
Redis Cluster 将 16384 个槽位均匀分配到各个主节点:
Master[0] -> Slots 0 - 5460
Master[1] -> Slots 5461 - 10922
Master[2] -> Slots 10923 - 16383每个 key 通过 CRC16(key) % 16384 计算所属槽位,从而路由到正确的节点。
故障转移测试 #
手动下线 node-1 主节点,观察集群状态:
# 查看集群节点信息
redis-cli -h 192.168.1.102 cluster nodes
# 输出示例
# 节点ID IP:端口@总线端口 角色 状态 槽位 关联节点当主节点宕机超过 cluster-node-timeout(5秒)后,其从节点会自动发起选举,提升为新的主节点。
客户端连接 #
使用 JedisCluster 连接集群:
Set<HostAndPort> nodes = new HashSet<>();
nodes.add(new HostAndPort("192.168.1.101", 6379));
nodes.add(new HostAndPort("192.168.1.102", 6379));
nodes.add(new HostAndPort("192.168.1.103", 6379));
JedisCluster cluster = new JedisCluster(nodes, 5000, 100);
cluster.set("user:1001", "{\"name\":\"Forminio\",\"level\":99}");常见问题 #
1. 脑裂问题 #
当网络分区发生时,可能出现双主情况。建议配置:
cluster-require-full-coverage yes
min-replicas-to-write 1
min-replicas-max-lag 102. 大 Key 问题 #
单个槽位数据过大导致迁移缓慢。可通过 --cluster-fix 修复:
redis-cli --cluster fix 192.168.1.101:6379性能压测 #
使用 redis-benchmark 测试集群性能:
redis-benchmark -h 192.168.1.101 -p 6379 -c 100 -n 1000000 -t set,get -P 16在我本地的测试环境中,SET 操作达到了 18万 QPS,GET 操作达到了 22万 QPS。
总结 #
Redis Cluster 是官方推荐的分布式方案,通过槽位分片实现了数据水平扩展,通过主从复制保障了高可用。在生产环境中,还需要配合 Sentinel 或自定义监控脚本,实现更完善的运维体系。
延伸阅读