Redis的主从复制哨兵机制详解
Redis的主从结构
本篇文章,只要讲
redis的主从结构底层原理中的全量复制,部分复制,以及哨兵机制属于提升内功的区域,适合拔高
文章目录
- Redis的主从结构
- 主从复制原理
- 全量复制的步骤图
- 部分复制
- 哨兵机制(Sentinel)
- 哨兵机制的三个定时监控任务和作用
- 第一个:每隔10秒发一次`Info`
- 第二个:每隔2秒发一次`publish/subscribe`
- 第三个:每隔1秒发一次`ping`
- 领导者哨兵选举流程
- 故障转移
- 故障转移的**第一步**:
- 故障转移的区域步骤
- 高可用读写分离方案问题
- 好了,下期我们说Redis的数据分片(单独专题)
1.Redis主从结构
- 一主一从
- 一主多从
- 树状主从

主从复制原理
一主一从的步骤建立联系图标

全量复制的步骤图
也就是上图的第五步: 同步数据
pysnc命令

解释下:
第一步: 从节点像主节点发送psync ? -1的命令,
?:代表Redis的run id,因为从节点一开始请求并不知道主节点的run_id
-1:代表全量复制,从头开始(因为不知道从哪一步开始,就从最原始的地方开始)
第二步:主节点接收到命令,向从节点进行进行全量复制的应答
FULLRESYNC: 全量复制的应答
运行ID:就是主节点的run_id
offset:Offset 是衡量主从节点数据同步进度的关键指标。每个从节点会维护一个 复制偏移量(Replication Offset),表示从节点已接收并应用的主节点数据量。
第三步:主节点进行bgsave命令,执行生成RDB 文件
()
第四步:进行发送RDB文件给从节点
第五步: 在生成RDB这段时间,如果主节点呦呦文件写入,就进入客户端缓冲区
Client-output-buffer-limit:我们看
config的文件配置:client-output-buffer-limit replica 256mb 64mb 60
第六步: 加载RDB
清空旧数据–>加载RDB文件
第七部:发送缓冲区的内容
这一步是为了将主节点向从节点发送的RDB文件时,
主节点在第五步缓冲区的内容更新到从节点
第八步(可选):如果从节点开启了AOF,从节点会启动AOF的重写命令bgrewriteaof
部分复制
有两种情况下:会使用部分复制
- 当主从节点之间的网络出现中断
- 同时超过repl-timeout的时间
我们会看到: 当出现上面的两种情况后,全量复制中断,
redis会将主节点的数据写入复制解压缓冲区,等待网络恢复网络恢复后:从节点会将已复制的
OFFSET(偏移量)通过命令psync id offset与主节点的进行比较.OFFSET后面的数据是否在缓冲区如果在:通过命令
+continue命令响应,并将主节点积压缓冲区的内容通过部分复制,复制到从节点如果不在: 退化成全量复制

哨兵机制(Sentinel)
原理:当主节点出现故障时,由
redis sentinel自动完成故障发现和转移,并通知对方,实现高可用

我们自己要配置sentinel要在config.xml加入东西

启动具体实施
启动命令:
redis-server.exe redis.windows.conf --sentinel

实际的模拟图

哨兵机制的三个定时监控任务和作用

第一个:每隔10秒发一次Info
目的:为了感知现存有哪些从节点以及节点的状态
第二个:每隔2秒发一次publish/subscribe
发布订阅:
1.发布:每隔节点发送
sentinel信息,可以知道其他sentin信息,能让哨兵之间相互感知2.订阅: 就是比如后面又有哨兵加入,就可以使用使用此订阅功能,保存哨兵信息
第三个:每隔1秒发一次ping
ping就是心跳
判断节点是否出现故障,是否存活
当中的判断是否下线后的处理

主观下线:就是本哨兵自己发现
客观下线:
- 一个哨兵发现3秒后(上图配置的),询问其他哨兵此节点是不是下线,
- 当超过
quorum(客观下线数)数量,也就是sentinel monitor mymaster 127.0.0.1 6382 2命令的最后一个2,就是quorum,客观下线(进行领导者哨兵选举流程)- 否则: 继续确认

领导者哨兵选举流程
领导者选举:至于哨兵谁成为领导者,就是谁发现的快一点,确认数大于
quorum,谁就成为领导者(就是看谁快)其中涉及的算法: raft算法
如果感兴趣
raft算法,可以看阿里开源项目的sofa-jraft

哨兵与主从的通讯

故障转移
在哨兵领导选举之后,就需要进行故障转移流程
故障转移的第一步:
- 首先过滤掉不健康的节点以及没有回复的
ping消息 - 其次选择
slave-priority优先级最高的节点,有,选择完毕 - 如果没有,选择复制最完整的节点,有,选择完毕
- 如果还没有,选择runid最小的节点,有,选择完毕

故障转移的区域步骤

高可用读写分离方案问题
基于哨兵+主从,实现读写分离的客户端思想,会有的问题
1.切换主节点(原来从节点->主节点),会少个从节点
2.加入从节点->需要提前通知
3.主节点(发生异常)->从节点,相当于加了个从节点
4.主观下线(只针对从节点)
我们可以将从节点看成一个资源池
好了,下期我们说Redis的数据分片(单独专题)
每当想放纵,心里总是对自己说:半山腰太挤了,想看看山顶的风景,我们顶峰见!!

