Redis系统学习(高级篇)-Redis主从集群

目录

一、搭建主从集群

二、主从数据同步的原理

三、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时

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值