Redis 持久化与复制
一.RDB持久化
将当前数据库状态(当前保存的键值对)做一个快照,生成一个经过压缩的二进制文件,通过该文件可还原到生成RDB文件时的数据库状态.
二.AOF持久化
通过保存Redis服务器所执行的写命令生成AOF文件来记录数据库状态
实现方式:
命令追加: 执行完一个写命令后,以协议格式将写命令追加到aof_buf缓冲区末尾
AOF文件的写入与同步:
- 通过appendfsync的值决定写入与同步方式:
- always: 服务器在每个事件循环都要将aof_buf缓冲区中所有内容写入AOF文件,并且同步AOF文件
- everysec: 每个事件循环都要将aof_buf缓冲区中所有内容写入AOF文件,每隔一秒在子线程中对AOF文件进行一次同步
- no: 每个事件循环都将aof_buf中的内容写入AOF文件,由操作系统控制何时同步
AOF重写: 通过创建一个简化写命令的AOF文件来代替现有AOF文件,解决AOF文件体积膨胀的问题
三.复制
- Redis的复制功能分为同步(Sync)和命令传播(command propagate
1. 同步:
从服务器向主服务器发送SYNC命令
主服执行BFSAVE在后台生成一个RDB文件,并在缓冲区记录从此刻开始的所有写命令
从服务器接收并载入这个RDB文件,将服务器更新到主服务器执行BGSAVE时的状态
主服务器将缓冲区的写命令发送给从服,从服执行写命令
新版复制功能: 同步分为完整重同步与部分重同步:
- 完整重同步: 与旧版同步一样,用于处理初次复制的情况.
- 部分重同步: 断线重连后,主服将连接断开期间执行的写命令发送给从服务器,从服务器接收并执行这些写命令,主从恢复一致状态.
2. 命令传播:
同步之后主从达到一致状态,当主服执行客户端的写命令时,主从状态不再一致.
命令传播操作:
主服务器将自己执行的写命令发送给从服务器执行,主从服务器再次回到不一致状态