Redis

Redis 三种高可用方案完整详解

·12 分钟阅读·4780 字
📋 目录

Redis 三种高可用方案完整详解

核心概念 Redis 高可用三种方案:主从复制、Sentinel 哨兵模式、Redis Cluster 集群模式,各有适用场景。

1. 前置区分三种架构适用场景

  1. 主从复制:仅数据备份、读写分离,无自动故障转移,无高可用,单机主挂业务中断;
  2. 哨兵 Sentinel:一主多从 + 哨兵集群,自动故障切换,适合单分片中小业务(数据量几十G内);
  3. Redis Cluster 分片集群:16384个槽位分片,横向扩容存储,每个分片自带主从哨兵,适合大数据量、高并发业务。

一、方案1:哨兵高可用(Sentinel 主流中小型业务)

2. 架构组成

  • 1个Master + N个Replica从节点(推荐至少1主2从)
  • 至少3个Sentinel哨兵实例(奇数,防止脑裂,独立部署不同机器)
    核心能力:
  1. 持续监控主、从节点存活状态;
  2. 主节点宕机,哨兵集群投票自动选举最优从升级为新Master;
  3. 自动修改剩余从节点复制新主;
  4. 对外提供统一服务地址,客户端自动感知新主IP。

3. 部署规划示例(3台机器)

机器Redis实例Sentinel实例
node1Master 6379Sentinel 26379
node2Replica1 6379Sentinel 26379
node3Replica2 6379Sentinel 26379

4. Redis主从基础配置

4.1. Master redis.conf 关键配置

port 6379
bind 0.0.0.0
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis/6379.log"
dbfilename dump.rdb
dir /data/redis/6379
# 持久化保障,主必须开启
appendonly yes
appendfilename "appendonly.aof"
# 密码(线上必开)
requirepass Redis@123
# 从库同步密码
masterauth Redis@123

4.2. Replica从库配置(仅增加replicaof)

# 其余配置和主一致,追加
replicaof node1 6379
replica-read-only yes
masterauth Redis@123

启动三台redis,验证主从同步:

redis-cli -a Redis@123 info replication

5. Sentinel哨兵配置 sentinel.conf(三台哨兵完全一致)

port 26379
daemonize yes
logfile "/var/log/redis/sentinel.log"
pidfile /var/run/sentinel_26379.pid
# 格式:sentinel monitor 集群名 主IP 端口 投票法定人数(哨兵半数+1)
sentinel monitor mymaster node1 6379 2
# 主节点密码
sentinel auth-pass mymaster Redis@123
# 哨兵判定节点失联毫秒(30000=30s)
sentinel down-after-milliseconds mymaster 30000
# 故障切换时,同时并行同步新主的从库数量
sentinel parallel-syncs mymaster 1
# 故障切换超时时间
sentinel failover-timeout mymaster 180000
# 禁止哨兵自动重置配置文件保护
sentinel config-epoch mymaster 0

6. 启动与验证

# 启动redis
redis-server /etc/redis/6379.conf
# 启动哨兵
redis-sentinel /etc/redis/sentinel.conf

# 查看集群监控状态
redis-cli -p 26379
127.0.0.1:26379> info sentinel
127.0.0.1:26379> sentinel masters
127.0.0.1:26379> sentinel replicas mymaster

7. 故障切换流程

  1. 某哨兵发现Master无法ping通,标记为主观下线SDOWN
  2. 同步询问其余哨兵,超过法定票数判定客观下线ODOWN
  3. 哨兵集群发起投票,选举一个哨兵作为故障切换执行者;
  4. 筛选合格从库:优先级最高、复制偏移量最新、无故障;
  5. 发送指令将选中从提升为Master;
  6. 剩余从节点自动replicaof新主;
  7. 客户端通过哨兵获取最新主节点地址,自动重连。

8. 哨兵生产避坑

  1. 哨兵数量必须奇数3/5台,防止脑裂;
  2. 主节点必须开启AOF/RDB持久化,否则宕机丢失全量数据;
  3. 配置min-replicas-to-write半同步,减少数据丢失;
  4. 客户端必须使用哨兵模式连接,不能硬编码主IP;
  5. 防火墙放行6379、26379端口互通。

二、方案2:Redis Cluster 分片集群(大数据量高并发标准)

9. 核心原理

  1. 哈希槽分区:总共 16384个slot,均匀分配给多个Master分片;
  2. 每个Master配套1~N个Replica从库,分片内部主从复制;
  3. 集群内置简易哨兵能力,分片主宕机自动切换从;
  4. 横向扩容:新增分片自动迁移槽位,无需停机;
  5. 客户端自动路由key到对应分片,跨槽事务有限制。

10. 标准部署架构(3主3从最小生产架构)

