主从复制
原理
redis主库通过rdb文件传给从库,从而进行复制。
复制原则
- 一个master可以有多个slave
- 一个slave只能有一个master
- 数据流向是单向的,master到slave
作用
- 数据的副本
- 扩展度的性能
主从复制配置
命令复制
1 | slaveof 127.0.0.1 6379 |
配置文件配置
1 | slaveof 127.0.0.1 6379 |
全部复制和部分复制
runid
redis启动就会生成一个runid,在服务器重启或者网络的原因,runid会发生变化,主库和从库一直保持通信,一旦从库检测到主库的runid发生了变化,就会进行一次全量复制。
偏移量offset
偏移量是用来检测从库和主库数据是否一致
全量复制
过程
- slave向master发送psync?-1查询master的runid和偏移量,第一次不知道主库的runid和偏移量
- 主库检测出从库第一次复制,主库发送自己的runid和偏移量给从库
- 从库保存了主库的runid和偏移量
- 主库开始创建快照(bgsave),与其同时主库也会把在创建快照的时间间期中产生的数据传到了自身的复制缓冲区
- 主库向从库发送RDB文件
- 主库向从库发送复制缓冲区的数据,并添加到了从库接受到的RDB文件中
- 从库清除自身原本有的数据
- 从库执行RDB文件,从而达到复制
全量复制开销
- bgsave的时间
- RDB文件网络传输时间
- 从节点清空数据的时间
- 从节点加载RDB的时间
- 可能的AOF重写的时间
部分复制
- 有时候因为网络的抖动或者其他原因,导致从库对主库失去连接。
- 主库会把这个时间段新增的数据写入复制缓冲区。
- 当从库再次连接之后
- 从库会告诉主库说,主库对应的runid以及最新的偏移量值
- 主库会判断从库是否需要部分复制,并判断偏移量是否是在复制缓冲区的偏移量范围内,如果不在证明从过错过的数据已经很多了。
- 如果是在范围内的话,主库会把剩下从库没有的数据传给从库,从而达到部分复制,减少开销
故障处理
- 主节点(master)故障,从节点slave-1端执行 slaveof no one后变成新主节点;
- 其它的节点成为新主节点的从节点,并从新节点复制数据;
- 需要人工干预,无法实现高可用。