4.1 持久化选项
将内存中的数据存储到硬盘是为了在之后重用数据,或者是防止系统故障。
Redis 提供两种不同的持久化方法将数据存储到硬盘中:
- 快照:将存在于某一时刻的所有数据都写入硬盘;
- 只追加文件:在执行写命令时,将被执行的写命令复制到硬盘里。
两组不同的配置选项控制 Redis 将数据写入硬盘:
4.1.1 快照持久化
Redis 可以通过创建快照来获得存储在内存中的数据在某个时间点上的副本。创建快照之后可以对快照进行备份、将快照复制到其他服务器从而创建具有相同数据的服务器副本、也可以将快照留在原地以便重启服务器时使用。
根据配置,快照将被写入dbfilename
选项指定的文件里,并储存在dir
指定的路径上。如果 Redis、系统、硬件这三者任意一个在新的快照文件创建完毕前崩溃了,Redis 将丢失最近一次创建快照后写入的所有数据。e.g.
创建快照方式:
- 客户端向 Redis 发送
BGSAVE
命令创建快照。Redis 会调用**fork()**
创建一个子进程,子进程负责将快照写入硬盘、父进程继续处理命令请求。 - 客户端向 Redis 发送
SAVE
命令创建快照。收到**SAVE**
命令的 Redis 服务器在快照创建完毕之前将不再响应任何其他命令。不常用(通常只在内存不充裕的情况下或者即使等待持久化操作执行完毕也无所谓的情况下使用SAVE
)。 - 如果用户设置了
save
配置选项,如save 60 10000
,那么从 Redis 最近一次创建快照之后开始算起,当“60 秒内有 10000次写入”这个条件满足时,Redis 就会自动触发BGSAVE
命令。如果设置了多个save
选项,满足任意一个就会触发一次BGSAVE
选项。 - 当 Redis 通过
SHUTDOWN
命令收到关闭服务器请求时,会接收到标准TERM
信号,会执行一个SAVE
指令,阻塞所有客户端,不再执行客户端发送的任何命令,并在SAVE
命令执行完毕后关闭服务器。 - 当一个 Redis 服务器连接到另一个 Redis 服务器,并向对方发送
SYNC
命令开始一次复制操作时,如果主服务器目前没有在执行BGSAVE
操作,或者主服务器并非刚刚执行完BGSAVE
,那么主服务器就会执行BGSAVE
命令。
HINT:在数据量较大的时候如果调用BGSAVE
,那么 Redis 在创建子进程时会消耗很多时间,导致系统长时间停顿,因为子进程与父进程共享这些数据与地址空间。而SAVE
虽然会阻塞 Redis,但是不创建子进程,所以相对于BGSAVE
更快一些。
如果不可接受丢失数据,使用AOF 持久化可以将存储在内存中的数据尽快保存到硬盘中。
4.1.2 AOF 持久化
AOF 持久化会将被执行的写命令写到 AOF 文件的末尾。因此 Redis 只要从头到尾重新执行一次 AOF 文件包含的所有写命令就可以恢复 AOF 文件所记录的数据集。
AOF 持久可以通过appendonly yes
配置选项打开。
还有appendfsync
选项,用于选择命令写入硬盘的方式、规则:
如果使用appendfsync always
选项,那么每个 Redis 命令都会写入硬盘,从而讲发生系统崩溃出现的数据丢失减到最少。但是会带来大量磁盘 I/O,严重影响效率。而且一次写入一个命令也会损害硬盘寿命。
如果用户使用appendfsync no
选项,那么 Redis 不对 AOF 文件执行任何显式地同步操作,而是由 OS 决定何时对 AOF 文件进行同步。另外,如果硬盘处理写入速度不够快的话,当缓冲区被等待写入硬盘的数据填满时,Redis 的写入操作就会被阻塞,并导致 Redis 处理命令的速度变慢。所以,一般也不用这个选项。
为了兼顾安全和写入性能可以使用appendfsync everysec
,Redis 每秒对 AOF 文件进行一次同步。这种同步机制的性能和不使用任何持久化特性时的性能相差无几,而且可以保证最多只丢失一秒之内产生的数据。此外,当硬盘忙于执行写入操作时,Redis 还会放慢自己的速度以适应硬盘的最大写入速度。
4.1.3 重写/压缩 AOF 文件
由于 Redis 会不断将被执行的写命令追加到 AOF 文件中,所以随着 Redis 的运行,AOF 文件体积也会不断增长。
可以通过向 Redis 发送BGREWRITEAOF
命令,解决 AOF 文件体积不断增大的问题。该命令通过移除 AOF 文件中的冗余命令来重写 AOF 文件,使得体积减小。其原理与BGSAVE
类似:Redis 会调用fork()
创建一个子进程,由子进程重写 AOF 文件。由于也使用了子进程,所以也可能由于创建子进程带来性能问题。
可以通过设置auto-aof-rewrite-percentage
和auto-aof-rewrite-min-size
选项来自动执行BGREWRITEAOF
命令。e.g.
4.2 复制
感觉有点《Redis 实战》冗长,直接看菜鸟教程的 Redis 命令入个门,然后开始看 Redis 原理了。