云计算百科
云计算领域专业知识百科平台

3、Redis持久化、主从和哨兵

一、Redis持久化机制

1. RDB快照(Snapshot)
  • 核心原理:

    • 全量二进制备份,保存为dump.rdb文件
    • 触发条件:save 60 1000 # 60秒内至少1000次修改触发
      save 300 10 # 300秒内至少10次修改触发

    • 手动触发:
      • SAVE:同步保存,阻塞主线程
      • BGSAVE:异步保存,fork子进程操作(推荐)
  • COW机制(Copy-On-Write):

    #mermaid-svg-ItTb0naRZqIneFy5 {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-ItTb0naRZqIneFy5 .error-icon{fill:#552222;}#mermaid-svg-ItTb0naRZqIneFy5 .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-ItTb0naRZqIneFy5 .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-ItTb0naRZqIneFy5 .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-ItTb0naRZqIneFy5 .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-ItTb0naRZqIneFy5 .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-ItTb0naRZqIneFy5 .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-ItTb0naRZqIneFy5 .marker{fill:#333333;stroke:#333333;}#mermaid-svg-ItTb0naRZqIneFy5 .marker.cross{stroke:#333333;}#mermaid-svg-ItTb0naRZqIneFy5 svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-ItTb0naRZqIneFy5 .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-ItTb0naRZqIneFy5 .cluster-label text{fill:#333;}#mermaid-svg-ItTb0naRZqIneFy5 .cluster-label span{color:#333;}#mermaid-svg-ItTb0naRZqIneFy5 .label text,#mermaid-svg-ItTb0naRZqIneFy5 span{fill:#333;color:#333;}#mermaid-svg-ItTb0naRZqIneFy5 .node rect,#mermaid-svg-ItTb0naRZqIneFy5 .node circle,#mermaid-svg-ItTb0naRZqIneFy5 .node ellipse,#mermaid-svg-ItTb0naRZqIneFy5 .node polygon,#mermaid-svg-ItTb0naRZqIneFy5 .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-ItTb0naRZqIneFy5 .node .label{text-align:center;}#mermaid-svg-ItTb0naRZqIneFy5 .node.clickable{cursor:pointer;}#mermaid-svg-ItTb0naRZqIneFy5 .arrowheadPath{fill:#333333;}#mermaid-svg-ItTb0naRZqIneFy5 .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-ItTb0naRZqIneFy5 .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-ItTb0naRZqIneFy5 .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-ItTb0naRZqIneFy5 .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-ItTb0naRZqIneFy5 .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-ItTb0naRZqIneFy5 .cluster text{fill:#333;}#mermaid-svg-ItTb0naRZqIneFy5 .cluster span{color:#333;}#mermaid-svg-ItTb0naRZqIneFy5 div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-ItTb0naRZqIneFy5 :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}fork修改数据主线程子进程读取内存数据复制数据副本写入RDB文件

  • RDB优缺点:

    优点缺点
    文件紧凑,恢复速度快 数据安全性低(可能丢失最后一次快照后的数据)
    最大化Redis性能 大数据量时fork耗时可能阻塞服务
    适合灾难恢复 不支持增量备份
2. AOF追加文件(Append Only File)
  • 核心原理:

    • 记录所有写操作命令(RESP协议格式)
    • 写入策略:appendfsync always # 每次写都刷盘(安全但性能差)
      appendfsync everysec # 每秒刷盘(推荐)
      appendfsync no # 依赖操作系统刷盘(最快但可能丢失数据)

  • AOF重写(Rewrite):

    • 触发条件:auto-aof-rewrite-percentage 100 # 文件增长100%触发
      auto-aof-rewrite-min-size 64mb # 最小重写文件大小

    • 重写过程:
    • fork子进程扫描内存数据
    • 生成新AOF文件(包含最小命令集)
    • 替换旧文件(原子操作)
  • AOF优缺点:

    优点缺点
    数据安全性高(最多丢失1秒数据) 文件体积大
    支持断点续传 恢复速度比RDB慢
    可读性强(RESP文本格式) 写入性能略低于RDB
