什么是Redis持久化
持久化就是把内存中的数据写到磁盘中去,防止服务宕机了内存数据丢失。
Redis的持久化机制
Redis提供两种持久化机制:RDB快照(默认)和AOF(机制)
RDB
RDB(Redis DataBase)是Redis中默认的持久化方式。按照一定的时间将内存的数据以快照的形式保存到磁盘中,会产生dump.rdb数据文件,可以通过配置文件中的save参数来定义快照的周期。
原理: fork和cow。fork 是指 redis间隔一段时间会 fork 一个子进程,子线程将数据写到磁盘上一个临时RDB文件中,当子进程写完临时文件后,将原来的RDB替换掉,这样的好处是可以 cow(copy-on-wirte)
优点:
- 方便持久化,只有一个文件 dump.rdb
- 容灾性好,一个文件可以保存到安全的磁盘中
- 性能最大化,fork 子进程来完成写操作,让主进程继续处理命令,所以是IO最大化。使用单独的进程来进行持久化,主进程不会进行任何IO操作,保证 redis 的高性能
缺点:
- 数据安全性低,RDB是间隔一段时间来进行持久化,如果持久化之间 redis 发生故障,会发生数据丢失,所以这种方式更适合数据要求不严谨的时候用
- 保存时间长,如果数据量很大,保存快照的时间会很长
AOF
AOF(Append-Only-File),是将 Redis 执行的每次写命令记录到单独的日志文件中,当重启 Redis 会重新将持久化的日志中文件恢复数据
原理: 将写命令添加到 AOF 文件(Append Only File)的末尾。使用AOF持久化需要设置同步选项,从而确保写命令同步到磁盘文件上的时机。这是因为对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘。
同步选项:
- no: 并不能给服务器性能带来多大的提升,而且也会增加系统奔溃时数据丢失的数量
- always: 严重减低服务器性能
- everysec: 这个选项比较合适,可以保证系统奔溃时只会丢失一秒左右的数据,并且 Redis 每秒执行一次同步对服务器性能几乎没有任何影响
随着服务器写请求的增多,AOF文件会越来越大。Redis提供了一种将AOF重写的特性auto-aof-rewrite,能够去除AOF文件中的冗余写命令
优点:
- 数据安全,AOF 持久化可以配置 appendfsync 属性中的always,每进行一次写命令操作就记录到 AOF 文件中一次、
- 一致性,通过 append 模式写文件,即使中途服务器宕机,可以通过 redis-check-aof 工具解决数据一致性问题
缺点:
- AOF 文件比 RDB 文件大,而且恢复速度慢
- 数据集大的时候比 RDB 启动效率低
两者比较
- AOF 文件比 RDB 更新频率高,优先使用 AOF 还原数据
- AOF 比 RDB 更安全也更强大
- RDB 性能比 AOF 好
- 如果两个都配了优先加载 AOF
如何选择合适的持久化方式
一般来说两者都会配置。如果单独用 RDB 的话你会丢失很多数据,单独用 AOF,你数据恢复没有 RDB 来的快,如果系统出现问题的时候我们可以先用 RDB 恢复,然后用 AOF 补全数据。冷热备份一起用,才能保证高健壮性的系统。