Redis持久化

redis ginotang 777℃ 0评论

Redis持久化的两种方式

Redis提供了两种类型的持久化方式,分别是快照方式(RDB)和只追加文件(AOF)的方式

  • RDB在指定的间隔内抓取内存中特定时间点的数据快照,然后保存到磁盘中
  • AOF把服务器所有写操作命令都记录到文件中去,下次服务器启动的时候,读取该文件中的命令进行回放,从而还原数据到内存中去。
  • 当服务器同时开启RDB和AOF持久化的时候,优先使用AOF还原数据

RDB的优势

  • RDB是一个高压缩的文件,它的结构和Redis在内存的时候保持一致,因此恢复速度非常快,适合用于数据的备份
  • 由于RDB是一个单文件,因此适合于在服务器间传输,例如用于灾难恢复。
  • 当需要生成RDB文件的时候,Redis服务器会fork一个进程,专门处理RDB文件,父进程不参与RDB的生成过程。
  • 相比起AOF,RDB运行服务器的快速重启

RDB的缺点

  • 当Redis在RDB产生的两个时间点之间发生故障,那么这个时间段的数据会丢失
  • 为了生成RDB数据文件,Redis可能需要频繁fork进程,当数据量非常大的时候,那是很耗时的,可能会造成Redis服务性能低下甚至拒绝服务,虽然AOF也会fork进程,但是我们可以调整AOF的fork频率

AOF的优势

  • 我们可以根据实际需要调整AOF的同步策略,例如总是同步,或每秒同步等等
  • 由于每一个操作都会被写入到AOF中,因此丢失数据的可能性比较少。
  • 即使你运行了flushall命令,但只要AOF还没有被重写,我们依然可以从AOF中恢复数据。因为AOF文件是普通文本文件(类似mysql的binlog),只要删除AOF中最后的flushall命令,然后重启Redis即可。

AOF的缺点

  • 由于所有的写命令都会被保存到AOF中,因此它的大小通常比RDB文件要大得多,虽然可以通过重写压缩
  • AOF还原的时候需要重复执行一次命令,因此还原数据所需的时间会比RDB慢

混合使用RDB和AOF确保数据安全

虽然AOF似乎可以满足数据安全,但是它可能存在一些潜在的bug,导致一些数据丢失,虽然这种情况很少遇到。即使真的遇到问题,如果使用RDB的话,还可以从RDB文件中恢复,因此应该混合使用RDB和AOF确保数据安全最大化。

配置RDB

Redis默认开启了RDB,且配置了三个保存周期,分别是

这三个save的意思如下:

  • 900秒内有1条更新,刷新rdb文件
  • 300秒内有10条更新,刷新rdb文件
  • 60秒内如果有10000条更新,刷新rdb文件

其他的相关配置如下:

配置AOF

Redis默认没有开启aof,需要手动打开。默认aof的文件保存目录和rdb文件目录一致,aof常用配置如下

其中auto-aof-rewrite-min-size是对auto-aof-rewrite-percentage的补充,如果没有这个选项,前期Redis数据量小的时候很容易就造成100%递增率,例如开始数据是1条,当数据到第2条的时候就是一个100%递增,第4条就是第二个100%递增,以此类推,后果是aof的频繁更新,影响服务器性能。

使用备份文件进行灾难恢复

我们应该定期把Redis的备份文件(RDB和AOF)复制到安全的地方保存,当数据丢失的时候就可以使用它们进行还原。在同时使用两种方式进行数据备份,Redis服务启动的时候,优先使用AOF文件进行数据还原,而RDB文件会被忽略。

在进行灾难恢复的时候,应该通过下面的几个步骤

  1. 停止Redis服务进程
  2. 如果同时开启了RDB和AOF,那么先关闭AOF
  3. 复制用于数据恢复的RDB文件到指定目录
  4. 启动Redis服务,先还原RDB的数据
  5. 再次停止Redis服务,并打开AOF
  6. 复制用于数据恢复的AOF文件到指定的目录
  7. 启动Redis服务,恢复AOF中的数据

转载请注明:Pure nonsense » Redis持久化

喜欢 (0)
0 0 投票数
文章评分
订阅评论
提醒
guest
0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x
()
x