06-Zookeeper选举Leader源码剖析(一)

news2024/12/24 3:09:29

上一篇:05-Zookeeper典型使用场景实战


一、为什么要看源码

  1. 提升技术功底:学习源码里的优秀设计思想,比如一些疑难问题的解决思路,还有一些优秀的设计模式,整体提升自己的技术功底
  2. 深度掌握技术框架:源码看多了,对于一个新技术或框架的掌握速度会有大幅提升,看下框架demo大致就能知道底层的实现,技术框架更新再快也不怕
  3. 快速定位线上问题:遇到线上问题,特别是框架源码里的问题(比如bug),能够快速定位,这就是相比其他没看过源码的人的优势
  4. 对面试大有裨益:面试一线互联网公司对于框架技术一般都会问到源码级别的实现
  5. 知其然知其所以然:对技术有追求的人必做之事,使用了一个好的框架,很想知道底层是如何实现的
  6. 拥抱开源社区:参与到开源项目的研发,结识更多大牛,积累更多优质人脉

二、看源码方法

  1. 先使用:先看官方文档快速掌握框架的基本使用
  2. 抓主线:找一个demo入手,顺藤摸瓜快速静态看一遍框架的主线源码,画出源码主流程图,切勿一开始就陷入源码的细枝末节,否则会把自己绕晕,凭经验猜
  3. 画图做笔记:总结框架的一些核心功能点,从这些功能点入手深入到源码的细节,边看源码边画源码走向图,并对关键源码的理解做笔记,把源码里的闪光点都记录下来,后续借鉴到工作项目中,理解能力强的可以直接看静态源码,也可以边看源码边debug源码执行过程,观察一些关键变量的值
  4. 整合总结:所有功能点的源码都分析完后,回到主流程图再梳理一遍,争取把自己画的所有图都在脑袋里做一个整合

三、从源码启动zookeeper

zookeeper源码下载地址:

//选择分支3.5.8
https://github.com/apache/zookeeper.git  

在这里插入图片描述

源码导入idea后,org.apache.zookeeper.Version类会报错,需要建一个辅助类

package org.apache.zookeeper.version;

public interface Info {
    int MAJOR = 1;
    int MINOR = 0;
    int MICRO = 0;
    String QUALIFIER = null;
    int REVISION = -1;
    String REVISION_HASH = "1";
    String BUILD_DATE = "2020-10-15";
}

然后在根目录编译执行:

mvn clean install -DskipTests

开源项目找入口类一般都是从启动脚本去找,可以从bin目录下的zkServer.sh或zkServer.cmd里找到启动主类运行即可

org.apache.zookeeper.server.quorum.QuorumPeerMain

注意:

  1. 将conf文件夹里的zoo_sample.cfg文件复制一份改名为zoo.cfg,将zoo.cfg文件位置配置到启动参数里
    在这里插入图片描述

  2. 启动之前需要先将zookeeper-server项目里pom.xml文件里依赖的包(除了jline)的scope为provided这一行全部注释掉

  3. 将conf文件夹里的log4j.properties文件复制一份到zookeeper-server项目的 \target\classes 目录下,这样项目启动时才会打印日志

用客户端命令连接源码启动的server:

bin/zkCli.sh -server 192.168.50.190:2181

从源码里运行客户端(org.apache.zookeeper.ZooKeeperMain),注意需要加入启动参数,见下图:

在这里插入图片描述

在这里插入图片描述

四、从源码启动zookeeper集群

复制3个zoo.cfg文件,修改对应集群配置,并在data目录里分别建各自的myid文件填入机器id,并创建三个不同配置的启动节点,见下图:
在这里插入图片描述

分别运行每个节点,集群启动完毕!

五、启动或leader宕机选举leader流程

在这里插入图片描述

六、leader选举多层队列架构

整个zookeeper选举底层可以分为选举应用层和消息传输层,应用层有自己的队列统一接收和发送选票,传输层也设计了自己的队列,但是按发送的机器分了队列,避免给每台机器发送消息时相互影响,比如某台机器如果出问题发送不成功则不会影响对正常机器的消息发送。

七、Leader选举源码流程图

