RDB--备份数据库状态
Redis通过RDB(快照)完成持久化,即保存某个时间点的全量数据快照
save:阻塞Redis的服务器进程,知道RDB文件被创建完成
bgsave:Fork出一个子进程来创建RDB文件,不阻塞服务器进程,并且实现了Copy-on-Write
---可以通过定时脚本定时调用bgsave指令进行定期备份
redis.conf
配置快照频次
save 900 1 #900秒内如果超过1个key被修改,则发起快照保存
save 300 10 #300秒内容如超过10个key被修改,则发起快照保存
save 60 10000
save "" #禁用RDB
当备份进程出错,主进程停止接收新的写入操作--保护持久化数据一致性
stop-writes-on-bgsave-error yes
备份是压缩rdb文件,建议关闭,redis是CPU密集型服务器,开启会带来更多的CPU的消耗
rdbcompression yes
自动化触发RDB持久化的方式
根据redis.conf文件配置里的SAVE m n 定时触发(用的是BGSAVE)
主从复制时,主节点自动触发
执行Debug Reload
执行Shoutdown且没有启动AOF持久化
Copy-on-Write
fork()之后,kernel把父进程中所有的内存页的权限都设为read-only,然后子进程的地址空间指向父进程。当父子进程都只读内存时,相安无事。当其中某个进程写内存时,CPU硬件检测到内存页是read-only的,于是触发页异常中断(page-fault),陷入kernel的一个中断例程。中断例程中,kernel就会把触发的异常的页复制一份,于是父子进程各自持有独立的一份。
fork()和exec()
fork是类Unix操作系统上创建进程的主要方法。fork用于创建子进程(等同于当前进程的副本)。
exec函数则装载一个新的程序(可执行映像)覆盖当前进程内存空间中的映像,从而执行不同的任务。
缺点
内存数据全量同步,数据量大会因I/O而影响性能
可能会因为Redis挂掉而丢失从当前值最近一次RDB期间的数据
AOF(Append-Onli-File)--备份数据库接收到的指令
记录下除了查询意外的所有变更数据库状态的指令
以append的形式追加保存到AOF文件中(增量)
redis.conf
appendonly yes #开启AOF备份
appendfsync always #总是写入aof文件,并完成磁盘同步
appendfsync everysec #每一秒写入aof文件,并完成磁盘同步
appendfsync no #写入aof文件,不等待磁盘同步
通过日志重写解决AOF文件大小不断增加问题
调用fork()创建子进程
子进程把新的AOF写到一个临时文件中,不依赖原文件
主进程持续将新的变动同时写入内存和原文件
主进程获取子进程重写AOF的完成信号,往新的AOF同步增量变动
使用新的AOF文件替换掉旧的AOF文件
Redis数据恢复
先判断AOF是否存在,若存在则直接加载AOF文件完成恢复,若不存在则加载RDB文件完成恢复
RDB与AOF优缺点
RDB
优点:全量数据快照,文件小,恢复快
缺点:无法保存最近一次快照后的数据
AOF
有点:可读性搞,适合保存全量数据,数据不易丢失
缺点:文件体积大,恢复时间长
Redis4.0后采用RDB-AOF混合持久化方式
BGSAVE做镜像全量持久化,AOF做增量持久化