Redis系统学习(高级篇)-Redis主从集群-CSDN博客
阿里云国内75折 回扣 微信号:monov8 |
阿里云国际,腾讯云国际,低至75折。AWS 93折 免费开户实名账号 代冲值 优惠多多 微信号:monov8 飞机:@monov6 |
目录
一、搭建主从集群
为了提高高并发主从集群是很有必要的因为这样可以实现读写分离主节点负责写从节点就只负责读配置多个从节点就可以像多个从节点发送请求大大的提高了并发量
在从节点中 使用 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到mastermaster获取repl_baklog中从offset之后的命令给slave
2. 什么时候执行全量同步
-
slave节点第一次连接master节点时
-
slave节点断开时间太久repl_baklog中的offset已经被覆盖时
3. 什么时候执行增量同步
-
slave节点断开又恢复并且在repl_baklog中能找到offset时