Redis持久化
Redis有2种持久化策略: RDB和AOF。
RDB(Redis Data Base)
RDB是Redis默认的持久化策略,这种策略是把数据库的快照以二进制形式的副本保存在磁盘上。
- RDB持久化触发条件
- SAVE命令: 当客户端执行SAVE命令时,会阻塞Redis主线程进行数据持久化,直到持久化完成。Redis在阻塞期间不能处理客户端的请求。
- BGSAVE命令: 当客户端执行BGSAVE命令时,Redis会fork一个子进程进行数据持久化,因此并不会阻塞Redis服务。
- FLUSHALL命令: 当客户端执行FLUSHALL命令时,会清空Redis所有数据库的数据,并且也会触发数据同步。
- save配置: Redis会按照配置文件中的save配置的条件进行数据同步,一旦满足条件,就会执行BGSAVE命令,即fork一个子进程进行同步。
- shutdown: 当Redis服务关闭时,也会将数据同步到磁盘,以便下次启动时恢复。
redis根据配置自己尝试去生成rdb快照文件
fork一个子进程出来
子进程尝试将数据dump到临时的rdb快照文件中
完成rdb快照文件的生成之后,就替换之前的旧的快照文件
dump.rdb,每次生成一个新的快照,都会覆盖之前的老快照
RDB优缺点
- RDB的优点:
- 文件体积小,恢复大数据较快
- 最大化Redis性能: Redis会fork出子进程进行数据同步,并不影响Redis的性能。
- RDB的缺点:
- 数据安全性较低: 如果不显示的执行SAVE命令,那么Redis隔一段时间才会同步数据,可能会造成一定程度的数据丢失。
修改配置文件
save 900 1 #在900秒内,key值发生变化次数超过1次则进行持久化,生产环境通常默认这个值即可
save 300 10 #在300秒内,key值发生变化次数超过10次则进行持久化,生产环境通常默认这个值即可
save 60 10000 #在60秒内,key值发生变化次数超过10000次则进行持久化,生产环境通常默认这个值即可
stop-write-on-bgsave-error yes #rdb文件在导出过程中出错了的话,Redis将停止写入数据,避免数据不一致
rdbcompression yes #压缩数据
rdbchecksum yes #检查rdb文件的完整性
dbfilename dump.rdb #rdb文件名
dir /var/lib/redis/ #rdb文件保存路径
当设置完后重启Redis服务,然后在工作中只要达到了save条件,就会调用BGSAVE进行RDB持久化。并且日志中也会有“xx changes in xx seconds. Saving”这样的记录。如果要关闭rdb功能的话将save选项改为save “”,引号里为空即可
AOF(Append Only File)
AOF策略是把已经执行过的命令以文本的方式追加到AOF文件的末尾,以此达到记录数据库状态的目的。 AOF默认情况下是关闭的,当配置选项 appendonly 设置为yes后才会进行AOF的持久化。
appendfsync指定了AOF的同步策略,它有三个可选值。
- no: no代表Redis不亲自持久化,而是通过系统调用write函数每隔一段时间将数据写入文件。 这种情况下如果服务器发生故障,可能会有数据还没来得及同步就丢失了。
- always: always表示Redis每次执行写操作都会将数据同步到文件中。 这种策略虽然保证了数据的安全性,但是对Redis的性能会有影响。
- everysec: everysec是AOF默认的持久化策略,这种策略下, 系统每一秒都会将数据写入文件,兼顾了性能和数据安全性。
AOF优缺点
- AOF优点:
- 数据安全性较高,秒级丢失
- AOF缺点:
- 文件体积大,恢复大数据较慢
修改配置文件
appendonly yes #打开aof功能
#appendfsync no #让系统自己决定什么时候进行持久化
#appendfsync always #每次有命令发生都写入到磁盘
appendfsync everysec #每秒写一次数据到磁盘,比如折中的办法,推荐
no-appendfsync-on-rewrite yes #如果正在导出rdb数据,停止aof的写入(aof将保存在一个队列中,rdb备份完成后执行队列,不会丢失数据)
auto-aof-rewrite-percentage 100 #aof文件体积与上次相比增长率达到100%就进行重写(重写相当于记总账,比如对同一个key做了100次操作,我们只需要最后一次的操作,重写就会把多余的操作给忽略掉)
auto-aof-rewrite-min-size 64m #和上一项组合使用,aof文件达到64M时进行重写(重写会节省掉空间,因为多余的操作被删除了)
appendfilename "appendonly.aof" #aof文件名
dir /data/redis6379
如何选择持久化策略?
两种持久化方式各有优缺点,可以选择混合的方式进行备份。 混合持久化后,文件的内容大部分都是RDB格式的,恢复起来较快, 以AOF的方式同步也能保证数据的安全性。 综合使用AOF和RDB两种持久化机制,用AOF来保证数据不丢失,作为数据恢复的第一选择; 用RDB来做不同程度的冷备,在AOF文件都丢失或损坏不可用的时候,还可以使用RDB来进行快速的数据恢复。
注意:
1、持久化不能取代备份,最好周期性的进行备份,过程如下
bgsave #在Redis客户端执行该命令后会在Redis所在目录创建dump.rdb文件,将该文件保存好,需要恢复数据的时候将dump.rdb移动到Redis所在目录后启动服务
2、当Redis服务启动进行数据恢复时,如果rdb和aof文件都存在,会优先使用aof文件来恢复数据(因为aof数据比较全)