【Redis】持久化:RDB 和 AOF

引言

将内存中的数据存储到硬盘是为了之后重用数据,或者防止系统故障而将数据备份到一个远程位置。

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文件

问题:

  1. AOF文件体积会不断增长,占用大量空间;
  2. Redis重启后还原AOF文件会需要很长时间;
  3. 在进行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集群的搭建和主从同步复制,可以进一步提高可用性。

猜你喜欢

转载自blog.csdn.net/Francis123580/article/details/81058626