Redis备份02-AOF方式备份

168 阅读6分钟

本文已参与「新人创作礼」活动,一起开启掘金创作之路。 一、目标 掌握什么叫AOF方式备份、它与RDB备份有啥区别、掌握如何恢复AOF备份的数据库、最后再了解一下AOF重写

二、引言 1.上篇帖子已经讲了RDB方式自动备份redis数据库,见《Redis备份01-RDB方式备份》。AOF和RDB的配置基本类似

三、关于AOF 1.AOF原理

● Redis将每个写操作(执行成功),写入一个aof文件;

● Redis重启时只要从头到尾执行一次aof文件, 即可恢复据。也可以将aof文件复制到别的服务器,做数据移植。

● 注意:在重启时,要恢复数据,如果rdb文件和aof文件同时存在,以AOF为准。

2.AOF主要配置

●appendonly yes #启动AOF机制

△appendfsync always #每次收到写命令就立即强制写入磁盘,保证完全的持久化,但产生极大的10开销(不推荐使用) △appendfsync everysec #每秒钟强制写入磁盘-一次, 在性能和持久化方面做了很好的折中(推荐使用) △appendfsync no #由操作系统决定何时同步,如果系统宕机则导致redis丢失不定数量数据

●appendfilename "appendonly.aof" #设置aof文件名

3.需要注意的细节

●AOF文件会不断增长可能比快照文件大几倍),在极端情况下,可能会对硬盘空间造成压力 ●Redis重启时,需要重新执行一个可能非常大的AOF,时间会很长 ●AOF同步时间间隔小,数据更安全,理论上至多丢失1秒的数据,比rdb更擅长做更实时的持久化

三、修改redis全局配置文件,实现AOF备份 1.编辑redis的全局配置文件redis.conf(根据实际情况来定该文件的具体路径)

vim /home/xredis/software/redis-5.0.7/redis.conf 2.将【appendonly no】修改为【appendonly yes】;

3.将【appendfilename "appendonly.aof"】修改为【appendfilename "xkahn-appendonly.aof"】;

4.确保【appendfsync everysec】没被#注释,确保【# appendfsync always】和【# appendfsync no】被注释。

5.注意:上篇帖子还将【dir ./】改成了【dir /redisdata】,该目录也适用于AOF备份。即【dir】是定义备份文件的存放路径。啰嗦:确保dir的文件夹存在,且有权限。

6.重启redis服务,让配置生效。

#ps -ef |grep redis |grep 6379 |awk '{print $2}' |xargs kill su - xredis cd /home/xredis/software/redis-5.0.7/src nohup ./redis-server ../redis.conf & 7.(可略)检验redis是否启动成功

ss -ntl |grep 6379

四、测试往redis数据库里写入数据,检验是否自动备份成aof文件 1.再开一个shell窗口,便于登录redis的命令行

2.使用redis的客户端登录工具连接到redis数据库

cd /home/xredis/software/redis-5.0.7/src ./redis-cli 3.(可略)查看能否自动恢复上次备份的RDB是否会被自动恢复出来

keys * 纳尼?为啥是空的?rdb备份失效了?还是出啥问题了?

没有出问题,这是正常的。因为我们刚刚配置了AOF备份,AOF备份的优先级是高于RDB的,由于是第一次开启AOF,所以抛弃了RDB备份恢复,数据相应的也没有了。

4.在redis命令行工具下往redis数据库里加入测试数据

set name1 kahn set age1 18 set name2 songshuer set age2 20 set name3 yiwanka set age3 25 set name4 fanbingbing set age4 30 set name5 liuduoyan set age5 31 set name6 liuduoyan set age6 32 set name7 serena set age7 17

image.png

5.查看rdb数据库是否自动备份了

ls -sh /redisdata/

image.png

image.png 6.(可略)看看aof备份文件里写的是啥

more /redisdata/xkahn-appendonly.aof

image.png

(扩展)在redis.conf全局配置文件中,有这么一行【databases 16】,代表默认redis有16个库,库是没有名字的,用数字0-15来区分。在redis-cli命令行中使用select 0,代表切换到第一个数据库,再比如select 15代表切换到最后一个数据库,即切换到第16个数据库。

五、用AOF备份文件恢复redis数据库 当你重启redis服务时,它会检测配置文件redis.conf中的工作目录,以及工作目录下的指定的aof备份文件,将自动读取aof备份文件将其加载到redis内存数据库中。

啰嗦:就是说如果你的工作目录中有对应文件件名的备份文件的话,你想要恢复数据库,只需要重启redis服务即可,它会自动恢复数据库的。

啰嗦:那如何知道自己的工作目录呢?使用redis-cli命令[config get dir]即可看到。

六、(了解)关于AOF重写(默认已经配置了,无需再配) 1.配置文件redis.conf中的aof重写的默认配置

auto-aof-rewrite-percentage 100 auto-aof-rewrite-min-size 64mb

image.png 注释: auto-aof-rewrite-percentage 100 --->当aof文件的体谅增长到了100%(1倍)时就会触发重写。(跟谁比增加了1倍?看下面) auto-aof-rewrite-min-size 64mb --->当aof增长了64mb的时候就会触发重写,结合上面的,那下次就是64*2=128M时重写。

即,第一次重写aof备份文件时是在文件达到64M的时候,第二次重写AOF文件时是在当aof文件达到了64一倍后即128M时重写?再第二次重写后的aof就压缩了,大小就不确定了,比如是x,只有等到下次aof文件大小是x*2的时候重写,依次类推。

默认配置中的重写百分比100和最小文件大小64的值都是可以根据自己的情况去更改的。

2.无需重启redis服务,因为它本身默认就是写在配置文件中的,默认就启动了

七、总结 1.AOF备份是可以实时备份,和mysql的bin-log日志备份数据有异曲同工之妙。

2.AOF备份非常简单,只需要再redis.conf里简单定义几行备份策略即可。

3.AOF恢复的时间比RDB要慢,特别是数据量大的时候。(aof要一条一条读取日志,再一条一条的写入数据库,肯定慢)

4.AOF更适合实时备份,不太,注意是不太适合数据迁移,因为要读取,要写入,非常花费时间。用也是能用。

5.AOF备份建议使用appendfsync everysec策略,即每秒备份一次。

6.AOF文件可能要比实际数据库的量要大好几倍,可能会给硬盘存储空间造成压力,在实际生产环境中注意AOF文件夹所在的磁盘留有足够量的空间。

7.理论上使用appendfsync everysec最多丢1秒的数据,但实际可能由于网络延迟等原因会丢失几秒的数据。(但已经不错了)

8.AOF重写的功能默认是开启的,AOF重写就是为了压缩AOF备份文件。

----------xok----------------------END---------------2020年7月2日------------------------------------