目录
一、搭建主从集群
二、主从数据同步的原理
三、repl_backlog原理
四、主从同步优化
五、小结
一、搭建主从集群
为了提高高并发,主从集群是很有必要的,因为这样可以实现读写分离,主节点负责写,从节点就只负责读,配置多个从节点,就可以像多个从节点发送请求,大大的提高了并发量
在从节点中 使用 slave/replicaof 主机ip 端口 指定好主节点位置 就可以了
二、主从数据同步的原理
全量同步
就是当第一次同步的时候,需要将整个的rdb发送给从节点
在发送rdb的过程中,可能主节点又有新的请求 又来了新的数据 此时就将这些数据可以放到repl_backlog中记录rdb期间的所有命令,最后将这些命令发给从节点 从节点执行接收到的命令实现主从节点数据的同步
它的大致流程分为三个阶段:
第一阶段:主要是建立通道
1. 从节点执行replicaof命令,与主节点建立连接
2. 像主节点发送请求,请求数据同步
3. 到底是不是第一次同步呢?需要检测一下
判断是否是第一次同步
4. 是第一次,则向从节点返回主节点版本信息 主要就是Replication Id 数据集标记
第二阶段:核心步骤,主节点生成rdb,发给从节点 从节点实现数据同步
1. 主节点执行bgsave命令,生成rdb
在生成rdb期间,可能会有新的请求发给主节点,主节点将这期间的所有命令放到repl_backlong中
2. 主节点发送rdb给从节点
3. 从节点清空本地数据,加载发过来的rdb文件
第三阶段:主要是补充一些操作,防止丢失掉一些数据 达到真正的同步
1. 主节点发送repl_backlog到从节点中 从节点接收到执行里面的命令
这里到底是如何判断是否是第一次同步呢?
就是通过Replication Id实现的,如果检查发现主从不一样,说明从节点是第一次连接到主节点,是第一次同步
同步期间两个参数重要:
1.Replication Id 判断是否是第一次
2. offset 偏移量 记录主从节点当前执行到那里了 可以利用它来就知道主从同步的进度如何了。如果它两差值为0 那么说明数据完全同步
完整流程简要描述:
- slave节点请求增量同步
- master节点判断replid,发现不一致,拒绝增量同步
- master将完整内存数据生成RDB,发送RDB到slave
- slave清空本地数据,加载master的RDB
- master将RDB期间的命令记录在repl_baklog,并持续将log中的命令发送给slave
- slave执行接收到的命令,保持与master之间的同步
增量同步
只有在第一次的时候才全量同步,全量同步的成本太高了(因为要整个发送rdb文件),之后无特殊情况是进行增量同步
大致分为两个阶段:
第一阶段:判断能否进行增量同步
1. 从节点发送psync replid offset 给主节点 请求增量同步
2. 判断replid是否一致
3. 不是第一次 主节点回复 continue
第二阶段
1. 主节点 去repl_backlog中获取到offset后的数据
2. 主节点发送offset之后的命令
3. 从节点接收到命令,执行命令
关键就是依靠offset知道它两的差值来就知道主节点到底还需要向从节点发哪些数据了
三、repl_backlog原理
其实就是一个数组,一个环形数组 通过主从节点各自的offset记录数据位置
从节点追赶主节点,知道它两的差距
然后主节点只需向从节点发送这些差距数据即可
这里的红色部分就是差距部分
这里会有一种情况就是当这个环形数组被填满的时候,如果说它量的差距已经是达到这个环的容量了,如果此时主节点仍然写新的数据,那么势必就会新的数据会覆盖点两者的差距前面的部分,导致需要同步给从节点的数据发生丢失
那么现在就只能全量同步了,不然会还继续同步的话,会丢失掉一些数据
四、主从同步优化
这个可以在预防上面说,也可以在已经发生了如何解决上面说:
预防:
首先如果是第一次,那么可以:
1. 在master中配置repl-diskless-sync yes启用无磁盘复制,避免全量同步时的磁盘IO。
如果是增量同步:
2. 如果说从节点就是慢,没办法的话,那么就干脆增大repl_backlog的大小。使之难以全量同步
总体:
1. 我让从节点不要占用过多的内存,减少RDB导致的过多的磁盘IO
其实就是减少从节点的阻塞时间,从而能够快速的进行同步,尽可能的减小它两差距 避免执行全量同步
2. 减少主节点的压力,不要让主节点下面有过多的slave 可以采用"主从从"的链式结构
五、小结
1. 简述全量同步和增量同步区别?
-
全量同步:master将完整内存数据生成RDB,发送RDB到slave。后续命令则记录在repl_baklog,逐个发送给slave。
-
增量同步:slave提交自己的offset到master,master获取repl_baklog中从offset之后的命令给slave
2. 什么时候执行全量同步?
-
slave节点第一次连接master节点时
-
slave节点断开时间太久,repl_baklog中的offset已经被覆盖时
3. 什么时候执行增量同步?
-
slave节点断开又恢复,并且在repl_baklog中能找到offset时