持久化
写在前面
在
linux系统中:
- 父子进程数据是隔离的
- 父进程可以让子进程看到父进程的数据,采用
export修饰export的环境变量,父子进程的修改互补影响,影响范围仅为自身进程
redis如何在非阻塞的情况下对某一时刻数据进行持久化
- redis父进程使用
fork()系统调用,创建一个子进程,其为redis中创建那一刻中虚拟地址的拷贝,其虚拟地址同样指向相同的内存地址,则有两个虚拟地址引用了该物理地址fork()实现了copy on write内存机制,在父进程修改数据时,首先会在内存中写入修改的值,并将指针从原来的地址指向新的地址,所以子进程的数据不会改变,还是那一刻的数据,从而达到非阻塞保存时点快照
fork()特点:速度快,占用空间小
RDB
-
主动(同步阻塞):比如关机维护时使用
-
被动(异步非阻塞):
fork()系统调用,可在配置文件中配置触发规则#在多少秒后至少有多少个key发生变化触发写入磁盘操作(可配置多条) save <seconds> <changes> #默认开启,可增加 save "" 表示禁用- 如果想要修改写入磁盘文件名称,找到
dbfilename dump.rdb对dump.rdb改为需要的文件名 - 如果想要修改写入磁盘文件位置,找到
The working directory注释,重写其dir路径即可
只要触发了RDB操作,等待该操作完成后,下一次的RDB触发才可执行
- 如果想要修改写入磁盘文件名称,找到
弊端:
- 不支持拉链,永远只有一个
dump.rdb文件,需要人为干预进行备份 - 时点与时点之间窗口数据容易丢失,如:8点得到一个RDB数据文件,9点刚要触发RDB,宕机了,那么8点到9点的数据就丢失了
优点:类似java中的序列化,恢复的速度相对较快(rdb文件为二进制文件,可以对数据进行快速恢复)
适当的配置redis最大存储空间maxmemory可以提升RDB的效率,最大空间过大会导致RBD时间过长
AOF
RDB与AOF可以同时开启,如果开启了AOF只会使用AOF进行数据恢复
优点:数据丢失少
弊端:操作日志文件的体量会越来越大,从而导致恢复慢
针对弊端redis根据让日志只记录增量且合并重复命令的原理对AOF进行了优化:
-
4.0前:重写日志文件,删除抵消的命令合并重复的命令,得到一个缩小版的纯指令的日志文件
-
4.0后:重写日志文件,将某一刻老的数据RDB到AOF文件中,将增量的指令以追加的方式追加到AOF文件中
AOF是一个混合体,既利用了RDB的快速恢复也利用了日志的全量特点
相关配置
- AOF默认关闭:
appendonly no -> yes开启AOF - 默认AOF文件名:
appendfilename "appendonly.aof"可自定义 - redis往
aof文件中刷写的策略appendfsync always:每来一条指令调用一次内核将数据直接刷写到磁盘,最多丢失一条数据(一条指令正在写宕机了);数据最可靠appendfsync everysec:每秒触发一次I/O对buffer进行flush到aof文件中,可能会导致接近一个buffer缓存内容的丢失;数据较为可靠appendfsync no:每当内核buffer缓冲区内容填满时触发一次I/O,对缓冲区的数据flush写入磁盘aof文件;最多丢失一块buffer缓冲区内容数据,换来I/O成本最少
no-appendfsync-on-rewrite:yes/no(默认)当redis抛出一个子进程进行AOF重写或者RDB重写,允不允许序号3的策略进行aof文件的写入,yes可能会导致一部分性能阻塞,no可能导致一些数据的丢失aof-use-rdb-preamble yes:开启重写日志文件,见上4.0后;如果aof文件以REDIS开头的则是重写过的混合体文件(默认开启)- 自动触发
BGREWRITEAOF(重写)规则auto-aof-rewrite-percentage [百分比(省略%)]:记录6.2.命令达到的百分比触发重写auto-aof-rewrite-min-size [文件大小(mb)]:首次aof文件达到该大小且满足6.1.自动触发重写,并且redis会记录重写后此时文件大小lastSize,当文件超过lastSize的设置百分比6.1.时再次出发重写,依次类推自动重写操作(此变量仅初始化启动redis有效,如果是redis恢复时,则lastSize等于初始aof文件大小)
实操
关闭混合模式
-
vi /etc/redis/6379.conf#关闭redis后台运行 daemonize no #logfile "" 默认控制台打印,并无日志输出,需要日志输出指定输出路径即可(注释也是前台控制台打印) #配置RDB save策略 save 3600 1 save 300 100 save 60 10000 #开启AOF appendonly yes #关闭混合模式 aof-use-rdb-preamble no异常备注
#在redis进程kill又自动启动的情况下,关闭进程,无密码省略 -a [password] redis-cli -a [password] shutdow -
redis-server /etc/redis/6379.conf使用指定的配置文件启动redis,会在配置的文件目录下生成持久化的文件
-
set k1 hello在aof文件中生成如下内容:#根据该文件,可对命令进行解析执行 *2 #*代表下面指令由几个元素组成 $6 #描述下一行元素由几个字节组成 SELECT #元素1 $1 0 #元素2 *3 $3 set $2 k1 $5 hello -
bgsave:触发fork(),在持久化目录中会将当前数据序序列化到磁盘rdb文件,其文本开头位REDISREDIS0009ú redis-ver^E6.2.1ú redis-bitsÀ@ú^EctimeÂ<91>Ü/cú^Hused-mem -^Q^@ú^Laof-preambleÀ^@þ^@û^B^@^@^Bk1^Ehello^@^Bk2^Dooxxÿ8^[<97>XË^H@O -
redis-check-rdb dump.rdb:检查rdb文件是否正常armin@xiaobawangxuexiji-2 db % redis-check-rdb dump.rdb [offset 0] Checking RDB file dump.rdb [offset 26] AUX FIELD redis-ver = '6.2.1' [offset 40] AUX FIELD redis-bits = '64' [offset 52] AUX FIELD ctime = '1664081041' [offset 67] AUX FIELD used-mem = '1125792' [offset 83] AUX FIELD aof-preamble = '0' [offset 85] Selecting DB ID 0 [offset 116] Checksum OK [offset 116] o/ RDB looks OK! o/ [info] 2 keys read [info] 0 expires [info] 0 already expired -
BGREWRITEAOF:后台重写aof文件,去除无效重复指令*(如果在一个key值中多次重写key值,aof文件中仅会存储最后一条指令)*
开启混合模式
-
vi /etc/redis/6379.confaof-use-rdb-preamble yes -
redis-server /etc/redis/6379.conf:持久化目录下出现一个空的aof文件 -
set k1 a; set k1 b; set k1 c; set k1 d:目前aof文件内容:*2 $6 SELECT $1 0 *3 $3 set $2 k1 $1 a *3 $3 set $2 k1 $1 b -
BGREWRITEAOF:手动执行重写后,打开aof文件*(变为序列化内容)*REDIS0009ú redis-ver^E6.2.1ú redis-bitsÀ@ú^EctimeÂXæ/cú^Hused-memÂP-^Q^@ú^Laof-preambleÀ^Aþ^@û^A^@^@^Bk1^Adÿ^Yuâ¶<86>ç«> -
set k1 e; set k1 f:继续对key重新赋值,再查看aof文件*(后面的内容以追加指令的形式追加到aof文件中,此时的文件为混合文件)*REDIS0009ú redis-ver^E6.2.1ú redis-bitsÀ@ú^EctimeÂXæ/cú^Hused-memÂP-^Q^@ú^Laof-preambleÀ^Aþ^@û^A^@^@^Bk1^Adÿ^Yuâ¶<86>ç«>*2^M $6^M SELECT^M $1^M 0^M *3^M $3^M set^M $2^M k1^M $1^M e^M *3^M $3^M set^M $2^M k1^M $1^M f^M -
bgsave:将以上时点数据持久化到rdb文件 -
BGREWRITEAOF:重写aof文件,目前内容与bgsave得到的rdb文件解析内容一致,均为以上时点序列化的数据
注意:无论在是否混合模式下的aof持久化,在最后有执行flushall或相关清库指令,如果想要恢复清库前的数据,不可执行BGREWRITEAOF重写操作,否则数据无法找回*(重写后的aof文件仅有清库指令)*;此种情况恢复数据需要将aof文件中最后一条清库指令移除再进行数据导入
最后
以上就是欢呼巨人最近收集整理的关于Redis持久化配置与操作的全部内容,更多相关Redis持久化配置与操作内容请搜索靠谱客的其他文章。
发表评论 取消回复