Redis提供了2个不同形式的持久化方式
- RDB(Redis DataBase)
- AOF(Append Of File)
RDB持久化
RDB:在指定的时间间隔内,将内存中的数据集快照写入磁盘,也就是行话将的Snapsot快照。它恢复时是将快照文件直接读到内存里。
RDB文件备份原理
Redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,持久化过程都结束了,再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的,这就确保了极高的性能。
如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效。RDB的缺点是最后一次持久化后的数据可能丢失。
RDB持久化配置
持久化触发机制
################################ SNAPSHOTTING ################################
# Save the DB to disk.
#
# save <seconds> <changes>
#
# Redis will save the DB if both the given number of seconds and the given
# number of write operations against the DB occurred.
#
# Snapshotting can be completely disabled with a single empty string argument
# as in following example:
#
# save ""
#
# Unless specified otherwise, by default Redis will save the DB:
# * After 3600 seconds (an hour) if at least 1 key changed
# * After 300 seconds (5 minutes) if at least 100 keys changed
# * After 60 seconds if at least 10000 keys changed
#
# You can set these explicitly by uncommenting the three following lines.
#
# save 3600 1
# save 300 100
# save 60 10000
通过save <seconds> <changes>
设置,指定在指定时间内,如果发生指定次数的写操作,则触发持久化。默认是1分钟内改了1万次,或5分钟内改了100次,或1小时改了1次,则触发持久化。
RDB文件保存位置
# The filename where to dump the DB
dbfilename dump.rdb
# The working directory.
#
# The DB will be written inside this directory, with the filename specified
# Note that you must specify a directory here, not a file name.
dir ./
注意,如果这里使用相对位置dir ./
,则表示为执行启动redis服务的当前位置。
例如,在/usr/local/redis-6.2.7
目录中,执行启动命令bin/redis-server conf/redis.conf
,则会在/usr/local/redis-6.2.7目录中生成dump.rdb
文件,因此,如果dir指定的是相对位置,需要注意执行启动命令位置与rdb文件路径的关系,不能随意找个位置就重启服务!!!
持久化失败策略
stop-writes-on-bgsave-error yes
当Redis无法写入磁盘时,直接关掉Redis的写操作。推荐yes
通过RDB文件进行数据备份
先通过
config get dir
查询rdb文件保存目录(即工作目录)[root@izwz9f92w7soch5m251ghgz bin]# redis-cli -p 6379 127.0.0.1:6379> config get dir 1) "dir" 2) "/usr/local/redis-6.2.7" 127.0.0.1:6379> config get dbfilename 1) "dbfilename" 2) "dump.rdb"
将
dump.rdb
文件备份即可
通过RDB文件进行数据恢复
- 关闭redis服务
- 将备份的rdb文件拷贝到工作目录下
- 启动redis,备份数据会直接加载
AOF持久化
AOF持久化原理
以日志的形式来记录每个写操作,将Redis执行过的所有写指令记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构造数据,换言之,redis重启的话就根据日志文件将写指令从前到后执行一次以完成数据的恢复工作。
AOF持久化配置
持久化触发机制
appendonly no
#
# The name of the append only file (default: "appendonly.aof")
#
appendfilename "appendonly.aof"
#
# Redis supports three different modes:
# appendfsync always
appendfsync everysec
# appendfsync no
appendonly no
:AOF默认不开启,AOF文件的保存路径,与RDB的路径一致。- AOF与RDB同时开启,系统默认取AOF的数据(数据不会存在丢失)
- AOF同步频率
appendfsync always
:每次Redis的写入都会立刻计入日志,性能较差但数据完整性较好-
appendfsync everysec
:每秒计入日志一次,如果宕机,本秒的数据可能丢失 appendfsync no
:redis不主动进行同步,把同步时机交给操作系统
Rewrite压缩
auto-aof-rewrite-percentage 100
auto-aof-rewrite-min-size 64mb
AOF采用文件追加方式,文件会越来越大,为避免出现此情况,新增了重写机制,当AOF文件的大小超过所设定的阈值时,Redis就会启动AOF文件的内容压缩,只保留可以恢复数据的最小指令集。
默认当AOF文件为64M*(1+100%)的时候,会触发重写。
性能建议:只要硬盘许可,应该尽量减少AOF rewrite的频率,AOF重新的基础大小默认值64M太小了,可以设到5G以上。
通过AOF文件进行数据备份
先通过
config get dir
查询aof文件保存目录(即工作目录)[root@izwz9f92w7soch5m251ghgz bin]# redis-cli -p 6379 127.0.0.1:6379> config get dir 1) "dir" 2) "/usr/local/redis-6.2.7" 127.0.0.1:6379> config get appendfilename 1) "appendfilename" 2) "appendonly.aof"
将
appendonly.aof
文件备份即可
通过AOF文件进行数据恢复
关闭redis服务
将备份的aof文件拷贝到工作目录下
启动redis,备份数据会直接加载
RDB持久化与AOF持久化对比
- 官方推荐两个都启用
- RDB适合大规模的数据恢复,如果对数据不敏感,可以选单独用RDB
- RDB节省磁盘空间,恢复速度快
- AOF比起RDB占用更多的磁盘空间,恢复备份速度要慢,且每次读写都同步的话,有一定的性能压力
- 通常情况下AOF文件保存的数据集要比RDB文件保存的数据集要完整
- 不建议单独使用AOF,因为可能会出现Bug
- 如果只做纯内存缓存,可以都不用
- 使用AOF可以较大保证数据完整性,其代价一是带来了持续的IO,二是AOF rewrite过程中产生的新数据写到新文件造成的阻塞几乎是不可避免的。
- 性能建议:因为RDB文件只用作后备用途,建议只在Slave上持久化RDB文件,而且只要15分钟备份一次就够了。
转载请注明来源,欢迎对文章中的引用来源进行考证,欢迎指出任何有错误或不够清晰的表达。