1.slave连接master
分为三个阶段,建立连接阶段,数据同步阶段,命令传播阶段
建立连接阶段:
- 发送slave of port,master接收到指令后响应对方, slave保存master的ip和端口;
- 创建连接master的socket;
- 周期性的发送ping指令(定时器的任务)
- 发送指令 slave的端口暴露出去, master保存slave的端口号
- 总体上,slave保存master的地址和端口,master保存slave的端口,并且建立一个socket的连接
可以在从服务器的配置里面直接配置好
数据同步阶段:
- slave发送同步指令,psync2
- master接收到指令以后,开始执行bgsave,然后创建一个复制缓冲区,生成RBD文件通过socket发送给slave
- slave接收RDB,执行RDB文件恢复过程,全量复制,发送master告知RDB恢复完成; 请求部分同步数据
- master发送复制缓冲区信息
- slave接收消息,执行bgrewriteof,恢复数据,需要重写,此时数据同步阶段完全(4,5 步骤属于部分复制,这部分是进行RDB过程中对应的所有的数据)
这部分属于数据同步的过程,master保存slave当前数据同步的位置; 全量复制+部分复制(如果master数据量过大,避免高峰期进行同步)
注意:复制缓冲区大小不合理的话,会导致数据溢出,必须进行第二次全量复制?一直清理 就会进入死循环; master要留百分之30执行bgsave 以及 复制缓冲区
数据同步过程中,slave避免数据不同步 阻塞,此时应该关闭此期间的对外服务
如果slave过多,可以让slave也充当master 但是这里会有问题,会导致数据不同步,看系统能否接受这种情况;及时性数据不强的可以
命令传播阶段:
实时保持数据同步
如果出现断网问题,网络闪断闪连(忽略),短时间中断(部分复制),长时间中断(全量复制)
部分复制:服务器的运行id(识别身份),复制缓冲区,主服务器偏移量
master里的命令传播程序来做这事,发给每一个slave,这里面会使用复制缓冲区保存数据; 如果断网的话,会找到对应的偏移量,slave会记录,master也要记录
复制缓冲区内部工作原理:
master接收到命令以后,会把命令放到复制缓冲区里面,复制缓冲区里保存了字节值以及对应的偏移量;相当于AOF,用于保存所有master收到的指令
有大小的,如果溢出了,就会删除前面的命令
心跳机制:
进入命令传播阶段以后,master需要和slave进行信息交换,使用心跳机制来维护,实时保持双方保持在线
master心跳机制就是发送ping指令判断slave是否在线
如果slave多数掉线了,或者延迟很高,master为了保障数据稳定性,拒绝所有信息同步操作,关闭写功能
slave是发送replconf ack offset指令,master去接收判断这个offset是否在缓冲器中
常见问题:
1.频繁的常量复制(可能是复制缓冲区太小)
2.频繁的网络中断,服务器端cpu占用过高(slave端接收到慢查询),master各种资源被占用,去判断slave端是否存在,(设置合理的超时时间,释放slave)
3.频繁网络中断(ping的频度调整一下,存在网络丢包)
4.数据不同步问题(网络信息不同步,数据发送有延迟)优化主从网络环境,放在同一个机房里部署;监控offset的大小,如果延迟太大,暂停对slave的访问,先同步完再说; 数据不同步属于很正常的情况
总结:再看一遍redis主从复制这块,感觉清晰了好多!!
(感觉掘金网的编辑不太好用,图片不能直接复制~~ )