在Redis中有2种持久化保存数据的方式,分别是rdb和aof,默认情况下aof是关闭的,需要到redis.conf文件中修改appendonly为yes来启用aof持久化配置,我们先了解下rdb和aof的持久化保存区别
rdb | aof | |
优点 | 1.对性能影响小,因为它单独开启子线程来进行备份操作。 2.rdb的启动速度比aof快。 3.可以通过配置save "" 来禁用rdb备份。 4.rdb文件通过压缩后可以进行远程容灾备份。 5.rdb文件是一个单时间点快照的备份文件。 | 1.aof有3种不同的appendfsync备份机制:no、always、everysec,默认是everysec。 2.aof文件是递增的添加,如果递增的时候文件产生异常,可以通过redis-check-aof工具快速的找到。 3.每次的写操作都会记录到aof文件中,比rdb方式更安全。 4.aof文件读取和修改都方便。 5.当aof文件过大时,aof文件可以在后台自动被重写。 |
缺点 | 1.rdb文件在发生备份前Redis服务器可能停止服务,在这次发生故障的时间与上次备份文件产生的时间区间内所有的写操作都会丢失。 2.如果Redis中数据量太大,并且CPU不够好的时候,在进行子进程备份的时会造成Redis服务器阻塞。 | 1.在相同的Redis数据内容的情况下,aof文件比rdb的大。 2.aof文件的数据恢复速度比rdb慢。 3.性能消耗上面aof比rdb的高。 |
我们首先了解下rdb实现数据备份的方式,在redis.conf文件中rdb的配置文件为dbfilename dump.rdb,数据持久化有下面的方式进行配置
save 900 1
save 300 10
save 60 10000
#存快照到磁盘:
# 格式:save <间隔时间(秒)> <写入次数>
# 根据给定的时间间隔和写入次数将数据保存到磁盘
# 上面的例子的意思是:
# 900 秒内如果至少有 1 个 key 的值变化,则保存
# 300 秒内如果至少有 10 个 key 的值变化,则保存
# 60 秒内如果至少有 10000 个 key 的值变化,则保存
# 注意:你可以注释掉所有的 save 行来停用rdb快照保存功能。
# 也可以直接一个空字符串来实现停用:
# save ""
在看下aof方式的配置,在默认情况下redis.conf是没有打开aof的配置开关的,是因为它比rdb的方式消耗性能一些,我们可以通过使用appendonly为yes的方式启用aof的备份方式,备份文件配置为appendfilename "appendonly.aof",持久化配置的方式为
appendfsync everysec
# aof持久化策略的配置
# no表示不执行fsync,由操作系统保证数据同步到磁盘,返回客户端消息的速度最快。Linux是默认30s进行一次磁盘写操作
# always表示每次写入都执行fsync,以保证数据同步到磁盘。
# everysec表示每秒执行一次fsync,可能会导致丢失这1s数据
默认情况采用的是everysec。在进行redis配置的时候我们一般情况下这2种备份方式都会启用,做到最安全的备份和最快的速度恢复备份。
如果从操作系统的层面来看,上面的写磁盘操作并不一定是真正的已经把数据写入到磁盘了,我们从操作系统层面来分析下磁盘的写入过程:
1.客户端发送一个写命令到Redis,这个时候的数据是存放在客户端的内存中的。
2.Redis接收到写操作数据后,把写的操作的数据存入到Redis服务器所在的内存中。
3.Redis调用将数据写到磁盘上的系统调用,这个时候数据在内核的缓冲区中。
4.操作系统将写缓冲区传输到磁盘控制器,这个时候数据在磁盘缓存中。
5.磁盘控制器实际上将数据写入磁盘中。
因此从这个过程看到数据要真正的做到持久化也是需要一定时间的,只要在这5个步骤中有任何一个步骤发生错误都会导致数据的丢失,我们最后总结下在Redis层面持久化数据丢失的可能性:
1.rdb的方式:
因为rdb是存储某个时间点的Redis快照信息,如果在2个快照存储区间内的数据没有来得及持久化保存的话就会出现数据丢失。
2.aof的方式:
默认是每秒一次的持久化保存,因此可能会丢失1s的数据,如果改成了always的方式,则会严重影响Redis的性能。
3.主从复制丢失的可能:
因为主从复制是异步的方式,因此存在一定的窗口期并且有可能会出现网络的问题,甚至服务器出现问题,因此也可能会出现数据的丢失。
因此无论是持久化还是主从的方式都可能会出现数据的丢失,而Redis整体的实现也只是数据最终一致性,并不保证数据的可靠性,它保证的是高可用和高性能。在生产环境的使用过程中,我们一定要平衡好aof的使用,因为它对性能是有影响的,需要平衡好性能和持久化的关系。