Redis-如何持久化保证高可用

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做增量持久化

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容