共6个Redis实例,3台服务器交叉部署避免单点故障:

  • node1:master1(6379)、replica3(6382)
  • node2:master2(6380)、replica1(6379)
  • node3:master3(6381)、replica2(6380)

11. 单实例集群核心配置 redis-cluster.conf

port 6379
bind 0.0.0.0
daemonize yes
pidfile /var/run/redis_6379.pid
logfile "/var/log/redis/cluster_6379.log"
dbfilename dump.rdb
dir /data/redis/cluster/6379
appendonly yes
requirepass Redis@123
masterauth Redis@123
# 集群开关
cluster-enabled yes
# 集群节点信息持久文件
cluster-config-file nodes-6379.conf
# 节点失联超时
cluster-node-timeout 15000
# 从库不参与哈希槽分配,仅备份
replica-read-only yes

12. 一键创建集群命令(Redis5+ redis-cli —cluster)

  1. 全部6个实例启动完成,互通端口;
  2. 执行创建命令,分配3主3从:
redis-cli --cluster create \
node1:6379 node2:6380 node3:6381 \
node2:6379 node3:6380 node1:6382 \
--cluster-replicas 1 -a Redis@123

--cluster-replicas 1 代表每个主分配1个从节点。

13. 集群常用运维命令

# 查看集群整体状态
redis-cli -c -a Redis@123 --cluster check node1:6379

# 查看槽位分配
redis-cli -c -a Redis@123 --cluster slots node1:6379

# 新增主分片扩容
redis-cli --cluster add-node new-node:6379 现有主节点:6379 -a xxx
# 手动迁移槽位均衡分片
redis-cli --cluster rebalance node1:6379 -a xxx

# 故障手动切换(分片主宕机)
redis-cli --cluster failover node:port -a xxx

14. Cluster 高可用故障切换逻辑

  1. 集群各节点互相PING/PONG心跳;
  2. 分片主失联,集群内其余节点投票;
  3. 该分片下正常从库升级为新Master,承接对应slot;
  4. 旧主恢复后自动变为新主的从节点;
  5. 客户端-c参数自动跳转key所属分片,无需手动处理路由。

15. Cluster 限制(业务开发必须注意)

  1. 多key操作必须落在同一个哈希槽,否则不支持事务/mset;
    解决方案:哈希标签 {tag}key1 {tag}key2 强制同槽;
  2. 不支持多库(db0以外db1/db2失效);
  3. 跨分片复杂聚合、keys * 遍历性能极差;
  4. 扩容迁移槽位会短暂阻塞对应key写入。

三、哨兵 vs Cluster 选型对比

维度Sentinel 哨兵Redis Cluster 分片集群
数据容量单节点上限,几十G多分片横向扩容,TB级
分片能力无,全量数据存一套主从16384槽位分片,分布式存储
故障转移独立哨兵集群投票集群内置节点投票
事务支持完整多key事务仅同槽多key支持事务
适用场景中小型缓存、单库业务海量数据、百万QPS高并发
扩容方式只能垂直升级机器配置水平新增分片无缝扩容

四、通用生产高可用最佳实践

16. 持久化规范

  1. 主节点必须同时开启 RDB + AOF;
  2. AOF策略:everysec 折中平衡性能与数据安全;
  3. 禁止关闭持久化,主重启直接清空内存数据。

17. 复制高可用优化

  1. 调大repl-backlog-size 128mb减少频繁全量同步;
  2. 开启半同步 min-replicas-to-write 1,至少1个从同步成功再返回写入;
  3. 调整slave输出缓冲区,避免同步连接断开。

18. 内存与淘汰策略

maxmemory 80gb
maxmemory-policy volatile-lru

限制内存,防止OOM杀死进程;缓存场景用LRU淘汰过期key。

19. 安全加固

  1. 强密码requirepass,主从同步配置masterauth;
  2. bind内网IP,禁止公网直接暴露6379;
  3. 禁用危险命令:flushall、config、keys;
  4. 防火墙仅放行集群、哨兵互通端口。

20. 监控指标(高可用告警必备)

  1. 哨兵:主观/客观下线、故障切换记录;
  2. 主从:复制偏移量差、同步延迟、全量同步事件;
  3. Cluster:槽位缺失、分片离线、集群状态fail;
  4. 内存、持久化AOF阻塞、CPU、客户端连接数。

五、快速搭建步骤总结

21. 哨兵部署流程

  1. 部署多台Redis,配置一主多从复制;
  2. 3台独立机器部署Sentinel;
  3. 配置哨兵监控主节点、投票阈值;
  4. 启动所有redis与sentinel,验证自动故障切换。

22. Redis Cluster部署流程

  1. 多机器交叉部署主从实例,全部开启cluster-enabled;
  2. 使用redis-cli —cluster create一键组建3主3从集群;
  3. 检查槽位分配、主从复制状态;
  4. 业务客户端使用 -c 集群模式连接。

关联文档