6

Redis 持久化怎么玩

 3 years ago
source link: https://geekvic.top/post/758625c3.html
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.

什么是持久化?

将数据保存到可永久保存的存储设备中,持久化的主要应用是将内存中的对象存储到数据库中,或者存储到磁盘文件中、XML 数据文件中等。

也可以这样理解持久化:

应用层:如果关闭 (Close) 你的应用,然后重新启动则先前的数据依然存在。

系统层:如果关闭 (Shut Down) 你的系统 (电脑),然后重新启动则先前的数据依然存在。

为何要持久化?

Redis 的数据是缓存在内存中的,当你重启系统或者关闭系统后,缓存在内存中的数据会丢掉,因此为了让数据能够长期保存,就要将 Redis 里的数据做持久化存储。

持久化有哪几种?

Redis 为持久化提供了两种方式:

RDB
每隔 N 分钟或 N 次操作,从内存 dump 数据形成 rdb 文件,压缩,放在备份目录,主要是以快照的方式进行保存。

AOF
记录每次对 redis 的命令操作,有点类似记录操作日志,当服务器重启的时候会重新执行这些命令来恢复原始数据。

持久化配置

RDB 持久化配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#时间策略
save 900 1 #900秒至少有一个变化,则dump
save 300 10 #300秒至少有10个变化,则dump
save 60 10000 #60秒至少有10000个变化,则dump

stop-writes-on-bgsave-error yes #如果持久化出错,主程序是否停止写入

rdbcompression yes #是否支持压缩

rdbchecksum yes #存储和加载rdb文件时是否校验

dbfilename dump.rdb #设置rdb文件名

dir /usr/local/data #rdb文件保存路径

如果想禁用 RDB 配置,在 save 的最后一行写上:save “”

AOF 持久化配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
appendonly yes #是否开启aof,默认no

appendfilename "appendonly.aof" #文件名称

appendfsync everysec #同步方式

no-appendfsync-on-rewrite no #aof重写期间是否不同步

#重写触发配置
auto-aof-rewrite-percentage 100 #aof文件大小比起上次重写时的大小增长率100%时重写
auto-aof-rewrite-min-size 64mb #aof文件至少64M时重写

aof-load-truncated yes #加载aof时如果有出错的处理

aof-use-rdb-preamble yes #文件重写策略

appendfsync 有三种模式:

always:每一个命令都同步到 aof,安全,速度慢。

no: 由操作系统判断缓冲区大小,统一写入到 aof,同步频率低,速度快。

everysec:折中方案,每秒写一次,最多丢一秒。

aof-load-truncated yes 如果配置启用,在加载时如果发现 aof 尾部不正确时,会向客户端写入一个 log,但是会继续执行,如果设置为 no,发现错误就会停止,必须修复后才能重新加载。

持久化工作原理

RDB 工作原理

RDB 持久化触发分为两种:自己手动触发与 Redis 定时触发。

  • save:会阻塞当前 redis 服务器,直到持久化完成,线上应该禁止使用。
  • bgsave:该触发方式会 fork 一个子进程,由于进程负责持久化过程,因此阻塞只会发生在 fork 子进程的时候
  • 根据 save m n 配置规则自动触发
  • 从节点全量复制时,主节点发送 rdb 文件给从节点完成复制操作,主节点会触发 bgsave
  • 执行 debug reload 时;
  • 执行 shutdown 时,如果没有开启 aof,也会触发

AOF 工作原理

主要分为两步:

  1. 命令的实时写入,如果是 appendfsync everysec 配置,会有 1s 损耗
  2. 对 aof 文件重写

aof 重写是为了减少 aof 文件的大小,可以手动或者自动触发。

  • 手动触发:bgrewriteof
  • 自动触发:根据配置规则触发,当然自动触发的整体时间还跟 Redis 的定时任务频率有关系

持久化恢复数据

如果一台服务器上既有 RDB 文件,又有 AOF 文件,加载哪个呢?

如果想要恢复数据,只要重启 Redis 即可。启动时会检查 AOF 文件是否存在,如果不存在就尝试加载 RDB。优先加载 AOF 的原因是 AOF 保存的数据更完整,我们知道 AOF 基本上最多丢失 1s 的数据。如下图所示。

redis数据恢复.png

性能优化建议

  1. 如果 Redis 数据并不是很重要或者可以通过其他方式重写生成数据,可以关闭持久化,如果丢失数据可以通过其他途径补回
  2. 自定义策略定期检查 Redis 情况,然后可以手动触发备份、重写数据
  3. 单机如果部署多个实例,要防止多个实例同时运行持久化、重写操作,防止出现内存、CPU、IO 资源竞争,让持久化变成串行
  4. 可以配置主从复制,利用一台从服务器进行备份处理,其他机器正常响应客户端的命令
  5. RDB 持久化与 AOF 持久化可以同时存在,配合使用。

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK