↓ 跳过正文
  1. 文章/

Redis 集群搭建与实战:从单节点到高可用

Forminio
know is know ,no know is no know
目录
分布式系统实践 - 这篇文章属于一个选集。
§ : 本文

前言
#

在高并发场景下,单节点 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 10

2. 大 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 或自定义监控脚本,实现更完善的运维体系。


延伸阅读

分布式系统实践 - 这篇文章属于一个选集。
§ : 本文