Redis Cluster 集群模式
前言
如果熟悉 Redis 主从和哨兵模式,不难发现,它们都有一些共同的缺点,首先在主从切换的过程中会丢失数据;另一个就是只有一个 master,只能单点写,并没有水平扩容能力。而且每个节点都保存了所有的数据,这使得内存占用率变高,另一个就是如果进行数据恢复也比较慢。为了解决这些问题,Cluster 集群模式应运而生,下面我们来一起看看。
1. 什么是 Redis Cluster
1.1 概念
提示
Redis Cluster 是 Redis 数据库的一种集群方案,用于实现高可用性和横向扩展。Redis Cluster 将数据分布在多个节点上,每个节点负责存储部分数据,同时提供数据复制和自动故障转移功能,以确保系统的可靠性和性能。
Redis Cluster 通过支持分片(sharding)和复制(replication)来实现数据在集群中的分布和备份,从而在数据量增长时能够水平扩展,并且能够容忍单个节点的故障而不影响整个系统的正常运行。
在高可用上,集群基本是直接复用哨兵模式的逻辑,并且针对水平扩展进行了优化。
1.2 特点
采用去中心化的集群模式,将数据按槽分布在多个 Redis 节点上,集群共有 16384 个槽,每个节点负责处理部分槽,并使用 CRC16 算法来计算 key 所属的槽:crc16(key,keylen) & 16383
所有的 Redis 节点彼此互联,通过 PING-PONG 机制来进行节点间的心跳检测。
客户端与 Redis 节点直连,不需要中间代理层(proxy)。客户端不需要连接集群中所有的节点,只用连接集群中任意一个可用节点即可。
采用主从复制机制,将数据复制到多个节点上。每个主节点会有一个或多个从节点。在实际使用中,通常会将主从分布在不同机房,避免机房出现故障导致整个分片出问题。
2. 集群架构
2.1 基本概念
- 节点(Node):集群中的每个 Redis 实例
- 槽(Slot):Redis Cluster 将数据空间划分为 16384 个槽
- 主节点(Master):负责处理读写请求
- 从节点(Slave):复制主节点的数据,提供读服务和高可用
2.2 三节点集群架构
一个典型的三节点 Redis Cluster 架构包含:
- 3 个主节点(Master)
- 3 个从节点(Slave)
- 每个主节点负责 5461-5462 个槽
- 每个主节点配备一个从节点,实现高可用
3. 集群特性
3.1 数据分片
- 使用 CRC16 算法对 key 进行哈希
- 将哈希值对 16384 取模,得到槽位
- 每个节点负责一部分槽位
- 支持槽位迁移,实现动态扩容
3.2 高可用性
- 主从复制:每个主节点都有对应的从节点
- 自动故障转移:当主节点故障时,从节点自动升级为主节点
- 集群总线:节点间通过 TCP 端口(默认 16379)通信
3.3 一致性保证
- 异步复制:主节点写入后异步复制到从节点
- 最终一致性:保证最终数据一致性
- 写入确认:可配置写入确认级别
4. 集群配置
4.1 节点配置
每个节点的 redis.conf 需要包含以下关键配置:
# redis.conf
port 7000
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 15000
appendonly yes
4.2 集群创建
使用 redis-cli 创建集群:
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
5. 集群管理
5.1 常用命令
# 查看集群状态
redis-cli -c -p 7000 cluster info
# 查看集群节点
redis-cli -c -p 7000 cluster nodes
# 检查集群健康状态
redis-cli --cluster check 127.0.0.1:7000
5.2 集群维护
- 添加新节点
- 移除节点
- 重新分片
- 故障转移
6. 最佳实践
6.1 部署建议
- 建议使用奇数个主节点
- 每个节点配置相同的内存大小
- 合理设置 maxmemory 和 maxmemory-policy
- 启用 AOF 持久化
6.2 性能优化
- 使用 pipeline 批量操作
- 合理设置 key 过期时间
- 避免大 key
- 监控集群状态
6.3 运维建议
- 定期备份数据
- 监控集群状态
- 设置合理的告警阈值
- 制定故障恢复预案
7. 注意事项
- 不支持多键操作(除非在同一个槽)
- 不支持事务
- 部分命令不支持
- 需要客户端支持集群模式
8. 常见问题
8.1 集群扩展
- 添加新节点
- 迁移槽位
- 重新平衡数据
8.2 故障处理
- 节点故障
- 网络分区
- 数据不一致
9. 总结
Redis Cluster 提供了强大的分布式能力,通过合理的配置和运维,可以构建高可用、高性能的分布式缓存系统。在实际应用中,需要根据业务场景选择合适的集群规模和配置参数。
