乐闻世界logo
搜索文章和话题

Redis 的主从复制、哨兵模式和集群模式有什么区别?如何选择?

2月19日 19:37

Redis 提供了三种集群方案:主从复制、哨兵模式和集群模式,它们各有不同的适用场景和特点。

1. 主从复制(Master-Slave Replication)

工作原理: 主从复制是指将一个 Redis 节点作为主节点(Master),其他节点作为从节点(Slave)。主节点负责写操作,从节点负责读操作。主节点将数据变更同步到从节点。

特点

  • 读写分离:主节点处理写操作,从节点处理读操作,提高系统吞吐量
  • 数据备份:从节点是主节点的完整副本,提供数据冗余
  • 故障恢复:主节点故障时,需要手动将从节点提升为主节点

配置方式

bash
# 在从节点配置文件中添加 slaveof <master-ip> <master-port>

缺点

  • 主节点故障时需要手动切换,无法自动故障转移
  • 主节点的写能力受限,无法水平扩展

2. 哨兵模式(Sentinel)

工作原理: 哨兵模式是在主从复制的基础上,增加了哨兵节点。哨兵节点监控主从节点的运行状态,当主节点故障时,自动将从节点提升为主节点,实现自动故障转移。

特点

  • 自动故障转移:主节点故障时,自动选举新的主节点
  • 监控:实时监控主从节点的健康状态
  • 通知:当主节点故障时,通知管理员
  • 配置提供者:客户端可以从哨兵获取当前主节点的地址

哨兵工作流程

  1. 哨兵定期向主从节点发送 PING 命令检查健康状态
  2. 如果主节点在指定时间内无响应,哨兵会标记主节点为主观下线
  3. 当足够多的哨兵都认为主节点下线时,主节点被标记为客观下线
  4. 哨兵选举出一个领头哨兵,负责故障转移
  5. 领头哨兵从从节点中选举出新的主节点
  6. 其他从节点重新配置,指向新的主节点

配置方式

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

创建集群

bash
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

缺点

  • 不支持多键操作(除非这些键在同一个哈希槽)
  • 客户端需要支持集群协议
  • 事务支持有限

三种方案对比

特性主从复制哨兵模式集群模式
数据分片不支持不支持支持
自动故障转移不支持支持支持
读写分离支持支持支持
水平扩展不支持不支持支持
复杂度
适用场景简单读写分离高可用场景大规模数据

选择建议

  1. 数据量小,需要读写分离:使用主从复制
  2. 数据量小,需要高可用:使用哨兵模式
  3. 数据量大,需要水平扩展:使用集群模式
  4. 生产环境推荐:使用哨兵模式或集群模式,根据数据量选择

在实际应用中,大多数生产环境会选择哨兵模式或集群模式,以确保系统的高可用性和可扩展性。

标签:Redis