Redis持久化(RDB/AOF/混合持久化)
2021-03-01 23:21:55 0 举报
AI智能生成
Redis持久化(RDB/AOF/混合持久化)
作者其他创作
大纲/内容
RDB
原理
redis 会单独创建(fork)一个与当前进程一模一样的子进程来进行持久化,
将数据写入到一个临时文件中,待持久化结束后替换上次持久化好的文件
将数据写入到一个临时文件中,待持久化结束后替换上次持久化好的文件
相当于两个redis进程,这期间主进程
不参与持久化,保证了redis的高性能
不参与持久化,保证了redis的高性能
这个持久化文件在哪里呢?
redis.conf 配置中默认有 dir ./ 参数,即 redis 启动时会检查当前目录是否有dump.rdb文件
注意:redis 在不同的目录启动,是有不同的数据空间的,所以我们通常把这个 dir 配置写死
触发
客户端执行 shutdown 命令时,如果没有开启 aof 会触发
配置文件中有快照配置,例如 save 900 1(15分钟内有1次修改)
执行 save 或 bgsave 命令
save 命令会阻塞主进程,一般不用
bgsave 会 fork 子进程异步持久化
执行 flushall 命令
清空内存中的数据,同时触发持久化,清空磁盘
特点
优点
恢复的时候比较快,适合大规模的数据恢复,冷备
缺点
如遇突然宕机,丢失的数据比较多
如果生成的快照文件比较大也会影响redis性能
AOF
原理
将所有的写命令追加到 AOF 缓冲区中,根据对应的写入策略向硬盘进行同步操作
由主进程完成
随着 AOF 文件越来越大,需要定期对 AOF 文件进行重写,达到压缩的目的
fork 子进程来进行
这个持久化文件在哪呢?
同 RDB 目录(dir 配置)
AOF 为什么要把命令追加到缓冲区,而不直接追加到磁盘?
触发
需手动开启:appendonly yes
线上开启:CONFIG SET appendonly yes,避免丢失数据
开启后 redis 会保留一块内存供缓冲区使用,默认是 1M
aof 和 rdb 同时开启时,只保留 save 900 1 减少 fork 子进程的次数(优化点)
写入策略:appendsync everysec
everysec:每秒同步一次,效率高,可能会丢失1秒的数据【默认也推荐使用】
no:等到缓冲区满了才写入磁盘,次数少,效率高,不安全
追求效率
always:每次发生数据变更立即同步到磁盘,效率低,安全
追求安全
重写机制
bgrewriteaof
bgrewriteaof
默认配置
auto-aof-rewrite-min-size 64M
aof 文件大于该配置时重写
由于重写会 fork 子进程,为了减少重写次数,
这里建议配置 5GB 以上(优化点)
这里建议配置 5GB 以上(优化点)
auto-aof-rewrite-percentage 100
指超过优化后大小的一倍时开始重写
重写后的文件为什么会变小?
进程内已经超时的数据不再写入文件,而且多条写命令可以合并为一条
重写使用进程内数据直接生成,新的 AOF 文件只保留最终数据的写入命令
特点
优点
以append-only模式写入,没有磁盘寻址开销,写入性能高
相比于RDB,丢失的数据更少,不过建议与RDB同时开启
缺点
不适合冷备,恢复文件大,速度慢,恢复不稳定,容易bug
混合持久化
( rdb+aof )
( rdb+aof )
配置:aof-use-rdb-preamble yes
5.0以后默认开启
优化重写机制
重写后新的AOF文件前半段是RDB格式的全量数据,后半段是AOF格式的增量数据
特点
优点
由于绝大部分都是RDB格式,加载速度快
同时结合AOF,增量的数据得以保存,数据更少丢失
缺点
兼容性差,4.0之前不支持
可读性差
redis 启动后持久化文件的加载流程?
先判断是否开启了AOF,如果存在AOF文件,则直接加载AOF文件
如果找不到AOF文件,则直接启动,不会加载RDB文件
如果没有开启AOF,会去加载RDB文件,通过RDB来持久化数据
生产环境建议 aof 和 rdb 同时使用,rdb做容灾备份
0 条评论
下一页