Redis 持久化实现方式ios
将redis内存中的数据,完整的生成一个快照,以.rdb结尾的文件保存在硬盘上,当须要恢复时,再从文件加载到内存中。redis
[vagrant@tmwy ~]$ redis-cli 127.0.0.1:6379> save OK
save执行时,会形成Redis的阻塞。全部数据操做命令都要排队等待它完成。
文件策略:新生成一个新的临时文件,当save执行完后,用新的替换老的。缓存
[vagrant@tmwy ~]$ redis-cli 127.0.0.1:6379> bgsave Background saving started
客户端对Redis服务器下达bgsave命令时,Redis会fork出一个子进程进行rdb文件的生成。当文件生成完毕后,子进程再反馈给主进程。fork子进程时也会阻塞,不过正常状况下fork过程都很是快的。
文件策略:与save命令相同。安全
配置 | seconds | changes | 做用 |
---|---|---|---|
save | 900 | 1 | 900秒内改变1条数据、自动生成rdb文件 |
save | 300 | 10 | 300秒内改变10条数据、自动生成rdb文件 |
save | 60 | 10000 | 60秒内改变10000条数据、自动生成rdb文件 |
PS: 这三种规则都不建议使用。服务器
# 配置自动生成规则。通常不建议配置自动生成rdb文件 save 900 1 save 300 10 save 60 10000 # 指定rdb文件名 dbfilename dump-${port}.rdb # 指定rdb文件目录 dir /opt/redis/data # bgsave发生错误,中止写入 stop-writes-on-bgsave-error yes # rdb文件采用压缩格式 rdbcompression yes # 对rdb文件进行校验 rdbchecksum yes
就是写日志,每次执行Redis写命令,让命令同时记录日志(以.aof结尾的日志文件)。Redis宕机时,只要进行日志回放就能够恢复数据。微信
首先redis执行写命令将命令刷新到硬盘缓冲区中网络
命令 | 优势 | 缺点 |
---|---|---|
always | 不丢失数据 | IO开销大,通常的sata盘只有几百TPS |
everysec | 只丢一秒数据 | 丢了一秒数据 |
no | 系统决定 | 不可控,不知道何时刷盘,也不知道会丢失多少数据 |
一般使用everysec策略,这也是AOF的默认策略。app
AOF重写就是把过时的、没用的、重复的以及可优化的命令,进行化简。只取最终有价值的结果。虽然写入操做很频繁,但系统定义的key的量是相对有限的。
AOF重写能够大大压缩最终日志文件的大小。从而减小磁盘占用量,加快数据恢复速度。好比咱们有个计数的服务,有不少自增的操做,好比有一个key自增到1个亿,对AOF文件来讲就是一亿次incr。AOF重写就只用记1条记录。运维
AOF 重写配置异步
AOF自动重写的触发时机,需同时知足如下两点:
# 开启正常AOF的append刷盘操做 appendonly yes # AOF文件名 appendfilename "appendonly-${port}.aof" # 每秒刷盘 appendfsync everysec # 文件目录 dir /opt/redis/data # AOF重写增加率 auto-aof-rewrite-percentage 100 # AOF重写最小尺寸 auto-aof-rewrite-min-size 64mb # AOF重写期间是否暂停append操做。AOF重写很是消耗磁盘性能,而正常的AOF过程当中也会往磁盘刷数据。 # 一般偏向考虑性能,设为yes。万一重写失败了,这期间正常AOF的数据会丢失,由于咱们选择了重写期间放弃了正常AOF刷盘。 no-appendfsync-on-rewrite yes
命令 | RDB | AOF | 说明 |
---|---|---|---|
启动优先级 | 低 | 高 | RDB和AOF都开启的状况下,Redis重启后,选择AOF进行恢复。大部分状况下它保存了比RDB更新的数据 |
体积 | 小 | 大 | RDB二进制模式存储,并且作了压缩。AOF虽然有AOF重写,可是体积相对仍是大不少,毕竟它是记日志形式 |
恢复速度 | 快 | 慢 | RDB体积小,恢复速度快。AOF体积大,恢复速度慢 |
数据安全 | 丢数据 | 根据策略决定 | RDB丢上次快照后的数据,AOF根据always、everysec、no策略决定是否丢数据 |
轻重 | 重 | 轻 | AOF是追加日志,因此比较轻的操做。而RDB是CPU密集型操做,对磁盘,以及fork时对内存的消耗都比较大 |
fork是一个同步操做。执行bgsave和bgrewriteaof时都会执行fork操做
改善fork
bgsave和bgrewriteaof会进行fork操做产生子进程。
CPU
内存
硬盘
优化:
AOF阻塞定位
Asynchronous AOF fsync is taking to long(disk is busy?). Writing the AOF buffer whitout waiting for fsync to complete, this may slow down Redis
127.0.0.1:6379> info persistence ...... ...... aof_delayed_fsync: 100 ...... ......
改善方式
同子进程的硬盘优化
PS: 更多文章请关注微信公众号:浮话