Redis 持久化

1、RDB持久化

1-1、初始化环境

配置 redis.conf

# 900秒有1个key改动,执行快照生成
save 900 1
save 300 10
save 60 10000

1-2、什么叫Redis快照

快照,顾名思义又可以理解为拍照一样,把整个内存数据映射到硬盘中,保存一份到硬盘,因此恢复数据起来比较快,把数据映射回去即可,不像AOF,一条条执行操作命令

快照是默认的持久化方式。这种方式是就是将内存中数据以快照的方式写入到二进制文件中,默认的文件名为dump.rdb。可以通过配置设置自动做快照持久化方式

image

手动持久化方式

# 方式一
127.0.0.1:6379> save
# 方式二
127.0.0.1:6379> bgsave

save bgsave 的区别

命令 save bgsave
IO类型 同步 异步
是否阻塞
复杂度 耗时 耗时
优点 不会消耗额外内存 不阻塞客户端命令
缺点 阻塞客户端命令 需要fork,消耗内存

查看内存

127.0.0.1:6379> info memory

1-3、优劣点

优点

  1. 快照保存数据速度极快,还原数据速度极快
  2. 适用于灾难备份
  3. 不会消耗额外内存
  4. 启动效率高
  5. fork子进程性能最大化

缺点

  1. 耗时,耗性能
  2. 会存在数据丢失
  3. 数据量比较大的情况下,会形成阻塞

1-4、定时RDB日志备份

vim redis-rdb-copy-per-hour.sh

[root@redis-master bin]# pwd
/usr/local/redis/bin
[root@redis-master bin]# vim redis-rdb-copy-per-hour.sh

#!bin/bash
cur_date=$(date "+%Y%m%d%H%M%S")
rm -rf /usr/local/redis/snapshotting/$cur_date
mkdir -p /usr/local/redis/snapshotting/$cur_date
cp /usr/local/redis/data/dump.rdb /usr/local/redis/snapshotting/$cur_date

del_date=$(date -d -48hour "+%Y%m%d%H%M")
rm -rf /usr/local/redis/snapshotting/$del_date
chmod +x redis-rdb-copy-per-hour.sh
crontab -e 
# 添加
*/1 * * * * sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
*/1 * * * * sleep 10; sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
*/1 * * * * sleep 20; sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
*/1 * * * * sleep 30; sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
*/1 * * * * sleep 40; sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh
*/1 * * * * sleep 50; sh /usr/local/redis/bin/redis-rdb-copy-per-hour.sh

2、AOF持久化

2-1、含义

它也是Redis持久化的重要手段之一,AOF(Append Only File)只追加文件,也就是每次处理完请求命令后都会将此命令追加到aof文件的末尾。而RDB是压缩成二进制等时机开子进程去干这件事

image

2-2、RDB和AOF的区别

命令 RDB AOF
启动优先级
体积
恢复速度
数据安全性 丢失数据 根据策略决定
轻重

2-3、开启AOF

配置 redis.conf

# 配置aof
appendonly yes
appendfilename "appendonly.aof"

2-4、同步策略

3 种AOF策略

  • 每秒同步(默认,每秒调用一次fsync,这种模式性能并不是很糟糕)
  • 每修改同步(会极大削弱Redis的性能,因为这种模式下每次write后都会调用fsync)
  • 不主动同步(由操作系统自动调度刷磁盘,性能是最好的)
# 配置redis

# 每秒钟同步一次
appendfsync everysec
# 每次有数据修改发生时都会写入AOF文件
appendfsync always
# 从不同步, 高效但是数据不会主动被持久化
appendfsync no

2-5、AOF工作原理

image

AOF的频率高的话肯定会对Redis带来性能影响,因为都是刷盘操作。跟mysql一样了。Redis每次都是先将命令放到缓冲区,然后根据具体策略进行刷盘操作。如果配置always,那么就是典型阻塞,如果是everysec每秒的话,那么会开一个同步线程去每秒进行刷盘操作,对主线程影响稍小

2-6、写入与恢复

