Redis 持久化与复制

一.RDB持久化

 将当前数据库状态(当前保存的键值对)做一个快照,生成一个经过压缩的二进制文件,通过该文件可还原到生成RDB文件时的数据库状态.

二.AOF持久化

通过保存Redis服务器所执行的写命令生成AOF文件来记录数据库状态

  • 实现方式:

    1. 命令追加: 执行完一个写命令后,以协议格式将写命令追加到aof_buf缓冲区末尾

    2. AOF文件的写入与同步:

      • 通过appendfsync的值决定写入与同步方式:
      1. always: 服务器在每个事件循环都要将aof_buf缓冲区中所有内容写入AOF文件,并且同步AOF文件
      2. everysec: 每个事件循环都要将aof_buf缓冲区中所有内容写入AOF文件,每隔一秒在子线程中对AOF文件进行一次同步
      3. no: 每个事件循环都将aof_buf中的内容写入AOF文件,由操作系统控制何时同步
    3. AOF重写: 通过创建一个简化写命令的AOF文件来代替现有AOF文件,解决AOF文件体积膨胀的问题

三.复制

  • Redis的复制功能分为同步(Sync)和命令传播(command propagate

1. 同步:

  1. 从服务器向主服务器发送SYNC命令

  2. 主服执行BFSAVE在后台生成一个RDB文件,并在缓冲区记录从此刻开始的所有写命令

  3. 从服务器接收并载入这个RDB文件,将服务器更新到主服务器执行BGSAVE时的状态

  4. 主服务器将缓冲区的写命令发送给从服,从服执行写命令

  • 新版复制功能: 同步分为完整重同步与部分重同步:

    • 完整重同步: 与旧版同步一样,用于处理初次复制的情况.
    • 部分重同步: 断线重连后,主服将连接断开期间执行的写命令发送给从服务器,从服务器接收并执行这些写命令,主从恢复一致状态.

2. 命令传播:

同步之后主从达到一致状态,当主服执行客户端的写命令时,主从状态不再一致.

  • 命令传播操作:

    主服务器将自己执行的写命令发送给从服务器执行,主从服务器再次回到不一致状态