【Redis】AOF重写策略与后台重写机制

目录

  • 1、背景
  • 2、AOF重写策略
    • 【1】自动触发策略
    • 【2】手动触发策略
    • 【3】混合持久化策略(redis 4.0+)
  • 3、后台重写(BGREWRITEAOF)实现机制
    • 【1】整体流程
    • 【2】关键技术实现
    • 【3】文件处理流程

1、背景

AOF(Append Only File)重写是redis持久化中的一个重要机制,用于解决AOF文件不断增长的问题。

2、AOF重写策略

【1】自动触发策略

redis通过两个关键参数控制自动触发AOF重写的策略:

[root@xxx]# cat /xxx/redis.conf | grep 'auto-aof-rewrite'
auto-aof-rewrite-percentage 300
auto-aof-rewrite-min-size 1G

触发条件为:

1、当前AOF文件大小 > auto-aof-rewrite-percentage
2、(当前AOF大小 - 上次重写AOF大小) / 上次重写后AOF大小 ≥ auto-aof-rewrite-min-size

【2】手动触发策略

通过命令强制触发重写:

#异步后台重写
redis-cli BGREWRITEAOF

#同步重写(会阻塞服务器,不推荐生产使用)
redis-cli REWRITEAOF

【3】混合持久化策略(redis 4.0+)

开启混合持久化的配置为:

[root@xxx]# cat /xxx/redis.conf | grep 'aof-use-rdb'
aof-use-rdb-preamble yes

开启后有如下特性:

1、重写后的AOF文件前半部分是RDB格式的快照
2、后半部分是增量AOF命令
3、结合了RDB快速加载和AOF实时性的优势

3、后台重写(BGREWRITEAOF)实现机制

【1】整体流程

1、主进程收到重写请求
2、fork()创建子进程
3、子进程执行重写,遍历数据库生成最小命令集,写入临时文件
4、主进程继续服务,将新命令写入常规AOF缓冲区,同时写入重写缓冲区
5、子进程完成时,主进程将重写缓冲区内容追加到新文件,原子性替换旧AOF文件

【2】关键技术实现

写时复制(Copy-On-Write)

1、子进程通过fork()创建,共享父进程内存空间
2、只有在数据修改时才复制内存

双缓冲区设计

缓冲区 用途 同步时机
AOF缓冲区 正常客户端命令 根据appendfsync配置
AOF重写缓冲区 重写期间的新命令 仅在重写完成后同步

增量同步机制

1、子进程完成初始化快照后
2、主进程将重写期间的新命令追加到新文件
3、确保数据完整性

【3】文件处理流程

1、创建临时文件temp-rewriteaof-bg-[pid].aof
2、写入RDB头(如果开启混合持久化)
3、追加AOF命令
4、完成时执行fsync()确保数据落盘,rename()原子替换旧文件

你可能感兴趣的:(Redis,redis,数据库,缓存)