当前位置: 首页 > news >正文

redis源码之:集群创建与节点通信(2)

在上一篇redis源码之:集群创建与节点通信(1)我们可知,在集群中,cluster节点之间,通过meet将对方加入到本方的cluster->nodes列表中,并在后续过程中,不断通过clusterSendPing发送ping请求,使用gossip协议共享集群节点信息并通过clusterReadHandler处理对方发送的ping请求和pong响应。本文,来继续看看,clusterSendPing和clusterReadHandler的处理逻辑。

一、clusterSendPing

1.1、分享集群节点信息节点个数计算
clusterSendPing主要是为了将本方已知的集群节点信息共享到对方,但是redis并不是一次就把所有已知节点信息共享到对方:
在这里插入图片描述

1、freshnodes,是本方节点已知的所有集群节点中,除去本方和对方两个节点后的其余节点。
需要向对方发送的节点个数时wanted,通过计算本方已知节点数(包含本方对方节点)/10,这个数不能小于3,也不能大于freshnodes。
2、为什么要floor(dictSize(server.cluster->nodes)/10)总节点数除以10?
首先在clusterCron中,当检测到最近一次的ping的pong响应时间超过cluster_node_timeout/2会马上重发一次ping。
在这里插入图片描述
因此在cluster_node_timeout时间里,最差本方也会发送到对方两次ping到对方,因此会收到两次pong。同时对方在这段时间内也会发至少两次ping。因此本方在cluster_node_timeout内会最差收到四次对方发的包,在redis中cluster_node_timeout*2的故障检测时间内,本方能接收某个对方节点8个包,设置为每次发送1/10,就能保证在两个timeout时间内,至少能发送80%的几点信息共享。当然,这也是redis官方的一个取舍。
3、标注疑似下线的节点个数,本方发现的疑似掉线的其他主节点,全部在本次就告知对方。

1.2、生成分享信息头
在这里插入图片描述
在这里插入图片描述
1.3、gossip协议节点数据封装
在这里插入图片描述
1.4、疑似下线节点处理
在这里插入图片描述
将疑似下线的节点信息一个个添加到gossip数组中

1.5、发送hdr到对方节点
在这里插入图片描述

二、clusterReadHandler处理ping请求与pong响应

clusterReadHandler涉及两种信息处理:
一种是本方主动连接对方,向对方发送ping后,对方响应的pong信息;
一种是对方连接本方,向本方发送的ping消息;
clusterReadHandler很长一段是读取消息的代码,读完数据后,进入clusterProcessPacket处理:
接收到的消息类型可能有,ping/pong /meet/fail/等信息,不同的信息对应的结构体不一样,根据对应的结构体获取数据。在这里插入图片描述
我们先主要看ping/pong /meet三种信息的处理:
在这里插入图片描述
上面调用clusterProcessGossipSection()主要处理未知节点发送的gossip内容
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
此时调用clusterProcessGossipSection()是处理已知节点的gossip内容,
接下来看看clusterProcessGossipSection的处理逻辑:

三、clusterProcessGossipSection

在这里插入图片描述
因此gossip消息的处理,一定是要正常握手之后,确认发送方式集群确定的节点后才能在本地的cluster->nodes中添加节点实例。

http://www.lryc.cn/news/294831.html

相关文章:

  • 2024.2.5 寒假训练记录(19)
  • 游戏服务器租赁多少钱一台?26元,服不服?
  • wpf 引入本项目的图片以及引入其他项目的图像资源区别及使用方法
  • jsp页面,让alert弹出信息换行显示
  • 【IC设计】Windows下基于IDEA的Chisel环境安装教程(图文并茂)
  • IF=82.9!高分文献解读|吉西他滨联合顺铂化疗激活肿瘤免疫新机制
  • 【QT+QGIS跨平台编译】之二十八:【Protobuf+Qt跨平台编译】(一套代码、一套框架,跨平台编译)
  • 代码解析:list.stream().filter(Objects::nonNull).collect(Collectors.toList())
  • 代驾应用系统(ssm)
  • 技术栈面试综合整理
  • Java中的static关键字
  • SpringBoot日志插件log4J和slf4J的使用和比较含完整示例
  • 我的世界Java版服务器如何搭建并实现与好友远程联机Minecarft教程
  • 如何进行游戏服务器的负载均衡和扩展性设计?
  • 机器学习数学基础
  • SpringBoot注解--04--01--注解@Mapper在IDEA中自动注入警告的解决方案
  • 【Java八股面试系列】JVM-垃圾回收
  • Elasticsearch:集群故障排除和优化综合指南
  • 初识C语言·编译与链接
  • 堆与滑动窗口的结合(算法村第十六关黄金挑战)
  • ES6-let
  • 如何发布自己的npm包:
  • JavaSE——流程控制-跳转关键字(break、continue),小案例(随机数、猜数字)
  • Java HashSet 重写 equals() 和 hashCode() 对象去重
  • Mac电脑到手后的配置
  • Python中的while循环,知其然知其所以然
  • 云瞻无代码开发:连接并集成电商平台、营销系统和CRM
  • LeetCode-第2469题=温度转换
  • docer compose部署simple-docker
  • Android Studio中打开文件管理器