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。

标签: Database, Redis

添加新评论