Redis 提供了三种集群方案:主从复制、哨兵模式和集群模式,它们各有不同的适用场景和特点。
1. 主从复制(Master-Slave Replication)
工作原理: 主从复制是指将一个 Redis 节点作为主节点(Master),其他节点作为从节点(Slave)。主节点负责写操作,从节点负责读操作。主节点将数据变更同步到从节点。
特点:
- 读写分离:主节点处理写操作,从节点处理读操作,提高系统吞吐量
- 数据备份:从节点是主节点的完整副本,提供数据冗余
- 故障恢复:主节点故障时,需要手动将从节点提升为主节点
配置方式:
bash# 在从节点配置文件中添加 slaveof <master-ip> <master-port>
缺点:
- 主节点故障时需要手动切换,无法自动故障转移
- 主节点的写能力受限,无法水平扩展
2. 哨兵模式(Sentinel)
工作原理: 哨兵模式是在主从复制的基础上,增加了哨兵节点。哨兵节点监控主从节点的运行状态,当主节点故障时,自动将从节点提升为主节点,实现自动故障转移。
特点:
- 自动故障转移:主节点故障时,自动选举新的主节点
- 监控:实时监控主从节点的健康状态
- 通知:当主节点故障时,通知管理员
- 配置提供者:客户端可以从哨兵获取当前主节点的地址
哨兵工作流程:
- 哨兵定期向主从节点发送 PING 命令检查健康状态
- 如果主节点在指定时间内无响应,哨兵会标记主节点为主观下线
- 当足够多的哨兵都认为主节点下线时,主节点被标记为客观下线
- 哨兵选举出一个领头哨兵,负责故障转移
- 领头哨兵从从节点中选举出新的主节点
- 其他从节点重新配置,指向新的主节点
配置方式:
bash# 哨兵配置文件 sentinel.conf port 26379 sentinel monitor mymaster 127.0.0.1 6379 2 sentinel down-after-milliseconds mymaster 30000 sentinel parallel-syncs mymaster 1 sentinel failover-timeout mymaster 180000
缺点:
- 主节点的写能力仍然受限,无法水平扩展
- 哨兵节点本身也可能成为单点故障
3. 集群模式(Cluster)
工作原理: Redis Cluster 采用去中心化的架构,将数据分片存储在多个节点上。每个节点负责一部分数据,通过哈希槽(Hash Slot)实现数据分片。
特点:
- 数据分片:将数据分散到多个节点,实现水平扩展
- 高可用:每个主节点可以有多个从节点,主节点故障时自动故障转移
- 无中心节点:所有节点地位平等,没有单点故障
- 自动故障转移:主节点故障时,从节点自动提升为主节点
哈希槽机制:
- Redis Cluster 共有 16384 个哈希槽(0-16383)
- 每个节点负责一部分哈希槽
- 使用 CRC16(key) % 16384 计算键对应的哈希槽
- 客户端根据哈希槽定位到对应的节点
配置方式:
bash# 集群配置文件 redis.conf cluster-enabled yes cluster-config-file nodes.conf cluster-node-timeout 5000 cluster-require-full-coverage yes
创建集群:
bashredis-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
缺点:
- 不支持多键操作(除非这些键在同一个哈希槽)
- 客户端需要支持集群协议
- 事务支持有限
三种方案对比
| 特性 | 主从复制 | 哨兵模式 | 集群模式 |
|---|---|---|---|
| 数据分片 | 不支持 | 不支持 | 支持 |
| 自动故障转移 | 不支持 | 支持 | 支持 |
| 读写分离 | 支持 | 支持 | 支持 |
| 水平扩展 | 不支持 | 不支持 | 支持 |
| 复杂度 | 低 | 中 | 高 |
| 适用场景 | 简单读写分离 | 高可用场景 | 大规模数据 |
选择建议
- 数据量小,需要读写分离:使用主从复制
- 数据量小,需要高可用:使用哨兵模式
- 数据量大,需要水平扩展:使用集群模式
- 生产环境推荐:使用哨兵模式或集群模式,根据数据量选择
在实际应用中,大多数生产环境会选择哨兵模式或集群模式,以确保系统的高可用性和可扩展性。