Redis-持久化机制

一、持久化

  • 概念
    Redis服务运行过程中,会定期把内存里的数据保存到硬盘实现了数据永久存储。持久化功能有效地避免因进程退出造成的数据丢失问题,当下次重启时利用之前持久化的文件即可实现数 据恢复。
  • Redis持久化机制
    RDB
    AOF
    简书上查找到的一些关于redis持久化资料

二、RDB(默认启用)

2.1、RDB介绍

  • 数据库目录下的dump.rdb文件
]# grep "dbfilename"  /etc/redis/6379.conf 
dbfilename "dump.rdb"
  • 概念
    Redis数据库文件,全称Redis DataBase
    数据持久化默认方式
    按照指定时间间隔,将内存中的数据集快照写入硬盘
  • Redis数据库文件,全称Redis DataBase
    1. 数据持久化方式之一
    2. 数据持久化默认方式
    3. 按照指定时间间隔,将内存中的数据集快照写入硬盘

2.2、触发机制

2.2.1、自动触发

]# grep "save"  /etc/redis/6379.conf 
save 900 1		//15分钟且有一个key改变即存盘
save 300 10		//5分钟且有10个key改变即存盘
save 60 10000	//1分钟且有10000个key改变即存盘
  1. 使用save相关配置,如“save m n”。表示m秒内数据集存在n次修改 时,自动触发bgsave。
  2. 如果从节点执行全量复制操作,主节点自动执行bgsave生成RDB文件并发送给从节点,更多细节见6.3节介绍的复制原理。
  3. 执行debug reload命令重新加载Redis时,也会自动触发save操作。
  4. 默认情况下执行shutdown命令时,如果没有开启AOF持久化功能则 自动执行bgsave。

2.2.2、手动存盘

  • save 阻塞写存盘
    使用save命令时,无法进行读写数据
    阻塞当前Redis服务器,直到RDB过程完成为止,对于内存 比较大的实例会造成长时间阻塞,线上环境不建议使用
  • bgsave 不阻塞写存盘
    不影响读写操作
    Redis进程执行fork操作创建子进程,RDB持久化过程由子 进程负责,完成后自动结束。阻塞只发生在fork阶段,一般时间很短

2.2.3、工作过程

在这里插入图片描述

  1. 执行bgsave命令,Redis父进程判断当前是否存在正在执行的子进 程,如RDB/AOF子进程,如果存在bgsave命令直接返回。
  2. 父进程执行fork操作创建子进程,fork操作过程中父进程会阻塞,通 过info stats命令查看latest_fork_usec选项,可以获取最近一个fork操作的耗时,单位为微秒
  3. 父进程fork完成后,bgsave命令返回“Background saving started”信息并不再阻塞父进程,可以继续响应其他命令。
  4. 子进程创建RDB文件,根据父进程内存生成临时快照文件,完成后 对原有文件进行原子替换。执行lastsave命令可以获取最后一次生成RDB的 时间,对应info统计的rdb_last_save_time选项。
  5. 进程发送信号给父进程表示完成,父进程更新统计信息,具体见 info Persistence下的rdb_*相关选项。

2.3、RDB优点缺点

2.3.1、优点

  • 高性能的持久化实现
    创建一个子进程来执行持久化,先将数据写入临时文件,持久化过程结束后,再用这个临时文件替换上次持久化好的文件;过程中主进程不做任何IO操作
  • 比较适合大规模数据恢复,且对数据完整性要求不是非常高的场合
  • RDB是一个紧凑压缩的二进制文件,代表Redis在某个时间点上的数据 快照。非常适用于备份,全量复制等场景。比如每6小时执行bgsave备份, 并把RDB文件拷贝到远程机器或者文件系统中(如hdfs),用于灾难恢复。
  • Redis加载RDB恢复数据远远快于AOF的方式。

2.3.2、缺点

  • 以外宕机时,丢失最后一次持久化的所有数据
  • RDB方式数据没办法做到实时持久化/秒级持久化。因为bgsave每次运 行都要执行fork操作创建子进程,属于重量级操作,频繁执行成本过高。
  • RDB文件使用特定二进制格式保存,Redis版本演进过程中有多个格式 的RDB版本,存在老版本Redis服务无法兼容新版RDB格式的问题。

2.4、使用RDB文件恢复数据

2.4.1、写入一些数据

