Redis持久化
Redis持久化
redis支持2种持久化方式:
RDB(Redis DataBase):快照
AOF(AppendOnlyFile):日志
RDB工作机制(默认开启)
执行命令或定时创建快照,将所有数据写入到RDB文件中。redis重启后自动载入RDB文件中的内容。在redis服务正常重启时会将数据存入RDB文件中。
RDB文件的存放路径
修改配置文件redis.conf
dir /opt/redis/data/修改RDB文件名称
dbfilename dump_6379.rdb如果修改了地址或文件名,要保留原RDB文件,并对应位置和文件名。
手动保存命令
RDB SAVE
#SAVE在保存时使用主进程执行保存,因此会阻塞用户访问数据库。
RDB BGSAVE
#BGAVE在保存时会开启一个独立子进程在后台执行,因此不会阻塞用户访问数据库。RDB备份机制运行机制
redis会生成一个独立的子进程(使用save保存则不会生成子进程),负责将redis内存数据保存为一个临时文件tmp-pid.rdb,当数据保存完成后,再将此临时文件改名为RDB文件,如果有前一次的RDB文件则会被替换,最后关闭此子进程。
通过配置设定的自动保存,使用BGSAVE命令进行保存。
RDB GBSAVE的状态值用于在脚本中判断备份是否完成
redis-cli info | grep rdb_bgsave_in_progress
#0为结束,1为执行中。自动快照配置
获取当前save配置
config get save动态修改save配置
config set save 3600 1 300 100 60 10000配置文件中的SNAPSHOTTING部分
#save ""
#若不使用RDB,则取消此行注释,令save=""。同时下面的配置也必须留空或注释,否则无效,仍然会按照规则执行自动备份。
save 3600 1
#3600秒内修改1个key即触发保存
save 300 100
#300秒内修改100个key即触发保存
save 60 10000
#60秒内修改10000个key即触发保存RDB模式的优缺点
优点
- 恢复时直接加载到内存中即可。
- 大数据集时恢复速度比AOF快。
缺点
- 不能事实保存数据。
- 在数据集比较大时,fork()子进程可能会非常耗时。
AOF工作机制
AOF可以指定不同的保存策略,默认为每1秒执行一次fsync,按照操作的顺序将变更命令追加到指定的AOF日志文件尾部。
同时开启RDB与AOF,在进行数据恢复时,默认情况下AOF文件的优先级高于ADB。
编辑AOF文件可以修改其中的步骤,可以恢复数据。
配置文件开启APPEND ONLY MODE部分
appendonly yes
#开启AOF备份
appendfilename "appendonly.aof"
#AOF文件名称,文件的保存位置与RDB文件一致。即dir项配置的地址。命令开启AOF
config get appendonly
#获取appendonly状态
config set appendonly yes
#开启AOF开启AOF后,redis立即会进行一次完全备份,后续为增量备份。在dir路径中生成零时文件,备份完成后改名保存。AOF使用子进程进行AOF日志保存。
平滑开启AOF
若redis数据库中已有数据,通过修改配置文件开启AOF后会生成一个空白AOF文件,由于AOF文件默认优先于RDB,因此读取AOF内的数据为空。这种情况下需要先使用命令动态开启AOF,然后修改配置文件,但不需重启redis。
AOF持久化策略配置APPEND ONLY MODE部分
appendfsync everysec
#no 表示由操作系统保证数据同步到磁盘,Linux的默认fsync策略是30秒,最多会丢失30秒的数据。
#always 表示每次写入都执行fsync,以保证数据同步到磁盘,安全性最高,性能较差。
#everysec 表示每秒执行一次fsync,可能会丢失1秒数据,此为默认值和生产环境建议值。AOF rewrite重写
将一些重复的,可以合并的,过期的数据重新写入一个新的AOF文件,从而节约备份占用的硬盘空间,也能加速恢复过程。
可以手动执行rewrite也可以配置自动执行。
手动触发
bgrewriteaof
#手动触发AOF rewrite操作如何观察RDB和AOF的进程和临时文件的过程
redis-cli bgrewriteaof ; pstree -p |grep redis ; ll /data/redis查看redis生成的子进程和临时文件
自动触发AOF rewrite重写
no-appendfsync-on-rewrite no
#在磁盘重写过程中有新的AOF发生,是否暂缓文件同步策略。
#默认为no,表示不暂缓。新的aof记录将被立即同步到磁盘,是最安全的方式,不会丢失数据,但存在阻塞。
#若为yes则暂缓,aof记录将被写入缓冲区,因此不会造成阻塞(磁盘IO抢占)。若此时redis服务中断会损失30秒的数据(Linux默认值为30秒)。但由于yes性能较好,且不会出现阻塞因此较推荐。
auto-aof-rewrite-perentage 100
#当aof log增长超过指定百分比时,重写aof文件。设置为0表示不重写。
#若第一次清理时文件为100M,下一次到达200M时,则清理。
auto-aof-rewrite-min-size 64MB
#AOF文件达到目标值后使用AOF rewrite重写。
aof-load-truncated yes
#是否加载某些原因造成的末尾异常的AOF文件(如kill或断电等),建议yes。AOF模式的优缺点
优点
- 数据安全性高。
- 增量备份
- aof文件体积过大时可以rewrite重写
- AOF包含格式清晰的易于理解的日志文件
缺点
- 记录所有操作,因此文件体积较大
- AOF在恢复时速度比RDB慢
- 如果fsync策略是appendfsync no ,AOF的数据备份速度甚至可能会比RDB慢(30秒)。
- bug出现可能性更多
RDB和AOF的选择
如果主要充当缓存功能,通常只开启RDB(默认值)。
如果一点数据都不能丢失,可以同时开启。
不建议只开启AOF。