在这里插入图片描述

高清原图获取:
链接:https://pan.baidu.com/s/1_io3aTGIrswEtFSeYxSRHA?pwd=y2yz
提取码:y2yz

【送人玫瑰手留余香,感谢你的点赞



下一篇:07-Zookeeper选举Leader源码剖析(二)

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1073852.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

完美解决Android adb install 安装提示 INSTALL_FAILED_TEST_ONLY

完美解决Android adb install 安装提示 INSTALL_FAILED_TEST_ONLY 目录 所遇问题 有些时候我们用命令进行安装apk如下: adb install xxx.apk但是会安装不成功,报如下错误: 错误现象:提示:Failed to install app-d…

【Go】Fyne跨平台图形界面框架使用

😏★,:.☆( ̄▽ ̄)/$:.★ 😏 这篇文章主要介绍Fyne跨平台图形界面框架使用。 学其所用,用其所学。——梁启超 欢迎来到我的博客,一起学习,共同进步。 喜欢的朋友可以关注一下,下次更新…

文本编辑器去除PDF水印

用文本编辑器打开pdf,搜索水印的特殊文字,全部替换。 另外一个水印字母间有空格。 替换完后保存。 重新打开pdf:

国产麒麟V10桌面操作系统上运行WinForm程序

将需要运行的程序拷贝到系统中,如图: 选择exe后点击鼠标右键,选择打开方式,然后选择CrossOver(安装),如图: 打开CrossOver 软件安装程序后,点击选择容器,然后选择Windows 10 容器…

交互式ICP

以下程序演示如何编写交互式ICP查看器。该程序将加载点云并对其进行刚性变换。之后&#xff0c;使用ICP算法将变换后的点云与原来的点云对齐。每次用户按下“空格”&#xff0c;进行ICP迭代&#xff0c;刷新可视化界面。 代码实现 资源准备 monkey.ply #include <string&…

用Python简单的实现一下六大主流小说平台小说下载(附源码)

很多小伙伴学习Python的初衷就是为了爬取小说&#xff0c;方便又快捷~ 辣么今天咱们来分享6个主流小说平台的爬取教程~ 一、流程步骤 流程基本都差不多&#xff0c;只是看网站具体加密反爬&#xff0c;咱们再进行解密。 实现爬虫的第一步? 1、去抓包分析&#xff0c;分析数…

从零开始:制作出色的产品原型图的详细教程

在设计产品的初始版本或模型时&#xff0c;产品原型起着非常重要的作用&#xff0c;可以帮助设计师和团队更好地了解产品需求和用户需求&#xff0c;优化和改进设计&#xff0c;确保设计最终满足用户的需求和期望。如果你不知道如何绘制产品原型图&#xff0c;绘制产品原型图的…

应用开发平台集成工作流系列之14——流程表单实现示例

背景 流程审批&#xff0c;通常对应一个业务表单。这个表单一般有两种实现模式&#xff0c;一是不同的环节对应不同表单&#xff0c;二是做一张大表单&#xff0c;分为不同的区域&#xff0c;从业务角度考虑&#xff0c;前者通常对应复杂业务处理&#xff1b;后面一种则更常见…

苹果手机如何设置软件提醒功能?苹果手机哪个软件有提醒功能?

作为苹果手机用户&#xff0c;我们都希望能够准时接收待办事项或日程提醒&#xff0c;高效完成各项任务和待办事项&#xff0c;例如无论是工作中的重要会议&#xff0c;还是生活中的约会安排&#xff0c;我们都不能够忘记。那么苹果手机如何设置软件的提醒功能呢&#xff1f;苹…

解决 Git:This is not a valid source path/URL

由于sourcetree 可以获取不同仓库的代码&#xff0c;而我的用户名密码比较杂乱&#xff0c;导致经常会修改密码&#xff0c;在新建拉去仓库代码的时候sourcetree 不会提示你密码错误&#xff0c;直接提示 This is not a valid source path/URL。 在已存在的代码仓库&#xff0…

QT UI控件汇总介绍

