(Redis设计与实现-4) 持久化
一.RDB
RDB(Redis DataBase),也常叫做snapshots:是在某个时间点将数据写入一个临时文件,持久化结束后,用这个临时文件替换上次持久化的文件,达到数据恢复。 snapshot首先将数据写入临时文件,当成功结束后,将临时文件重名为dump.rdb。//使用配置文件进行持久化 save 900 1 #900秒内如果超过1个key被修改,则发起快照保存 save 300 10 #300秒内如果超过10个key被修改,则发起快照保存 //使用命令进行持久化 redis-cli -h ip -p port save #用主线程进行持久化,这种方式会阻塞所有client请求 redis-cli -h ip -p port bgsave #另外开启一条子线程进行持久化
二.AOF
AOF(Append-only file):将“操作 + 数据”以格式化指令的方式追加到操作日志文件的尾部,在append操作返回后(已经写入到文件或者即将写入),才进行实际的数据变更,“日志文件”保存了历史所有的操作过程;当server需要数据恢复时,可以直接replay此日志文件,即可还原所有的操作过程。(1).同步写入
AOF是文件操作,对于变更操作比较密集的server,那么必将造成磁盘IO的负荷加重;此外redis提供了3中aof记录同步选项(appendfsync):always:每一条aof记录都立即同步到文件,这是最安全的方式,也以为更多的磁盘操作和阻塞延迟,是IO开支较大。 everysec:每秒同步一次,性能和安全都比较中庸的方式,也是redis推荐的方式。如果遇到物理服务器故障,有可能 导致最近一秒内aof记录丢失(可能为部分丢失)。 no:redis并不直接调用文件同步,而是交给操作系统来处理,操作系统可以根据buffer填充情况/通道空闲时间等择机 触发同步;这是一种普通的文件操作方式。性能较好,在物理服务器故障时,数据丢失量会因OS配置有关。
(2).压缩AOF日志文件
AOF文件会不断增大,它的大小直接影响“故障恢复”的时间,而且AOF文件中历史操作是可以丢弃的。AOF rewrite操作就是“压缩”AOF文件的过程,当然redis并没有采用“基于原aof文件”来重写的方式,而是采取了类似snapshot的方式:基于copy-on-write,全量遍历内存中数据,然后逐个序列到aof文件中。//使用配置文件进行持久化 no-appendfsync-on-rewrite no #在aof-rewrite期间,appendfsync是否暂缓文件同步 auto-aof-rewrite-min-size 64mb #aof文件rewrite触发的最小文件尺寸(mb,gb) auto-aof-rewrite-percentage 100 #相对于“上一次”rewrite,本次rewrite触发时aof文件应该增长的百分比。 //使用命令进行持久化 redis-cli -h ip -p port bgrewriteaof #开启一个子进程来完成rewrite
相关推荐
王道革 2020-11-25
wangdonghello 2020-11-03
Langeldep 2020-11-16
chenhualong0 2020-11-16
聚合室 2020-11-16
koushr 2020-11-12
MRFENGG 2020-11-11
guoyanga 2020-11-10
fackyou00 2020-11-10
Orangesss 2020-11-03
dongCSDN 2020-10-31
rainandtear 2020-10-30
Quietboy 2020-10-30
liuyulong 2020-10-29
fansili 2020-10-29
温攀峰 2020-10-23
jackbon 2020-10-19
kaixinfelix 2020-10-04