redis的RDB和AOF搭配sentinel集群的实操(二)--单机版redis的RDB和AOF搭建

关于RDB和AOF的优缺点和性能比较,会在后面单章说明,本文只说搭建方式

 

一:简介RDB和AOF

      RDB:快照方式的持久化。快照只有一份,新的快照会覆写老的快照。

      AOF:redolog方式的持久化。会将redis中的每一次增删改操作追加到redolog中,以便后续重做。

 

二:RDB的说明与搭建

2.1:说明

      打开 redis.conf 文件,找到 SNAPSHOTTING 部分。这里就是RDB相关配置,这里默认有三种触发RDB的方式

save 900 1        #900秒内有1个更改
save 300 10       #300秒内有10个更改
save 60 10000     #60秒内有10000个更改

      上述的三个配置,其实属于同一类触发写入RDB的机制。这种触发机制一共有四类,如下所示。

1 在指定的时间间隔内,执行指定次数的写操作
2 执行save(阻塞, 只管保存快照,其他的等待) 或者是bgsave (异步)命令
3 执行flushall 命令,清空数据库所有数据,意义不大。
4 执行shutdown 命令,保证服务器正常关闭且不丢失任何数据,意义并不大。

      再说几个与RDB相关的配置

stop-writes-on-bgsave-error yes        #bgsave时,如有异常停止写入。目的是避免磁盘异常干扰日志
rdbcompression yes                     #是否开启压缩。开启后,rdb文件较小
dbfilename dump.rdb                    #指定rdb文件名
dir ./                                 #指定rdb文件路径

      只要配置了上面的那几种“save <时间间隔>  <更新操作>”的方式,RDB方式就被打开了。

 

2.2:操作

2.2.1:备份数据

      下面的图中我做了以下三个操作

      1:向一个空的redis中插入了几条数据,然后退出redis

      2:将dump.rdb文件做了备份。

      3:再次进入redis,清空当前redis中所有数据

redis的RDB和AOF搭配sentinel集群的实操(二)--单机版redis的RDB和AOF搭建_第1张图片

 

2.2.2:恢复数据

      下图我做了两个操作

      1:用备份rdb文件替换当前rdb文件

      2:启动redis,自动加载rdb中的数据。可以看到之前的数据回来了

redis的RDB和AOF搭配sentinel集群的实操(二)--单机版redis的RDB和AOF搭建_第2张图片

2.2.3:注意事项

      有人说,SHUTDOWN 和 FLUSHALL 命令都会触发RDB快照。所以在使用这些命令的时候请小心!!

 

二:AOF的说明与搭建

3.1:说明

      打开 redis.conf 文件,找到 APPEND ONLY MODE 对应内容。这里就是AOF相关配置,默认是关闭的,见如下配置

appendonly yes                    #这里开启关闭aof的开关,yes是打开状态
appendfilename "appendonly.aof"   #指定aof文件名
appendfsync everysec              #这里是三种同步到aof文件的模式,分为一直(always)、
                                  #每秒(everysec)和从不(no)
auto-aof-rewrite-percentage 100   #这两行说明:与上次写入后的大小相比,aof文件若暴增一倍
auto-aof-rewrite-min-size 64mb    #或者超过64M的时候,重写aof文件。这里一般设置3G而非64M
aof-load-truncated yes            #当aof文件在末尾被truncate时,若值为yes则会给用户发提示
aof-use-rdb-preamble no           #aof文件使用rdb协同恢复(具体用法不详)

      操作思路和步驟如下

      1:登入redis,插入几条记录

      2:清空记录并重启redis

      3:期望结果-->能通过使用aof文件将被flushall命令清空的记录重做回来

      4:实际结果-->失败,重启后redis中数据依然为空

[root@xxCentos7One src]# ./redis-server /usr/local/redis-4.0.11/redis.conf 
[root@xxCentos7One src]# ./redis-cli -h 192.168.122.21 -p 6379 
192.168.122.21:6379> auth xx_1234
OK
192.168.122.21:6379> keys *
(empty list or set)
192.168.122.21:6379> hset test1 aa 11
(integer) 1
192.168.122.21:6379> hset test2 bb 22
(integer) 1
192.168.122.21:6379> set test3 xx
OK
192.168.122.21:6379> set test4 yy
OK
192.168.122.21:6379> keys *
1) "test3"
2) "test2"
3) "test1"
4) "test4"
192.168.122.21:6379> flushall
OK
192.168.122.21:6379> shutdown
not connected> quit
[root@xxCentos7One src]# ./redis-server /usr/local/redis-4.0.11/redis.conf 
[root@xxCentos7One src]# ./redis-cli -h 192.168.122.21 -p 6379             
192.168.122.21:6379> auth xx_1234
OK
192.168.122.21:6379> keys *
(empty list or set)

      针对上述问题,没能真正的恢复数据,解决思路和方法如下

      1:从aof文件中,删除最后的flushall操作(如果保留的话,那么重新加载aof文件的时候,redis依然会重做flushall这一步操作,那么结果依然是没有数据。所以这个命令不能留,包括这个命令之上的两行也要去掉)

      2:删除flushall命令之后,检查aof是否可用

      3:再次重启redis,数据加载成功

[root@xxCentos7One src]# cat appendonly.aof 
*3
$3
set
$5
test4
$2
yy
*2
$6
SELECT
$1
0
*1
$8
flushall    (删掉倒数三行)

##############################以下是检查aof文件############################

[root@xxCentos7One src]# ./redis-check-aof  --fix appendonly.aof 
0x              b1: Expected to read 10 bytes, got 0 bytes
AOF analyzed: size=177, ok_up_to=169, diff=8
This will shrink the AOF from 177 bytes, with 8 bytes, to 169 bytes
Continue? [y/N]: y
Successfully truncated AOF
[root@xxCentos7One src]# ./redis-check-aof  --fix appendonly.aof 
AOF analyzed: size=169, ok_up_to=169, diff=0
AOF is valid

###########################以下是再次使用aof文件启动redis####################

[root@xxCentos7One src]# ./redis-server /usr/local/redis-4.0.11/redis.conf                                             
[root@xxCentos7One src]# ./redis-cli -h 192.168.122.21 -p 6379 
192.168.122.21:6379> auth xx_1234
OK
192.168.122.21:6379> keys *
1) "test1"
2) "test3"
3) "test2"
4) "test4"
192.168.122.21:6379>

      由上图可知,数据恢复成功。其中关键步骤在于,要删除aof文件中和flushall命令相关的指令。然后检查aof是否正常。然后重启redis即可。

 

你可能感兴趣的:(redis)