3. 混合持久化(Redis 4.0+)
  • 配置启用:aof-use-rdb-preamble yes
  • 文件结构:[RDB头部] + [增量AOF命令]
  • 优势:
    • 快速加载RDB部分
    • 完整数据保障(AOF增量)

二、主从复制架构

1. 搭建步骤

# 从节点配置
replicaof 192.168.0.55 6379 # Redis 5.0+
slave-read-only yes # 从节点只读

2. 工作原理
  • 全量复制:#mermaid-svg-l90uJvzyw2UzKxet {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-l90uJvzyw2UzKxet .error-icon{fill:#552222;}#mermaid-svg-l90uJvzyw2UzKxet .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-l90uJvzyw2UzKxet .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-l90uJvzyw2UzKxet .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-l90uJvzyw2UzKxet .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-l90uJvzyw2UzKxet .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-l90uJvzyw2UzKxet .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-l90uJvzyw2UzKxet .marker{fill:#333333;stroke:#333333;}#mermaid-svg-l90uJvzyw2UzKxet .marker.cross{stroke:#333333;}#mermaid-svg-l90uJvzyw2UzKxet svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-l90uJvzyw2UzKxet .actor{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-l90uJvzyw2UzKxet text.actor>tspan{fill:black;stroke:none;}#mermaid-svg-l90uJvzyw2UzKxet .actor-line{stroke:grey;}#mermaid-svg-l90uJvzyw2UzKxet .messageLine0{stroke-width:1.5;stroke-dasharray:none;stroke:#333;}#mermaid-svg-l90uJvzyw2UzKxet .messageLine1{stroke-width:1.5;stroke-dasharray:2,2;stroke:#333;}#mermaid-svg-l90uJvzyw2UzKxet #arrowhead path{fill:#333;stroke:#333;}#mermaid-svg-l90uJvzyw2UzKxet .sequenceNumber{fill:white;}#mermaid-svg-l90uJvzyw2UzKxet #sequencenumber{fill:#333;}#mermaid-svg-l90uJvzyw2UzKxet #crosshead path{fill:#333;stroke:#333;}#mermaid-svg-l90uJvzyw2UzKxet .messageText{fill:#333;stroke:#333;}#mermaid-svg-l90uJvzyw2UzKxet .labelBox{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-l90uJvzyw2UzKxet .labelText,#mermaid-svg-l90uJvzyw2UzKxet .labelText>tspan{fill:black;stroke:none;}#mermaid-svg-l90uJvzyw2UzKxet .loopText,#mermaid-svg-l90uJvzyw2UzKxet .loopText>tspan{fill:black;stroke:none;}#mermaid-svg-l90uJvzyw2UzKxet .loopLine{stroke-width:2px;stroke-dasharray:2,2;stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);}#mermaid-svg-l90uJvzyw2UzKxet .note{stroke:#aaaa33;fill:#fff5ad;}#mermaid-svg-l90uJvzyw2UzKxet .noteText,#mermaid-svg-l90uJvzyw2UzKxet .noteText>tspan{fill:black;stroke:none;}#mermaid-svg-l90uJvzyw2UzKxet .activation0{fill:#f4f4f4;stroke:#666;}#mermaid-svg-l90uJvzyw2UzKxet .activation1{fill:#f4f4f4;stroke:#666;}#mermaid-svg-l90uJvzyw2UzKxet .activation2{fill:#f4f4f4;stroke:#666;}#mermaid-svg-l90uJvzyw2UzKxet .actorPopupMenu{position:absolute;}#mermaid-svg-l90uJvzyw2UzKxet .actorPopupMenuPanel{position:absolute;fill:#ECECFF;box-shadow:0px 8px 16px 0px rgba(0,0,0,0.2);filter:drop-shadow(3px 5px 2px rgb(0 0 0 / 0.4));}#mermaid-svg-l90uJvzyw2UzKxet .actor-man line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;}#mermaid-svg-l90uJvzyw2UzKxet .actor-man circle,#mermaid-svg-l90uJvzyw2UzKxet line{stroke:hsl(259.6261682243, 59.7765363128%, 87.9019607843%);fill:#ECECFF;stroke-width:2px;}#mermaid-svg-l90uJvzyw2UzKxet :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}SlaveMaster1. 发送PSYNC命令,请求同步数据,在这之前会跟master建立长连接2. 收到PSYNC,进行数据持久化,通过bgsave生成最新的rdb文件3. 发送RDB文件4. 清空旧数据5. 加载RDB6. 生成rdb之后的写命令,被master缓存在内存中7. 发送缓存命令8 加载缓存命令SlaveMaster
  • 部分复制(PSYNC):
    • 基于offset和repl_backlog_buffer实现断点续传
