第20章 持久化
RDB
1.save 60 1000 : 60秒内有1000个key发生变化,就会触发一次RDB快照的执行
2.在客户端执行bgsave命令,显式触发一次RDB快照的执行,fork 一个子进程执行rdbSave函数进行实际的快照存储工作,
父进程可以继续处理客户端请求
加载RDB文件的时候,如何区分加载的是辅助字段还是数据库序号,或者是其他类型?
RDB 每一部分之前都有一个类型字节,在Redis中称为opcodes
Redis 键都是字符串,LENGTH 表示字符串长度,后面STRING 即具体的字符串内容
LENGTH 为了通用可以使用8个字节保存,但这样很明显会导致空间的浪费,LENGTH是一个变长字段。通过首字节能够知道LENGTH字段有多长,然后读取LENGTH字段可以知道具体的STRING长度。
RDB的优化,可以对字符串进行LZF压缩之后保存
AOF 持久化配置
1.no : 不执行fsync,由操作系统负责数据的刷盘,数据安全性最低,redis性能最高
2.always :每执行一次写入就会执行一次fsync,数据安全性最高但是redis性能很低
3.everysec : 每1秒执行一次fsync操作,属于折中方案,在数据安全性和性能之间达到一个平衡
AOF 重写 : 把类似的操作命令合并成为一条
混合持久化 :
进行AOF重写时,子进程将当前时间点的数据快照存储为RDB文件格式,而后将父进程累积命令保存为AOF格式
加载时,首先会识别AOF文件是否以REDIS字符串开头,如果是,就按RDB格式加载,加载完RDB后继续按照AOF格式加载剩余部分
第21章 主从复制
1.读写分离: 单台redis服务器能支撑的QPS是有上限的;主服务器只处理写请求,从服务器通过复制功能同步主服务器数据
只处理读请求,提升查询和写入性能
2.数据容灾:主从复制,主服务器宕机,可以把从切到主,避免redis服务中断
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
1.从服务器向主服务器发送sync命令,请求同步数据
2.主服务器接收到sync命令请求,开始执行bgsave命令持久化数据到RDB文件,并且在持久化数据期间把后续新执行的写入命令,都保存到一个缓冲区。
3.持久化数据完成,主服务器把rdb文件发送给从服务器,从服务器接收rdb文件,并将数据加载到内存
4.主服务器将缓冲区的命令发送给从服务器,在从服务器执行这些命令
+++++++++++++++++++++++++++++++++++++++++++++++
Redis2.8 提出了新的主从复制方案
1.从服务器会记录已经从主服务器接收到的数据量(复制偏移量) ,而主服务器,会维护一个复制缓冲区,记录自己已执行且发送给从服务器的命令请求,同时还需要记录复制缓冲区的第一个字节的复制偏移量。从服务器请求同步主服务器的命令也改成了psync。
2.从服务器连接到主服务器时,会向主服务器发送psync命令请求同步数据,同时告诉主服务器自己已经接收到的复制偏移量,主服务器判断该复制偏移量是否还包含在复制缓冲区;如果包含,则不需要持久化操作,直接向从服务器发送复制缓冲区命令即可,成为部分重同步;如果不包含,则需要持久化,然后把所有新执行的写命令缓存在复制缓冲区,并且重置缓冲器第一个字节的复制偏移量,这成为完整重同步。
部分重同步要求:
1.RUN_ID必须相等
2.复制偏移量必须包含在复制缓冲区中
repl_ping_slave_period : 主服务器和从服务器是通过TCP长连接交互数据的,就必然需要周期性发送心跳包来检测连接有效性,
该字段表示发送心跳包的周期,主服务器以此周期向从服务器发送心跳包。
复制缓冲区是一个先进先出的循环队列,当写入的数据量超过缓冲区大小时,旧的数据会被覆盖
replicaofCommand函数,是由replicationCron ,每1秒为周期调度,执行主从复制相关操作; 还用于检测主从连接是否超时,定时向主服务器发送心跳包,定时报告自己的复制偏移量
从服务器slaveOf命令处理
1.连接socket
2.发送PING请求包确认连接是否正确
3.发起密码认证,如果需要
4.通过REPLCONF命令同步信息
5.发送PSYNC命令
6.接收RDB文件并载入
7.连接建立完成,等待主服务器同步命令请求