AOF文件是一个只进行append操作的日志文件,因此在写入过程中即使出现宕机现象,也不会破坏日志文件中已经存在的内容。假如一次操作只是写入了一半数据就会出现了系统奔溃问题,不用担心,在Redis下一次启动之前,我们通过redis-check-aof工具来帮助我们修复问题

AOF文件有序地保存了对数据库进行执行的所有写入操作,这些写入操作以Redis协议的格式保存,因此AOF文件的内容非常容易被人读懂,对文件进行分析也很轻松

导出AOF文件也非常简单:举个例子,如果你不小心执行了FLUSHALL命令,但只要AOF文件未被重写,那么只是停止服务器,移除AOF文件末尾的FLUSHALL命令,并启动Redis,就可以将数据恢复到FLUSHALL执行之前状态

2-7、重写

Redis 可以在AOF文件体积变得过大时,自动地在后台对AOF进行rewrite。Redis以append模式不断的将修改数据写入到老磁盘文件中,同时Redis还会创建一个新的文件用于记录此期间有哪些修改命令被执行

因为Redis在创建新AOF文件的过程中,会继续将命令追加到现有的AOF文件里面,即使重写过程中发生停机,现有的AOF文件也不会丢失

而一旦新AOF文件创建完毕,Redis就会从旧AOF文件切换到新的AOF文化,并开始对新的AOF进行追加操作

# 配置redis.conf
no-appendfsync-on-rewrite no
# 当前aof文件大于多少字节后才触发重写
auto-aof-rewrite-min-size 64mb
# 当前写入日志文件的大小超过上一次的百分之多少,才触发重写
auto-aof-rewrite-percentage 100
# 如果aof文件结尾损坏,redis启动时是否依然载入AOF文件
aof-load-truncated yes

# 执行
127.0.0.1:6379> bgwriteaof

2-8、优劣点

优点

  • 数据不易丢失
  • 自动重新机制
  • 易懂恢复

缺点

  • AOF文件恢复数据慢

  • AOF持久化效率低

3、如何选择RDB和AOF

3-1、同时开启

Redis 先加载AOF文件来恢复原始数据,因为AOF数据比RDB更完整,但是AOF存在潜在的bug,如果把错误的操作记录写入aof,会导出数据恢复失败,所以可以把RDB作为后备数据

为了考虑性能,可以只在slave上开启RDB,并且15min备份一次,如果为了避免AOF rewrite的IO以及阻塞,可以在Redis集群中不开启AOF,靠集群的备份机制来保证可用性,在启动时选取较新的RDB文件,如果集群全部奔溃,就会丢失15min前的数据

3-2、混合模式

Redis 4.x 开始支持模式,为了解决Redis在启动时通常加载AOF文件,但加载速度慢。因为RDB数据不完成,所以加载AOF

开启方式:aof-user-rdb-preamble true ,开启后,AOF在重写时会直接读取RDB中的内容,通过 bgwriteaof 完成

执行过程

  1. 子进程会把内存中数据以RDB的方式写入aof中
  2. 把重写缓冲区的增量命令以AOF方式写入到文件中
  3. 将含有RDB个数和AOF个数的AOF数据覆盖旧的AOF文件
  4. 最后新的AOF文件中,一部分数据来自RDB文件,一部分来自Redis运行过程时的增量数据

3-3、数据恢复

当开启混合模式时,启动redis依然优先加载aof文件,莫非是两种情况:

  • aof 文件开头是rdb的格式,先加载rdb内容更加载剩余的aof
  • aof文件开头不是rdb的格式,直接以aof格式加载整个文件

优点:既能快速备份又能避免大量数据丢失

缺点:RDB是压缩格式,AOF在读取它时可读性较差

3-4、动态切换

简介

从Redis 2.x 以上,在不重启的情况下。从RDB切换到AOF

  • 为最新的dump.rdb 文件创建一个备份
  • 将备份放在安全的地方
[root@redis-master data]# pwd
/usr/local/redis/data
[root@redis-master data]# cp dump.rdb dump.rdb.bak
  • 执行命令
# 开启aof
redis-cli config set appendonly yes
# 关闭rdb
redis-cli config set save ""
posted @ 2021-07-11 20:18  q-linyu  阅读(46)  评论(0)    收藏  举报