1. RDB
全量
fork
redis.conf
//default configuration
save 900 1
save 300 10
save 60 10000
command
> SAVE
> BGSAVE
- BGSAVE 命令
- rdbSaveBackground()
- redisFork()创建子进程
- fork()生成父子进程
fork()返回
返回0,当前是子进程。
返回-1,当前是父进程,子进程失败。
返回其他,当前是父进程。
fork()特性
子进程获得和父进程相同的内存空间(代码段、数据段)。
父子进程都会执行fork()后的代码。
创建子进程不会立刻大量内存拷贝。内存被修改时以页为单位拷贝,再次避免大量内存拷贝。(写时拷贝,copy on write)
copy on write
- 解释
fork后,子进程地址空间指向父进程,父进程使用原来的物理内存空间。
子进程对内存空间有写入操作时,给子进程分配物理空间。
- 原理
- fork()后,kernel设置父进程所有内存页权限设置为read-only,子进程地址空间指向父进程。
- 父子进程都读内存时,没有影响。
- 其中一个进程写内存时,CPU硬件检测到内存页是read-only,触发页异常中断(page-fault),陷入kernel中断例程。
- 中断例程中,kernel 把触发异常的页复制一份。
2. AOF:增量
增量
redis.conf
// default
appendonly no
appendfilename "appendonly.aof"
# appendfsync always
appendfsync everysec
# appendfsync no
AOF重写
记录修改指令。
校验 > 存储 > 执行
- AOF重写(瘦身)
BGREWRITEAOF
指令
根据原来的AOF文件结果序列化新的AOF文件
对过程中新的指令追加到新AOF文件
替换旧AOF文件
fsync
强制把page-cache强制sync到磁盘。
进一步降低数据丢失情况。
阻塞,主进程负责。
3. 其他
redis-4.0开始启用混合持久化和重放
网友评论