Redis 从入门到入土④:持久化
Redis 是内存型数据库,为了保证数据在断电后不会丢失,需要将内存中的数据持久化到硬盘上。
1. RDB 持久化
概述:
将 ** 某个时间点 ** 的所有数据都存放到硬盘上
可以将 快照 复制到其它服务器从而创建具有相同数据的服务器副本
缺点:
- 如果数据量很大,保存快照的 时间会很长
- 如果系统发生故障,将会 ** 丢失 ** 最后一次创建快照之后的数据
- 不支持拉链,只有一个 dump.rdb
优点: 回复速度相对快
场景: 关机维护
三种触发机制:
- save 命令:
- 同步
- 直接生成 rdb 二进制文件
- 若有老的备份,新的备份会替换老的备份
- bgsave 命令:
- 异步
- 通过 fork () 创建一个子进程去创建 rdb 文件
- fork ():浅拷贝 + copy on write:可以做到快速拷贝,且父子互不影响
- 快速拷贝
- 写时复制触发次数不多(不可能父子进程把所有数据都改一遍)
- 配置:
- save seconds changes(save 900 1)
- 本质为执行 bgsave
- 一般都会把配置关闭
- 推荐配置如下
1
2
3
4
5
6
7
8
9
10备份命名为 dump-${port}.rdb
dbfilename "dump-${port}.rdb"
备份存储位置
dir /bigdiskpath
bgsave 错误时停止写入
stop-writes-on-bgsave-error yes
压缩格式
rdbcompression yes
校验和
rdbchecksum yes
2. AOF 持久化
概述: 将写命令添加到 AOF 文件(Append Only File)的末尾
过程: 每次执行写命令时会把命令加入缓冲区,缓冲区根据策略进行持久化
缺点: 体量无限变大
2.1. 同步选项
使用 AOF 持久化需要设置同步选项,从而确保写命令 ** 什么时候 ** 会同步到磁盘文件上
这是因为对文件进行写入并不会马上将内容同步到磁盘上,而是先存储到缓冲区,然后由操作系统决定什么时候同步到磁盘
选项 | 同步频率 |
---|---|
always | 每个写命令都同步 |
everysec | 每秒同步一次 |
no | 让操作系统来决定何时同步 |
- always: 会严重减低服务器的性能
- everysec: 比较合适,可以保证系统崩溃时只会丢失一秒左右的数据,并且 Redis 每秒执行一次同步对服务器性能几乎没有任何影响
- no: 并不能给服务器性能带来多大的提升,而且也会增加系统崩溃时数据丢失的数量
2.2. AOF 重写(4.0 以前)
随着服务器写请求的增多,AOF 文件会越来越大
Redis 提供了一种将 AOF 重写的特性,能够去除 AOF 文件中的冗余写命令
原理: 删除抵消的命令,合并重复的命令
两种方式:
- bgrewriteaof 命令:
- 异步
- 通过 fork () 创建一个子进程来在内存中执行 AOF 重写
- 配置:
- 推荐配置如下
1
2
3
4
5
6
7
8
9
10
11
12
13
14启动 AOF
appendonly yes
备份名
appendfilename "appendonly-${port}.aof"
持久化策略为每秒进行
appendfsync everysec
备份存储位置
dir /bigdiskpath
AOF 重写时不会执行 AOF
no-appendfsync-on-rewrite yes
AOF 文件重写所需的最小大小
auto-aof-rewrite-min-size 64mb
AOF 文件增长率
auto-aof-rewrite-percentage 100
- 推荐配置如下
2.3. AOF 重写(4.0 以后)
RDB 和 AOF 混合
- 将老的数据 RDB 到 AOF 文件中
- 将增量的数据以指令的方式 append 到 AOF 中