Redis持久化
参考资料:Redis Persistence – Redis
这里只是总结一些常见的使用方法,需要详细的信息可以到以上地址
Redis提供持久化方式
- RDB(Redis DataBase)可以提供某个时间节点的数据集快照
- AOF(Append Only File)可以提供全部写入命令的合集,服务器在启动时通过命令对数据进行恢复
持久化过程
RDB(Redis DataBase)
RDB优势
- RDB是非常紧凑的数据文件,保存了Redis某个时间点的数据集,这种格式非常适合备份。
- RDB非常适合灾难恢复,可以传输到异地保存。
- RDB可以保证Redis最大性能,Redis启动一个子进程处理RDB文件,不会在主进程进行频繁IO操作。
- RDB在恢复大的数据集时比AOF更快。
RDB劣势
- 在服务故障时将比AOF丢失更多的数据,如果更改为频繁的备份,则可能会丧失一部分性能。
- 如果RDB保存点设置较多的情况下会启动更多的子线程处理持久化,处理大数据集时,子线程将消耗更多的CPU资源,若系统CPU吃紧,则会影响Redis服务性能
RDB配置
以下用于配置文件redis.conf
save <seconds> <changes>
:在时间内发生了个数据变更,则保存数据快照。stop-writes-on-bgsave-error
:在持久化线程发生错误时是否停止接受客户端写入命令,yes
停止接受,no
继续写入。rdbcompression
:是否对rdb进行压缩,yes
启用,no
不启用,这将节省一部分CPU资源。rdbchecksum
:是否对rdb文件启动CRC64校验,yes
启用,添加CRC64校验到文件末尾,文件更不容易损坏,但是会损失一部分的性能,大约10%。no
不启用,将节省一部分性能开销。dbfilename
:rdb文件名称dir
:设置rdb文件存储目录
RDB快照生成
- Redis调用
fork()
, 拥有父进程和子进程 - 子进程将数据集写入一个RDB文件中。
- 子进程完成新的RDB文件写入时,Redis用新的RDB文件替换原来的RDB文件,并删除旧的RDB文件。
AOF(Append Only File)
AOF优势
- AOF持久化可以通过配置不用的策略,在发生故障时损失更少的数据。
- AOF文件是一个只进行追加的日志文件,如果在服务断电等情况下发生损坏,也可以通过
redis-check-aof
工具修复。 - Redis可以自动重写AOF文件,当AOF文件过大时,Redis会基于当前数据集重写AOF文件,保证最小操作集,以减小文件大小。
- AOF文件格式更容易理解和解析,可轻松导出AOF文件。
AOF劣势
- AOF文件大小通常大于通数据集下RDB文件。
- AOF持久化可能被RDB慢,取决于fsync策略的设置。
- AOF出现过一个BUG,再恢复数据时部分命令可能影响得到的数据集与源数据不一致。
AOF配置
以下配置适用redis.conf
appendonly
:配置开启AOF,yes
开启,no
不开启appendfilename
:配置AOF文件名称appendfsync
:fsync策略配置no-appendfsync-on-rewrite
:配置BGSAVE或BGREWRITEAOF进行时,是否使用主进程写AOFauto-aof-rewrite-percentage
:AOF重写比例,设置0禁用重写功能auto-aof-rewrite-min-size
:AOF重写文件最小大小aof-load-truncated
:设置在redis服务启动时,AOF文件不完整时动作aof-use-rdb-preamble
:配置重写AOF时是否使用RDB同步码重写AOF
AOF fsync配置
always
每次命令追加到AOF文件,这将非常慢,但是安全
everysec
每一秒追加到AOF文件,已经足够快,如果发生故障,仅损失1秒的数据
no
不控制,由操作系统控制,更快,更不安全
AOF重写
随着命令的不断写入,AOF文件越来越大,Redis自动触发或者接受到BGREWRITEAOF指令,Redis会启动AOF文件重写,重写的目的是减小AOF文件,在不打断服务客户端的情况下重写。
- Redis执行
fork()
,同时拥有父进程和子进程。 - 子进程开始将新AOF文件的内容写入临时文件中。
- 对于新的写入命令,父进程一边将它们累积到一个内存缓存中,一边将这些改动追加现有的AOF文件末尾。
- 当子进程完成重写工作时,它给父进程一个信号,父进程在收到信号之后,将内存缓存区中所有的数据追加到新的AOF文件末尾
- 最后,Redis原子地用新文件替换旧文件,之后所有的命令直接追加到新的AOF文件末尾
RDB与AOF
同时启用
Redis服务重新启动时,将优先是用AOF文件重建数据集,应为他是最完整的。
从RDB切换到AOF
-
备份.rdb文件
-
将此备份转移到安全的地方
-
执行以下命令
redis-cli config set appendonly yes
#该命令用与开启AOF,
#Redis会阻塞知道初始AOF文件创建完成,
#之后Redis继续处理命令,并将命令写入AOF文件末尾
redis-cli config set save ""
#该命令用与关闭RDB,不关闭,则保持RDB和AOF同时运行 -
检查数据库中key的数量是否相同
-
检查AOF文件是否正常生成并追加
更多redis配置可参考
和代码生猴子