引言
将内存中的数据存储到硬盘是为了之后重用数据,或者防止系统故障而将数据备份到一个远程位置。
RDB 持久化
概念
将某一时刻的所有数据写入到硬盘里面,也叫快照(snapshotting)
方法
- 客户端向Redis发送BGSAVE命令创建一个快照(Redis调用fork创建一个子进程将快照写入硬盘)
- 客户端向Redis发送SAVE命令创建一个快照(Redis在完成快照前将不响应任何其他命令)
- 配置save选项(任何一个save配置选项被满足,Redis触发一次BGSAVE命令)
- SHUTDOWN 或 TERM命令(Redis接收该命令后,执行SAVE命令并关闭服务器)
- 从Redis服务器发送SYNC命令(如果主服务器不是刚刚执行过BGSAVE,就执行BGSAVE命令)
AOF 持久化
概念
在执行写命令时,将被执行的写命令复制到磁盘里面,称作之追加文件(append-only file)
appendfsync频率
always:每个写命令都要同步写入硬盘,严重降低Redis速度
everysec:每秒执行一次同步,显式地将多个写命令同步到硬盘
no:让操作系统决定应该何时进行同步
重写/压缩AOF文件
问题:
- AOF文件体积会不断增长,占用大量空间;
- Redis重启后还原AOF文件会需要很长时间;
- 在进行AOF重写并删除旧AOF时,AOF体积过大会导致操作系统挂起数秒(建议大小3G)
解决:
- 用户向Redis发送BGREWRITEAOF命令(Redis创建子进程进行重写)
- 设置auto-aof-rewrite-percentage和auto-aof-rewrite-min-size(Redis根据条件执行BGREWRITEAOF命令)
RDB & AOF
- RDB文件用于保存和还原Redis服务器所有数据库中的所有键值对数据;
- SAVE命令会阻塞服务器,BGSAVE由子进程执行,不会阻塞服务器;
- 服务器状态满足任何一个save选项,将自动执行BGSAVE命令;
- RDB是一个经过压缩的二进制文件,由多个部分组成,不同类型键值对由不同方式保存;
- AOF文件保存所有修改数据库的写命令来记录服务器状态;
- 命令请求先保存到AOF缓冲区里,再定期写入并同步到AOF;
- 服务器载入执行AOF文件中命令便可还原数据库,如果AOF和RDB都开启,执行AOF;
- 执行BGREWRITEAOF命令,Redis会维护一个AOF重写缓冲区,记录所有写命令,子进程完成AOF重写后,服务器将缓冲区所有内容追加到新AOF;
小结
Redis的两种持久化方式可以帮助我们在不同场景下保留我们的数据,当然也经常会一起使用。
通过Redis集群的搭建和主从同步复制,可以进一步提高可用性。