文章目录

  • 问题
  • 解决

问题

termPredicate这里判断投票是否结束

if (termPredicate(recvset,new Vote(proposedLeader, proposedZxid,logicalclock.get(), proposedEpoch)))

FastLeaderElection.termPredicate()

 protected boolean termPredicate(HashMap<Long, Vote> votes,Vote vote) {HashSet<Long> set = new HashSet<Long>();/** First make the views consistent. Sometimes peers will have* different zxids for a server depending on timing.**///遍历接收到的所有选票数据for (Map.Entry<Long,Vote> entry : votes.entrySet()) {//对选票进行归纳,就是把所有选票数据中和当前节点的票据相同的票据进行统计if (vote.equals(entry.getValue())){ //对票据进行归纳set.add(entry.getKey()); //如果存在2票,set里面是不是有2个?}}//对选票进行判断//进入containsQuorum   看QuorumMaj//判断当前节点的票数是否是大于一半,默认采用 QuorumMaj 来实现return self.getQuorumVerifier().containsQuorum(set); //验证}

进入QuorumMaj.containsQuorum()

  public boolean containsQuorum(Set<Long> set){//这个 half 的值是多少呢?,也就是说,在构建 QuorumMaj 的时候,传递了当前集群节点的数量,这里是 3// 那么, hafl=3/2=1 可以在 QuorumPeerConfig.parseProperties 这个方法中,找到如下代码。//那么 set.size()>1. 意味着至少要有两个节点的票据是选择你当 leader,否则,还得继续投return (set.size() > half); //已经归纳的票据是否大于half .2>1  -> leader选举、 数据同步}

那么问题来了,上面的set是保存的是本地读到的投票,那么根据我的理解是不包括自己的投票的,这样的话,set.size()>half set.size()最小是half+1,即servers/2+1,算上本身自己的,也就是当前集群中是servers/2+2的时候表示投票结束?这显然跟众所周知的理论是不一样的,应该是算上自己的票,票数为servers/2+1的时候投票结束。

统计投票信息:server3统计收到的投票(包括自己投的),(1, 123)是两票,server1统计收到的投票(包括自己投的),(1, 123)是两票;

https://tech.souyunku.com/?p=6308

可以看到包括自己投的。

那究竟是为什么呢?

解决

首先,因为还没有看通信部分,所以产生了盲区

因为前面发送投票信息的时候是向集群所有节点发送,所以当然也包括自己这个节点,所以QuorumCnxManager的发送逻辑里会判断,如果这个要发送的投票信息是发送给自己的,则不发送了,直接进入接收队列。
https://www.itcodemonkey.com/article/4644.html

将变更的投票发给集群中所有的Follower节点。server.1将(10, 1)发给集群中所有Follower,包括它自己
https://zhuanlan.zhihu.com/p/60083015

sendNotifications(); //发送投票,包括发送给自己
https://blog.csdn.net/Dongguabai/article/details/82961284

选举的方法中刚开始和本地票发生变化的时候都会执行sendNotifications()方法将本地的票发送出去,这了包括发送给自己

所以上面的set是从 Notification n = recvqueue.poll(notTimeout, TimeUnit.MILLISECONDS);中取的,但是去除来的包含自己本身的票

所以判断投票结束的依据确实是n/2+1(包含自己

Zookeeper Leader选举 源码中,发送投票,统计投票的不解相关推荐

  1. Zookeeper之Leader选举源码分析

    Zookeeper源码下载地址:https://github.com/apache/zookeeper 1.选举流程 Zookeeeper的Leader选举会分两个过程. 服务启动时的leader选举 ...

  2. zookeeper领导者选举源码分析

    1.zk的集群启动类org.apache.zookeeper.server.quorum.QuorumPeerMain 查看main方法,核心方法initializeAndRun 2.继续往下找 在o ...

  3. WhoIsOnline ;) - 解读CNForum源码中在线用户统计

    原文:http://www.cnblogs.com/andrewbao/archive/2005/01/05/87061.html 下载CnForumsBeta1(今天发现CnForum1.2测试版本 ...

  4. 总结|ORB_SLAM2源码中字典使用细节

    点击上方"3D视觉工坊",选择"星标" 干货第一时间送达 前言 前段时间,主要对ORB-SLAM2中字典的训练与使用进行了些研究,关于字典的训练之前也写过一篇文 ...

  5. Android之在BaseAdapter源码中了解观察者模式

    转载请标明出处: http://blog.csdn.net/hai_qing_xu_kong/article/details/76146635 本文出自:[顾林海的博客] 个人开发的微信小程序,目前功 ...

  6. 一对一软件开发:在一对一社交app源码中加入这个功能,很有用...

    一对一软件开发在年内倍受欢迎,随着社交app的盛行,越来越多的人愿意涉足社交行业,但传统社交平台需要大量资金支持运营,而一对一直播社交平台由于其机制限制,对带宽使用较少.对平台能承受的并发量要求低.所 ...

  7. 【深入设计模式】装饰模式—什么是装饰模式?装饰模式在源码中的应用

    文章目录 1. 装饰模式 1.1 装饰模式简介 1.2 装饰模式结构 1.3 装饰模式示例 2. 装饰模式在源码中的应用 2.1 装饰模式在 JDK 中的应用 2.2 装饰模式在 MyBatis中的应 ...

  8. 17.你知道哪些设计模式,它们在JDK源码中是怎么体现的

    17.你知道哪些设计模式,它们在JDK源码中是怎么体现的 参考外国文献:http://h5ip.cn/lPtD 作者:肥朝 | 微信公众号:肥朝(ID:feichao_java) 一.结构性模式: 1 ...

  9. 视频直播源码中关于服务端直播开播推送实现

    在视频直播源码中直播app开播时需向客户推送开播消息通知用户,实现方式如下: 1.申请相应的推送服务三方,如下使用极光推送,获取相应的配置资料,并做好相应的配置 2.推送代码如下: /* 极光推送 * ...

最新文章

  1. 3d stroke插件下载_推荐一款好用的PS 3D地图插件,PS插件3D Map Generator ,一键生成地图神器...
  2. 【c语言】蓝桥杯算法提高 输入输出格式练习
  3. NAACL19笔记:自然语言处理应用的实用理解(多图解链接)
  4. 2018人工智能前沿报告:深度学习的应用和价值
  5. 2021年春季学期-信号与系统-第十一次作业参考答案-第一小题
  6. 【PC工具】速度最快的的文件搜索工具:everything
  7. python:文件读写操作
  8. [项目更新] 集成RabbitMQ队列与EventBus总线
  9. accept标头 php,如何在PHP中读取任何请求标头
  10. 手把手带你入门Python爬虫(二、爬虫预备知识)
  11. JDK自带的Timer类
  12. win10平板模式_电脑也能当平板用?并可以轻松实现分屏
  13. spoolsv进程占用CPU近100%,电脑反应慢
  14. vfp 使用 .Net 系统自带的组件
  15. win10u盘被写保护怎么解除_教你win10系统中u盘被写保护怎么解除
  16. WPS宏插件使用教程
  17. 达梦工具导出慢sqle的xcel表格方法
  18. 酷狗音乐皮肤怎么从计算机里换,酷狗音乐怎么换皮肤 酷狗音乐自定义皮肤的方法...
  19. 蓝牙耳机怎么挑选?鹏鹏数码盘点2023口碑蓝牙耳机排行榜
  20. Js 获取当前时间上一个月 YYYY-mm

热门文章

  1. 集成学习(voting)
  2. Linux下shell命令:top
  3. 改变chart坐标轴的起始值
  4. ESP32学习:AD/DA数模转换
  5. python制作课程表提醒_10行Python代码制作群聊提醒小助手,再也不怕漏掉消息了...
  6. 经度从0-360更改为-180到180
  7. VScode 自定义主题颜色
  8. html有哪些好玩的地方,北京有什么好玩的地方旅游景点(北京之旅必去的10个旅游景点)...
  9. 03-Netty中的Future接口
  10. 期刊论文发表一般多久才可以EI检索