按钮 ToolButton 和pushbutton没什么区别&#xff0c;可以用来设置图标 设置展示策略 RadioButton 一般用Container可以将其框起来设置互斥域&#xff0c;推荐选用GroupBox 使用方法 qDebug()<<ui->radioButton_3->isChecked(); CheckBox 可以勾选三态 stat…

动态代理IP常见超时原因及解决方法

在使用动态代理IP时&#xff0c;常常会遇到代理超时的问题。网络环境的不稳定性以及代理IP的质量问题&#xff0c;都可能会引起代理超时。这种情况下&#xff0c;代理服务器无法在规定时间内响应我们的请求&#xff0c;导致请求失败。 使用动态代理IP时&#xff0c;哪些原因会引…

SpringBoot和Hibernate——如何提高数据库性能

摘要&#xff1a;本文由葡萄城技术团队发布。转载请注明出处&#xff1a;葡萄城官网&#xff0c;葡萄城为开发者提供专业的开发工具、解决方案和服务&#xff0c;赋能开发者。 前言 在软件开发领域&#xff0c;性能是重中之重。无论您是构建小型 Web 应用程序还是大型企业系统…

MySQL详解 七:数据库高级语句(视图表、存储过程)

文章目录 1. create view ---- (视图表)1.1 视图的简单介绍1.2 基本语法1.2.1 创建视图表1.2.2 查看视图表1.2.3 删除视图表1.2.4 修改视图表 1.3 通过视图表得出无交集 2. case语句3. 空值&#xff08;null&#xff09; 和 无值&#xff08; &#xff09; 的区别4. 正则表达式…

大型语言模型:DistilBERT — 更小、更快、更便宜、更轻

一、介绍 近年来&#xff0c;大型语言模型的演进速度飞速发展。BERT成为最流行和最有效的模型之一&#xff0c;可以高精度地解决各种NLP任务。在BERT之后&#xff0c;一组其他模型随后出现在现场&#xff0c;也展示了出色的结果。 很容易观察到的明显趋势是&#xff0c;随着时间…

Vulnhub系列靶机-The Planets Earth

文章目录 Vulnhub系列靶机-The Planets: Earth1. 信息收集1.1 主机扫描1.2 端口扫描1.3 目录爆破 2. 漏洞探测2.1 XOR解密2.2 解码 3. 漏洞利用3.1 反弹Shell 4. 权限提升4.1 NC文件传输 Netcat&#xff08;nc&#xff09;文件传输 Vulnhub系列靶机-The Planets: Earth 1. 信息…

工矿企业电力运维云平台:提升效率与降低成本的关键

针对工矿企业用户&#xff0c;聚焦供配电领系统“安全监控、能耗管理、智能运维” 的三大需求&#xff0c;研发推出了“电易云”--智慧电力物联网&#xff0c;为工矿企业用户提供智慧电力数字化解决方案及数据服务&#xff0c;实现供配电系统的数字化、云端化、智能化、绿色化&…

笔记36:CNN的多通道卷积到底是什么样的

总结&#xff1a; &#xff08;1&#xff09;输入卷积层的feature_map的通道数&#xff0c;就是该卷积层每个卷积核所含有的通道数 &#xff08;2&#xff09;输出卷积层的feature_map的通道数&#xff0c;就是该卷积层所含有的卷积核的个数 a a a a 解释&#xff1a;【…

【数据结构C/C++】稀疏矩阵的压缩

文章目录 什么是稀疏矩阵&#xff1f;使用C语实现对稀疏矩阵的压缩408考研各数据结构C/C代码&#xff08;Continually updating&#xff09; 什么是稀疏矩阵&#xff1f; 稀疏矩阵&#xff08;Sparse Matrix&#xff09;是一种矩阵&#xff0c;其中大多数元素都是零。与稠密矩…

Floorplanning with Graph Attention

Floorplanning with Graph Attention DAC ’22 目录 Floorplanning with Graph Attention摘要1.简介2.相关工作3.问题公式化4. FLORA的方法4.1 解决方案概述4.2 C-谱聚类算法 4.3 基于GAT的模型4.4 合成训练数据集生成 摘要 布图规划一直是一个关键的物理设计任务&#xff0…