文章目录
1.为什么需要?
主从复制的原因可以从这几个方面看一下:
1)读写分离,分担一个redis数据库的压力,主节点主要是写,然后同步到从节点,从节点主要负责读
2)数据备份,是持久化的另一种数据保存
3)故障恢复,当主节点凉凉的时候,可以选择一个从节点作为主节点
2.过程
主要分为三步:
-
建立连接
从节点和主节点进行连接,从节点保存主节点的ip+端口;主节点保存从节点的端口;
主要是建立的socket连接,内部包含一些授权操作。 -
数据同步
主要分为两步:
2.1)全量复制
- 从节点发送psync2指令;
- 主节点执行bgSave指令,保存RDB文件
- 同时记录runid + offest
- 将上面的RDB、offset、runid发送给从节点
- 从节点进行恢复RDB
2.2)增量复制
- 从节点再次发送指令psync2 runid offset 指令
- 主节点判断自身的offset > offset(slave)
- 将这部分的内容 + offset 发给从节点
- 从节点收到这些命令进行bgwriteaof,进行恢复数据,并保存新的offset(slave) -
命令传播(心跳机制)
这部分其实就是 增量复制的过程,只是中途可能出现主从节点的一个网络问题,导致重新进行第二步的数据同步:
-主节点每10s发送ping 指令来判断从节点是否在线
-而从节点每1s发送 ** replconf ack{offset}**指令,进行判断主节点是否在线,以及增量复制
-增量复制(完整版)
1:主节点判断从节点的runid和offset
2:如果runid不同,直接全量复制
3:如果offset(slave)不在slave,全量复制
4:当offset(slave) = offset(master),不发送
5:当offset(slave)!= offset(master),发送offset(master)和中间部分的内容
3.心跳机制部分注意事项
当slave多数掉线 + 延迟过高,则master则会拒绝同步
如:slave数量少于2个,或者所有slave的延迟都大于等于10秒时,强制关闭master写功能,停止数据同步