Redis 数据备份与恢复

2021年8月18日17:26:19 发表评论
摘要

【心语】人生就像储蓄罐,你投入的每一分努力都会在未来的某一天回馈于你。请相信:滴水穿石,不是水的力量,是坚持的力量。

Redis简介:

REmote DIctionary Server(Redis) 是一个由Salvatore Sanfilippo写的key-value存储系统
Redis所有数据都是保存在内存中,Redis数据备份可以定期的通过异步方式保存到磁盘上,该方式称为半持久化模式,如果每一次数据变化都写入aof文件里面,则称为全持久模式,同时还可以基于Redis主从复制实现Redis备份与恢复

一、半持久化模式
半持久化RDB模式也是Redis备份默认方式,是通过快照(snapshotting)完成的,当符合在Redis.conf配置文件中设置的条件时,Redis会自动将内存中的所有数据进行快照并存储在硬盘上,完成数据备份
Redis进行RDB快照的条件由用户在配置文件中自定义,由两个参数构成:时间和改动的键的个数。当在指定的时间内被改的键的个数大于指定的数值时就会进行快照,在配置文件中已经预制了3个条件
save 900 1                                         #900秒内有至少1个键被更改则进行快照;
save 300 10                                       #300秒内有至少10个键被更改则进行快照;
save 60 10000                                  #60秒内有至少10000个键被更改则进行快照。
Redis 数据备份与恢复
默认可以存在多个条件,条件之间是 “或”的关系,只要满足其中一个条件,就会进行快照。如果想要禁用自动快照,只需要将所有的save参数删除即可。Redis默认会将快照文件存储在Redis数据目录,默认文件名为:dump.rdb文件,可以通过配置dir和dbfilename两个参数分别指定快照文件的存储路径和文件名。也可以在Redis命令行执行config get dir 获取Redis数据保存路径
[root@localhost ~]# redis-cli
127.0.0.1:6379> config get dir
Redis 数据备份与恢复
Redis 数据备份与恢复
#以上是Redis数据目录以及dump.rdb 文件
二、Redis快照实现过程
Redis实现快照的过程,Redis使用fork函数复制一份当前进程(父进程)的副本(子进程),父进程继续接收并处理客户端发来的命令,而子进程开始将内存的数据写入硬盘的临时文件,当子进程写入完所有的数据后会用该临时文件替换旧的RDB文件,至此一次快照操作
执行fork的时操作系统会使用写时复制(copy-on-write)策略,即fork函数发生的一刻父子进程共享同一内存数据,当父进程要更改其中某片数据时,操作系统会将该片数据复制一份以保证子进程数据不受影响,所以新的RDB文件存储的是执行fork一刻的内存数据
Redis在进行快照的过程中不会修改RDB文件,只有快照结束后才会将旧的文件替换成新的,也就是说任何时候的RDB文件都是完整的。这使得我们可以通过定时备份RDB文件来实现Redis数据库备份
RDB文件是经过压缩(可以配置rdbcompression参数以禁用压缩节省CPU占用)的二进制格式,所以占用的空间会小于内存中的数据大小,更加利于传输。除了自动快照,还可以手动发送SAVE和BGSAVE命令让Redis执行快照,两个命令的区别在于,save 是由主进程进行快照操作的,会阻塞住其它请求,BGSAVE会通过fork子进程进行快照操作
Redis 启动后会读取RDB快照文件,将数据从硬盘载入到内存,根据数据量大小与结构和服务器性能不同,通常将一个记录一千万个字符串类型键、大小为1GB的快照文件载入到内存中需要花费20-30秒钟
通过RDB方式实现持久化,一旦Redis异常退出,就会丢失最后一次快照以后更改的所有数据,此时需要开发者根据具体的应用场合,通过组合设置自动快照条件的方式来将可能发生的数据损失控制在能够接受的范围
#演示使用命令Redis数据备份和恢复
语法:
[root@MQ1 ~]# redis-cli
127.0.0.1:6379> save
Redis 数据备份与恢复
该命令将在redis按爪个目录创建dump.rdb文件
#恢复数据
如果需要恢复数据,只需将备份文件(dump.rdb)移动倒redis数据目录并启动服务器即可,获取redis数据目录可以使用config命令,如下所示
127.0.0.1:6379> config get dir
Redis 数据备份与恢复
说明:此命令直接输出了 redis 得安装目录
Bgsave 这个命令也可以备份
127.0.0.1:6379> BGSAVE
Redis 数据备份与恢复
两个命令的区别在于,前者是由主进程进行快照操作,会阻塞住其他请求,后者会通过fork子进程进行快照操作。
二、全持久化AOF模式
如果数据很重要无法承受任何损失,可以考虑使用AOF方式进行持久化,默认Redis没有开启AOF方式得全持久化模式
在启动时Redis会逐个执行AOF文件中得命令来将硬盘中的数据载入到内存中,载入的速度相较RDB会慢一些,开启AOF持久化后每执行一条会更改Redis中的数据命令,Redis就会将该命令写入硬盘中的AOF文件,AOF文件的保存位置和RDB文件的位置相同,都是通过dir参数设置的,默认的文件名是 appendonly.aof,可以通过appendfilename参数修改该名称。
Redis允许同时开启AOF和RDB,既保证了数据安全又使得进行备份等操作十分容易,此时重新启动Redis后Redis会使用AOF文件来恢复数据,因为AOF方式的持久化可能丢失的数据更少,可以在redis.conf中通过appendonly参数开启Redis AOF全持久化模式:
#Redis AOF持久化参数配置详解

appendonly          yes                                                                                  #开启AOF持久化功能;

appendfilename          appendonly.aof                                                      #AOF持久化保存文件名;

appendfsync            always                                             #每次执行写入都会执行同步,最安全也最慢;

#appendfsync              everysec                                 #每秒执行一次同步操作;

#appendfsync         no                  #不主动进行同步操作,而是完全交由操作系统来做,每30秒一次,最快也最不安全;

auto-aof-rewrite-percentage 100 #当AOF文件大小超过上一次重写时的AOF文件大小的百分之多少时会再次进行重写,如果之前没有重写过,则以启动时的AOF文件大小为依据;

auto-aof-rewrite-min-size 64mb #允许重写的最小AOF文件大小配置写入AOF文件后,要求系统刷新硬盘缓存的机制。

3、结语
Redis主从复制优点及应用场景, WEB应用程序可以基于主从同步实现读写分离以提高服务器的负载能力。在常见的场景中,读的频率一般比较大,当单机Redis无法应付大量的读请求时,可以通过复制功能建立多个从数据库,主数据库只进行写操作,而从数据库负责读操作,还可以基于LVS+keepalived+Redis对Redis实现均和高可用。

从数据库持久化持久化通常相对比较耗时,为了提高性能,可以通过复制功能建立一个(或若干个)从数据库,并在从数据库中启用持久化,同时在主数据库禁用持久化。

当从数据库崩溃时重启后主数据库会自动将数据同步过来,所以无需担心数据丢失。而当主数据库崩溃时,需要在从数据库中使用SLAVEOF NO ONE命令将从数据库提升成主数据库继续服务,并在原来的主数据库启动后使用SLAVE OF命令将其设置成新的主数据库的从数据库,即可将数据同步回来。

  • 微信公众号
  • 这是我的微信公众号扫一扫
  • weinxin
  • 我的QQ技术群
  • 我的QQ技术群扫一扫
  • weinxin
admin

发表评论

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen: