概述
持久化
写在前面
在
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
文件,其文本开头位REDIS
REDIS0009ú 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.conf
aof-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持久化配置与操作所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复