Redis 怎么防止数据丢失?可能真是面试必问了!
点击上方蓝字关注我们
数据持久化
主从复制
自动故障恢复
集群化
持久化方式
RDB:产生一个数据快照文件
AOF:实时追加命令的日志文件
RDB
介绍
Redis Database Backup file
(Redis数据备份文件),也被叫做Redis数据快照。save
或bgsave
命令让Redis在本地生成RDB快照文件,这个RDB文件包含了整个实例接近完整的数据内容。RDB文件数据是被压缩写入的,因此RDB文件的体积要比整个实例内存要小
当实例宕机恢复时,加载RDB文件的速度很快,能够在很短时间内迅速恢复文件中的数据
由于是某一时刻的数据快照,因此它的数据并不全
生成RDB文件的代价是比较大的,它会消耗大量的CPU和内存资源
主从全量同步数据
数据库备份
对于丢失数据不敏感的业务场景,实例宕机后快速恢复数据
定时生成RDB
Copy On Write
save
和bgsave
命令都可以生成RDB文件,但前者是在前台执行的,也就是说在生成RDB文件时,会阻塞整个实例,在RDB未生成之前,任何请求都是无法处理的,对于内存很大的实例,生成RDB文件非常耗时,显然这是我们不能接受的。bgsave
让Redis在后台生成RDB文件,这样Redis依旧可以处理客户端请求,不会阻塞整个实例。Copy On Write
技术,也就是我们熟知的fork
系统调用。fork
系统调用会产生一个子进程,它与父进程共享相同的内存地址空间,这样子进程在这一时刻就能拥有与父进程的相同的内存数据。fork
子进程时,操作系统需要拷贝父进程的内存页表给子进程,如果整个Redis实例内存占用很大,那么它的内存页表也会很大,在拷贝时就会比较耗时,同时这个过程会消耗大量的CPU资源。在完成拷贝之前父进程也处于阻塞状态,无法处理客户端请求。fork
执行完之后,子进程就可以扫描自身所有的内存数据,然后把全部数据写入到RDB文件中。Copy On Write
(写实复制)名字的由来。这样父子进程的内存就会逐渐分离,父进程申请新的内存空间并更改内存数据,子进程的内存数据不受影响。info
命令,可以看到fork
子进程的耗时,可以通过这个耗时来评估fork
时间是否符合预期。同时我们应该保证Redis机器拥有足够的CPU和内存资源,并合理设置生成RDB的时机。AOF
介绍
Append Only File
(追加日志文件)。它与RDB不同的是,AOF中记录的是每一个命令的详细信息,包括完整的命令类型、参数等。只要产生写命令,就会实时写入到AOF文件中。刷盘方式
appendfsync always
:每次写入都刷盘,对性能影响大,占用磁盘IO比较高,数据安全性高appendfsync everysec
:1秒刷一次盘,对性能影响相对较小,节点宕机时多丢失1秒的数据appendfsync no
:按照操作系统的机制刷盘,对性能影响小,数据安全性低,节点宕机丢失数据取决于操作系统刷盘机制
随着时间增长,AOF文件会越来越大
AOF文件刷盘会增加磁盘IO的负担,可能影响Redis的性能(开启每秒刷盘时)
AOF重写
性能影响
总结
链接:kaito-kidd.com/2020/06/29/redis-persistence-rdb-aof/
2020年10月22日~24日,由IT168旗下ITPUB企业社区平台主办的第十二届中国系统架构师大会(SACC2020)将在云端进行网络直播。自2009年以来,SACC架构师大会已成功举办了十一届,云集了国内CTO、研发总监、系统架构师、开发工程师和IT经理等技术人群,与会规模超千人。过去为期3天的议程,涉及20+专场,近120个主题,完整迁移到线上进行网络直播对会议。整装待发,奋起逆袭的SACC2020,期待您的报名参与,共襄盛举!
相关文章