redis 持久化

RDB

在指定的时间间隔内将内存中的数据集快照写入磁盘,也就是行话讲的Snapshot快照,它恢复时是将快照文件直接读到内存里

redis会单独创建(fork)一个子进程来进行持久化,会先将数据写入到一个临时文件中,待持久化过程结束了再用这个临时文件替换上次持久化好的文件。整个过程中,主进程是不进行任何IO操作的。这就确保了极高的性能。如果需要进行大规模数据的恢复,且对于数据恢复的完整性不是非常敏感,那RDB方式要比AOF方式更加的高效,RDB的缺点是最后一次持久化后的数据可能丢失。我们默认的就是RDB,一般情况下不需要修改这个。

RDB保存的文件是dump.rdb

rdb机制:

  1. 设置时间与key值操作次数的保存机制是:
     save 60 5
     这里代表在六十秒内操作key值大于等于五次,则在60后保存一次镜像,并不是达到次数后立即保存。
    
  2. 保存触发命令:
save:手动生成进行文件操作,直接调用rdbSave函数,会对主进程造成阻塞,在数据量较小的情况下可以使用,但是在数据量较大的情况下不建议使用,在主进程阻塞期间,服务器不能处理客户端的任何请求。
bgsave:手动生成进行文件操作,BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。
flushall:在清空全部数据库之后,会生成一个镜像文件,这个真的是删库跑路,为啥是清空后再生成镜像备份,奇怪的操作
shutdown:安全退出redis服务,在退出的时候会生成一个当前状态的镜像

直接kill redis的服务是不会生成任何镜像的
3. save和bgsave区别
save:直接调用rdbSave函数,会对主进程造成阻塞,在数据量较小的情况下可以使用,但是在数据量较大的情况下不建议使用,在主进程阻塞期间,服务器不能处理客户端的任何请求。
bgsave:BGSAVE 命令执行之后立即返回 OK ,然后 Redis fork 出一个新子进程,原来的 Redis 进程(父进程)继续处理客户端请求,而子进程则负责将数据保存到磁盘,然后退出。BGSAVE方式比较适合线上的维护操作。客户端可以通过 LASTSAVE 命令查看相关信息,判断 BGSAVE 命令是否执行成功。

  1. fork操作的影响
    fork子线程一般情况下是很快的,但是如果花费时间太久,bgsave命令仍有阻塞其他客户请求的情况发生。

  2. 关于数据恢复的问题

    • 关闭redis服务
    • 将需要恢复的dump.rdb文件置放在配置文件中的指定目录,如果是默认目录则是/usr/local/bin
    • 启动redis服务,这时候redis会主动去加载dump.rdb文件中的内容,数据也就恢复了

AOF (Append Only File)


以日志的形式记录每个写操作,将redis执行过的指令都记录下来(读操作不记录),只许追加文件但不可以改写文件,redis启动之初会读取该文件重新构建数据,换言之,redis重启的话,就根据日志文件的内容将写指令从前到后执行一次,以完整数据的恢复工作
aof保存的是appendonly.aof文件,且默认不开启,需要我们手动开启

  1. 修复appendonly.aof文件
redis-check-aof --fix appendonly.aof


修复的方式挺简单粗暴的,就是把出现问题的key直接干掉,所以如果通过这个命令修复appendonly.aof文件,可能会出现丢失数据的问题。
官网推荐可以使用diff -u的方式进行比较

  1. appendonly.aof文件被删除后果与处理方案
    appendonly.aof文件被删除后,redis不会重新自动生成该文件,且就算手动创建,也不会向其中继续写入数据。按照理解,应该是,redis服务进程打开了该文件后,一直会保留该文件操作符,如果被删除,该操作符对应的文件也就不存在了,也就无法完成日志记录了。理论上应该有报错和自动重创机制的,但是当前我暂时没有发现。
    解决方案就是重启redis服务,或者执行bgrewriteaof即可

  2. AOF文件重写的原理:
    为了解决AOF文件体积膨胀的问题,Redis提供了AOF文件重写(rewrite)功能。通过该功能,Redis服务器可以创建一个新的AOF文件来替代现有的AOF文件,新旧两个AOF文件所保存的数据库状态相同,但新AOF文件不会包含任何浪费空间的冗余命令,所以新AOF文件的体积通常会比旧AOF文件的体积要小得多

虽然Redis将生成新AOF文件替换旧AOF文件的功能命名为“AOF文件重写”,但实际上, AOF文件重写并不需要对现有的AOF文件进行任何读取、分析或者写入操作,这个功能是通过读取服务器当前的数据库状态来实现的

资料参考:
https://blog.51cto.com/u_15346415/5188796

posted @ 2022-07-25 20:45  影梦无痕  阅读(192)  评论(0)    收藏  举报