192.168.4.51:6351> MSET a 1 b 2 c 3 d 4 e 5 f 6
OK
192.168.4.51:6351> keys *
1) "f"
2) "a"
3) "d"
4) "c"
5) "b"
6) "e"
192.168.4.51:6351> BGSAVE
Background saving started
192.168.4.51:6351> save
OK

2.4.2、备份数据

[root@redis1 ~]# ls /var/lib/redis/6379/
dump.rdb
[root@redis1 ~]# cp /var/lib/redis/6379/dump.rdb /root/
[root@redis1 ~]# ls /root/dump.rdb 
/root/dump.rdb
[root@redis1 ~]# scp /root/dump.rdb  root@192.168.4.52:/root/

2.4.3、恢复数据

[root@redis2 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> SHUTDOWN
not connected> exit  
[root@redis2 ~]# rm -rf /var/lib/redis/6379/dump.rdb 
[root@redis2 ~]# cp /root/dump.rdb  /var/lib/redis/6379/
[root@redis2 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@redis2 ~]# redis-cli -h 192.168.4.52 -p 6352
192.168.4.52:6352> keys *
1) "d"
2) "a"
3) "f"
4) "b"
5) "e"
6) "c"

三、AOF

3.1、AOF介绍

  • AOF(append only file)持久化
    追加方式记录写操作的文件
    记录redis服务所有写操作
    不断地将新的写操作,追加到文件的末尾
    默认没有启用
    使用cat命令可以查看文件内容

3.2、启用AOF

192.168.4.51:6351> CONFIG SET appendonly yes	//启用
OK
192.168.4.51:6351> CONFIG REWRITE 			//写进配置文件
OK
  • 查看配置文件中AOF的配置
[root@redis1 ~]# grep -n "appendonly" /etc/redis/6379.conf 
673:appendonly yes
675:# The name of the append only file (default: "appendonly.aof")
677:appendfilename "appendonly.aof"
  • 查看存放数据的aof文件
]# cat /var/lib/redis/6379/appendonly.aof

3.3、使用AOF文件恢复数据

3.3.1、备份

[root@redis1 ~]# cp /var/lib/redis/6379/appendonly.aof /root/
[root@redis1 ~]# scp /root/appendonly.aof root@192.168.4.52:/root

3.3.2、恢复

[root@redis2 ~]# redis-cli -h 192.168.4.52 -p 6352 shutdown
[root@redis2 ~]# rm -rf /var/lib/redis/6379/*
[root@redis2 ~]# grep -n "appendonly" /etc/redis/6379.conf 
673:appendonly no
675:# The name of the append only file (default: "appendonly.aof")
677:appendfilename "appendonly.aof"
[root@redis2 ~]# sed -i '673s/no/yes/' /etc/redis/6379.conf
[root@redis2 ~]# grep -n "appendonly" /etc/redis/6379.conf 
673:appendonly yes
675:# The name of the append only file (default: "appendonly.aof")
677:appendfilename "appendonly.aof"
[root@redis2 ~]# cp /root/appendonly.aof /var/lib/redis/6379/
[root@redis2 ~]# /etc/init.d/redis_6379 start
Starting Redis server...
[root@redis2 ~]# redis-cli -h 192.168.4.52 -p 6352 
192.168.4.52:6352> keys *

3.4、触发机制

3.4.1、AOF文件记录写操作的方式

[root@redis2 ~]# grep “appendfsync” /etc/redis/6379.conf

  • appendfsync always
    • 时时记录,并完成磁盘同步
  • appendfsync everysec
    • 每秒记录一次,并完成磁盘同步
  • appendfsync no
    • 写入aof ,不执行磁盘同步

3.4.2、日志重写

  • auto-aof-rewrite-min-size 64mb
    首次重写触发值
  • auto-aof-rewrite-percentage 100
    再次重写,增长百分比

3.4.3、修复AOF文件

]# redis-check-aof  --fix  appendonly.aof 

3.5、AOF优点与缺点

3.5.1、AOF优点

  • 可以灵活设置持久化方式
  • 出现意外宕机时,仅可能丢失1秒的数据

3.5.2、AOF缺点

  • 持久化文件体积通常会大于RDB方式
  • 执行fsync策略时的速度可能会比RDB方式慢

猜你喜欢

转载自blog.csdn.net/weixin_40136446/article/details/105293257