3. 复制风暴优化

#mermaid-svg-5EBcmFCHPFtdtjLt {font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-5EBcmFCHPFtdtjLt .error-icon{fill:#552222;}#mermaid-svg-5EBcmFCHPFtdtjLt .error-text{fill:#552222;stroke:#552222;}#mermaid-svg-5EBcmFCHPFtdtjLt .edge-thickness-normal{stroke-width:2px;}#mermaid-svg-5EBcmFCHPFtdtjLt .edge-thickness-thick{stroke-width:3.5px;}#mermaid-svg-5EBcmFCHPFtdtjLt .edge-pattern-solid{stroke-dasharray:0;}#mermaid-svg-5EBcmFCHPFtdtjLt .edge-pattern-dashed{stroke-dasharray:3;}#mermaid-svg-5EBcmFCHPFtdtjLt .edge-pattern-dotted{stroke-dasharray:2;}#mermaid-svg-5EBcmFCHPFtdtjLt .marker{fill:#333333;stroke:#333333;}#mermaid-svg-5EBcmFCHPFtdtjLt .marker.cross{stroke:#333333;}#mermaid-svg-5EBcmFCHPFtdtjLt svg{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:16px;}#mermaid-svg-5EBcmFCHPFtdtjLt .label{font-family:\”trebuchet ms\”,verdana,arial,sans-serif;color:#333;}#mermaid-svg-5EBcmFCHPFtdtjLt .cluster-label text{fill:#333;}#mermaid-svg-5EBcmFCHPFtdtjLt .cluster-label span{color:#333;}#mermaid-svg-5EBcmFCHPFtdtjLt .label text,#mermaid-svg-5EBcmFCHPFtdtjLt span{fill:#333;color:#333;}#mermaid-svg-5EBcmFCHPFtdtjLt .node rect,#mermaid-svg-5EBcmFCHPFtdtjLt .node circle,#mermaid-svg-5EBcmFCHPFtdtjLt .node ellipse,#mermaid-svg-5EBcmFCHPFtdtjLt .node polygon,#mermaid-svg-5EBcmFCHPFtdtjLt .node path{fill:#ECECFF;stroke:#9370DB;stroke-width:1px;}#mermaid-svg-5EBcmFCHPFtdtjLt .node .label{text-align:center;}#mermaid-svg-5EBcmFCHPFtdtjLt .node.clickable{cursor:pointer;}#mermaid-svg-5EBcmFCHPFtdtjLt .arrowheadPath{fill:#333333;}#mermaid-svg-5EBcmFCHPFtdtjLt .edgePath .path{stroke:#333333;stroke-width:2.0px;}#mermaid-svg-5EBcmFCHPFtdtjLt .flowchart-link{stroke:#333333;fill:none;}#mermaid-svg-5EBcmFCHPFtdtjLt .edgeLabel{background-color:#e8e8e8;text-align:center;}#mermaid-svg-5EBcmFCHPFtdtjLt .edgeLabel rect{opacity:0.5;background-color:#e8e8e8;fill:#e8e8e8;}#mermaid-svg-5EBcmFCHPFtdtjLt .cluster rect{fill:#ffffde;stroke:#aaaa33;stroke-width:1px;}#mermaid-svg-5EBcmFCHPFtdtjLt .cluster text{fill:#333;}#mermaid-svg-5EBcmFCHPFtdtjLt .cluster span{color:#333;}#mermaid-svg-5EBcmFCHPFtdtjLt div.mermaidTooltip{position:absolute;text-align:center;max-width:200px;padding:2px;font-family:\”trebuchet ms\”,verdana,arial,sans-serif;font-size:12px;background:hsl(80, 100%, 96.2745098039%);border:1px solid #aaaa33;border-radius:2px;pointer-events:none;z-index:100;}#mermaid-svg-5EBcmFCHPFtdtjLt :root{–mermaid-font-family:\”trebuchet ms\”,verdana,arial,sans-serif;}MasterSlave1Slave2Slave3Slave4


