Redis数据库的dump备份与aof备份

来源:互联网 发布:流程梳理,优化建议书 编辑:程序博客网 时间:2024/05/22 00:31

Redis自动备份有两种方式,第一种是通过dump.rdb文件实现备份,另外一种使用aof文件实现自动备份。

Dump.rdb备份

Redis中默认使用dump.rdb文件实现备份,如果aof备份没有打开,那么启动redis时,会默认从dump.rbd文件中读取原始数据.

如何配置dump.rdb备份,在redis.conf文件中有命令:

save 900 1save 300 10save 60 10000

它代表的意思是dump备份的条件,在900s内有一个key发生改变/300s中有10个key发生改变/60s内有10000个key发生改变时,redis将将当前数据库快照到dump.rdb文件中。

也可以执行命令来实现手动备份

SAVE

SAVE命令表示使用主进程将当前数据库快照到dump文件

BGSAVE

BGSAVE命令表示,主进程会fork一个子进程来进行快照备份。

两者的不同是,前者会阻塞主进程,而后者不会,所以一般使用BGSAVE进行手动备份。

redis快照到dump文件时,会先生成一个temp.rdb文件,然后重命名为dump.rdb文件替换原来文件实现备份。

redis.conf中的

dbfilename dump.rdb  //修改dump文件名称dir ./    //修改dump文件的文件路径

aof文件备份

redis默认关闭了aof文件备份,redis.conf文件中找到

appendonly no

把no改为yes

appendfilename appendonly.aof

可以修改默认的aof文件名

appendfsync everysec

这里默认的everysec会在安全和效率之间权衡,redis默认会每隔1s就调用fsync函数,将缓冲区的数据写到磁盘里面,但是当fsync函数执行时间超过1s时,redis会适当延迟写操作。当appendfsync设置为always时,redis会针对每一个写操作都刷新到磁盘,这样虽然安全,但是性能会有所降低。当设置为no时,redis不会主动对数据进行备份,这时什么时候刷新备份,就依赖于操作系统的设置了。

Aof bgrewriteaof操作

aof文件备份,会备份数据库的历史记录,以及相应执行过的指令,相当于一个log文件,在恢复数据库的时候会回滚执行命令,同时恢复数据。这样带来的一个问题就是,aof文件会越来越大,如果有一百条指令,最后一条指令恢复的最终数据库,那么前99条指令及相应的数据也会存在在aof文件中。如何解决的这个问题呢?

可以执行命令:

bgrewriteaof

就会把当前数据库刷新到aof文件中,此时aof文件中将只会保存当前数据库的数据,所以如果数据库被入侵清空,请谨慎执行这个命令,因为它会数据库上的历史数据消失。

redis也会自动调用bgwriteaof操作:

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

这里的设置针对redis自动进行rewriteaof操作。percentage是指,当redis当前的aof文件大小相对于上一次进行rewriteaof操作时的大小增长率大于100%时,就会进行rewrite,这里可以自己设置。

但是,当增长率大于了100%,实际上aof文件其实很小,这样rewrite就没有必要了,所以,还需要设置一个min-size,当redis的增长率大于100%,并且min-size的大于64mb时,就会执行rewriteaof操作。

如果想关闭rewriteaof操作,可以将percentage设置为0。

redis会在以下三个时候进行rewrite操作

  • Redis接收到客户端发送的bgrewriteaof命令
  • Redis aof文件增长率和增长大小达到auto-aof-rewrite
  • Redis接收到客户端发送的”CONFIG SET appendonly yes”命令

aof与dump备份不同

aof文件备份与dump文件备份不同。dump文件的编码格式和存储格式与数据库一致,而且dump文件中备份的是数据库的当前快照,意思就是,不管数据之前什么样,只要BGSAVE了,dump文件就会刷新成当前数据库数据。

当redis重启时,会按照以下优先级进行启动:

  • 如果只配置AOF,重启时加载AOF文件恢复数据;
  • 如果同时 配置了RBD和AOF,启动是只加载AOF文件恢复数据;
  • 如果只配置RBD,启动时将加载dump文件恢复数据。

注意:只要配置了aof,但是没有aof文件,这个时候启动的数据库会是空的

在linux环境运行Redis时,如果系统的内存比较小,这个时候自动备份会有可能失败,需要修改系统的vm.overcommit_memory 参数,这个参数是干什么的呢,它有三个选值,是linux系统的内存分配策略:

  • 0, 表示内核将检查是否有足够的可用内存供应用进程使用;如果有足够的可用内存,内存申请允许;否则,内存申请失败,并把错误返回给应用进程。
  • 1, 表示内核允许分配所有的物理内存,而不管当前的内存状态如何。
  • 2, 表示内核允许分配超过所有物理内存和交换空间总和的内存

Redis官方的说明是,建议将vm.overcommit_memory的值修改为1,可以用下面几种方式进行修改:

  • (1)编辑/etc/sysctl.conf ,改vm.overcommit_memory=1,然后sysctl -p 使配置文件生效
  • (2)sysctl vm.overcommit_memory=1
  • (3)echo 1 > /proc/sys/vm/overcommit_memory

参考链接:

有关linux下redis overcommit_memory的问题
Redis的AOF功能
Redis数据备份与恢复
redis的两种备份方式

0 0
原创粉丝点击