您的位置:首页 > 数据库 > Redis

Redis 2种持久化方式( RDB、 AOF )配置

2018-02-08 13:21 1006 查看
看了一些redis相关的博文和文档,对redis的持久化只停留在原理及理论层面,直接点 要怎么配置。

Redis有2种持久化的方式对比:
一种是Snapshot(RDB),就是保存某一时刻的数据在磁盘;
另外一种是append-only file(AOF),就是以追加的方式记录所有写操作的命令到磁盘文件里面。

1、Snapshot
1.1 在redis.conf里面,配置的参数主要包括以下部分:
save <seconds> <changes>
stop-writes-on-bgsave-error yes
rdbcompression yes
dbfilename dump.rdb
dir ./

save <seconds> <changes>:在X秒内如果key有至少X次改变就触发持久化,例如save 900 1的话就是在900秒如果key有至少1次改变就触发持久化。如果想关闭此功能的话,可以把全部save行都注释或删除或者使用save ""。
如:
save 900 1
save 300 10
save 60 10000

stop-writes-on-bgsave-error:在bgsave遇到error的时候是否停止持久化,默认是yes代表是,no代表不是
rdbcompression:是否压缩,默认是yes代表是,no代表不是,如果想节省CPU的话就设为no,但是rdb文件会比较大
dbfilename:持久化的文件名字,默认是dump.rdb
dir:持久化的目录名字,默认是redis.conf所在的目录./

1.2 redis有5种触发snapshot持久化的方式
1)客户端执行BGSAVE命令初始化一个会占用一定内存的background进程
2)客户端执行SAVE命令,这个时候redis会阻塞所有命令直到snapshot保存完毕,一般很少使用,除非你可以接受redis暂时阻塞或者没有足够内存执行BGSAVE
3)redis.conf文件配置了save <seconds> <changes>,当满足条件的时候自动触发BGSAVE操作
4)服务器接收到SHUTDOWN命令或者TERM signal会执行SAVE,redis会阻塞所有命令直到snapshot保存完毕,然后关闭redis
5)1台redis连接到另外1台redis并且执行SYNC命令,由于某种原因如果SYNC没有执行,主redis会先执行BGSAVE
1.3 需要注意的是如果服务器crash的话会导致自从上次snapshot完成之后的数据丢失

2,Append-only file(AOF)
2.1 在redis.conf里面,配置的参数主要包括以下部分:
appendonly no
appendfilename "appendonly.aof"
appendfsync everysec
dir ./

appendonly:是否启动aof,默认是no代表不启用,yes代表启用
启动、修复、恢复
①正常恢复
启动:设置yes,修改默认的appendonly no,改为yes
将有数据的aof文件复制一份保存到对应目录(config get dir)
恢复:重启redis然后重新加载
②异常恢复
启动:设置yes,修改默认的appendonly no,该为yes
备份被写坏的AOF文件
修复:redis-check-aof  --fix 进行修复
恢复:重启redis然后重新加载

appendfilename:aof的文件名,默认是appendonly.aof
appendfsync:触发的间隔,默认是everysec代表每秒,另外还有always代表有改变都触发,性能最差但数据最安全,no代表让OS自己决定什么时候执行,性能最好但数据不安全

dir:和上述是同一个参数(共用),持久化的目录名字,默认是redis.conf所在的目录./
2.2 需要注意的是如果你使用了SSD的话,appendfsync设置always会可能导致write amplification从而很大影响SSD的寿命;另外就是aof一般是比rdb文件较大,恢复时间较长,因为要重新执行所有的写操作

3,Rewriting/compacting AOF
3.1 因为AOF会以追加的方式记录所有写操作的命令到磁盘文件里面,所以文件会越来越大,导致redis重启的时候恢复时间较长。为了缓解这种问题,redis使用了BGREWRITEAOF,用于删除重复多余的写命令,类似BGSAVE,是一个占用一定系统资源的background进程。因为rewrite的时候会删除旧的AOF文件,如果AOF文件比较大的话,会消耗更多的系统资源

3.2 在redis.conf里面,配置的参数主要包括以下部分:
no-appendfsync-on-rewrite no
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb

no-appendfsync-on-rewrite:在aof rewrite的时候上述appendfsync是否暂时停止,默认是no代表不停止,yes代表停止,不会造成I/O资源竞争,性能较前者好
auto-aof-rewrite-percentage:自动触发aof rewrite的百分比,默认是100%,就是比上次rewrite的1倍
auto-aof-rewrite-min-size:自动触发aof rewrite的最小size,默认是64mb,就是如果size超过64mb,而且是上次执行的1倍,就会自动触发

4,Snapshot和AOF的对比
- snapshot在下一次触发前如果服务器crash了,在上次snapshot之后修改的数据会丢失,而AOF是记录所有的写操作,在数据完整性来说,AOF比snapshot要好
- snapshot持久化的文件rdb一般比aof要小,所以在恢复的时候snapshot会快一点,而且节省硬件资源
- 如果服务器在写aof的时候故障导致aof文件损坏,可以使用自带的工具redis-check-aof --fix修复,而snapshot文件rdb损坏是无法修复的

所以如果你可以容忍数据丢失的话,可以使用snapshot方式,而且也是比AOF要节省资源,否则的话就使用AOF方式,或者同时使用2种方式(重启的时候会优先使用AOF)。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  Redis持久化