三、哨兵高可用架构

1. 哨兵配置

sentinel monitor mymaster 192.168.0.55 6379 2
sentinel down-after-milliseconds mymaster 5000
sentinel failover-timeout mymaster 60000

2. 故障转移流程
  • 主观下线(SDOWN)
  • 客观下线(ODOWN)
  • 选举Leader哨兵
  • 执行故障转移
  • 3. Java客户端集成

    // Jedis哨兵连接池
    Set<String> sentinels = new HashSet<>();
    sentinels.add("192.168.0.55:26379");
    JedisSentinelPool pool = new JedisSentinelPool("mymaster", sentinels);


    四、Spring Boot集成示例

    1. 配置模板

    spring:
    redis:
    sentinel:
    master: mymaster
    nodes: 192.168.0.55:26379,192.168.0.55:26380
    lettuce:
    pool:
    max-active: 20
    max-wait: 1000

    2. 操作模板

    @RestController
    public class TestController {
    @Autowired
    private StringRedisTemplate redisTemplate;

    @GetMapping("/set")
    public String setKey(String key, String value) {
    redisTemplate.opsForValue().set(key, value);
    return "OK";
    }
    }


    五、数据备份策略

  • 定时备份脚本:

    #!/bin/bash
    cp /var/lib/redis/dump.rdb /backup/redis/$(date +%Y%m%d%H).rdb
    find /backup/redis -mtime +2 -delete

  • 跨机房备份:

    rsync -avz /backup/redis/ user@backup-server:/redis_backup/


  • 六、性能优化关键参数

    参数建议值说明
    maxmemory 物理内存的70% 防止OOM
    maxmemory-policy volatile-lru 淘汰策略
    tcp-backlog 511 高并发连接队列
    repl-backlog-size 128MB 主从复制缓冲区
    client-output-buffer-limit 256MB 64MB 60 客户端输出缓冲区限制

    七、常见问题解决方案

    Q1: 主从数据不一致?
    • 方案:
      • 检查网络延迟
      • 增大repl-backlog-size
      • 使用WAIT命令同步复制
    Q2: AOF文件过大?
    • 方案:
      • 手动执行BGREWRITEAOF
      • 调整重写触发阈值
    Q3: 故障转移时间过长?
    • 方案:
      • 调小down-after-milliseconds
      • 增加哨兵节点数量

    通过合理配置持久化策略和搭建高可用架构,Redis可满足企业级生产环境需求。建议根据业务特点选择RDB+AOF混合模式,并配合哨兵实现自动故障转移。

    赞(0)
    未经允许不得转载:网硕互联帮助中心 » 3、Redis持久化、主从和哨兵
    分享到: 更多 (0)

    评论 抢沙发

    评论前必须登录!