ZK的选举算法

2023-10-31

一、前言

  前面学习了Zookeeper服务端的相关细节,其中对于集群启动而言,很重要的一部分就是Leader选举,接着就开始深入学习Leader选举。

二、Leader选举

2.1 Leader选举概述

  Leader选举是保证分布式数据一致性的关键所在。当Zookeeper集群中的一台服务器出现以下两种情况之一时,需要进入Leader选举。

  (1) 服务器初始化启动。

  (2) 服务器运行期间无法和Leader保持连接。

  下面就两种情况进行分析讲解。

1. 服务器启动时期的Leader选举

  若进行Leader选举,则至少需要两台机器,这里选取3台机器组成的服务器集群为例。在集群初始化阶段,当有一台服务器Server1启动时,其单独无法进行和完成Leader选举,当第二台服务器Server2启动时,此时两台机器可以相互通信,每台机器都试图找到Leader,于是进入Leader选举过程。选举过程如下

(1) 每个Server发出一个投票。由于是初始情况,Server1和Server2都会将自己作为Leader服务器来进行投票,每次投票会包含所推举的服务器的myid和ZXID,使用(myid, ZXID)来表示,此时Server1的投票为(1, 0),Server2的投票为(2, 0),然后各自将这个投票发给集群中其他机器。

(2) 接受来自各个服务器的投票。集群的每个服务器收到投票后,首先判断该投票的有效性,如检查是否是本轮投票、是否来自LOOKING状态的服务器。

(3) 处理投票。针对每一个投票,服务器都需要将别人的投票和自己的投票进行PK,PK规则如下

· 优先检查ZXID。ZXID比较大的服务器优先作为Leader。

· 如果ZXID相同,那么就比较myid。myid较大的服务器作为Leader服务器。

对于Server1而言,它的投票是(1, 0),接收Server2的投票为(2, 0),首先会比较两者的ZXID,均为0,再比较myid,此时Server2的myid最大,于是更新自己的投票为(2, 0),然后重新投票,对于Server2而言,其无须更新自己的投票,只是再次向集群中所有机器发出上一次投票信息即可。

(4) 统计投票。每次投票后,服务器都会统计投票信息,判断是否已经有过半机器接受到相同的投票信息,对于Server1、Server2而言,都统计出集群中已经有两台机器接受了(2, 0)的投票信息,此时便认为已经选出了Leader。

(5) 改变服务器状态。一旦确定了Leader,每个服务器就会更新自己的状态,如果是Follower,那么就变更为FOLLOWING,如果是Leader,就变更为LEADING。

2. 服务器运行时期的Leader选举

在Zookeeper运行期间,Leader与非Leader服务器各司其职,即便当有非Leader服务器宕机或新加入,此时也不会影响Leader,但是一旦Leader服务器挂了,那么整个集群将暂停对外服务,进入新一轮Leader选举,其过程和启动时期的Leader选举过程基本一致。假设正在运行的有Server1、Server2、Server3三台服务器,当前Leader是Server2,若某一时刻Leader挂了,此时便开始Leader选举。选举过程如下

(1) 变更状态。Leader挂后,余下的非Observer服务器都会讲自己的服务器状态变更为LOOKING,然后开始进入Leader选举过程。

(2) 每个Server会发出一个投票。在运行期间,每个服务器上的ZXID可能不同,此时假定Server1的ZXID为123,Server3的ZXID为122;在第一轮投票中,Server1和Server3都会投自己,产生投票(1, 123),(3, 122),然后各自将投票发送给集群中所有机器。

(3) 接收来自各个服务器的投票。与启动时过程相同。

(4) 处理投票。与启动时过程相同,此时,Server1将会成为Leader。

(5) 统计投票。与启动时过程相同。

(6) 改变服务器的状态。与启动时过程相同。

2.2 Leader选举算法分析

在3.4.0后的Zookeeper的版本只保留了TCP版本的FastLeaderElection选举算法。当一台机器进入Leader选举时,当前集群可能会处于以下两种状态

    · 集群中已经存在Leader。

    · 集群中不存在Leader。

  对于集群中已经存在Leader而言,此种情况一般都是某台机器启动得较晚,在其启动之前,集群已经在正常工作,对这种情况,该机器试图去选举Leader时,会被告知当前服务器的Leader信息,对于该机器而言,仅仅需要和Leader机器建立起连接,并进行状态同步即可。而在集群中不存在Leader情况下则会相对复杂,其步骤如下

(1) 第一次投票。无论哪种导致进行Leader选举,集群的所有机器都处于试图选举出一个Leader的状态,即LOOKING状态,LOOKING机器会向所有其他机器发送消息,该消息称为投票。投票中包含了SID(服务器的唯一标识)和ZXID(事务ID),(SID, ZXID)形式来标识一次投票信息。假定Zookeeper由5台机器组成,SID分别为1、2、3、4、5,ZXID分别为9、9、9、8、8,并且此时SID为2的机器是Leader机器,某一时刻,1、2所在机器出现故障,因此集群开始进行Leader选举。在第一次投票时,每台机器都会将自己作为投票对象,于是SID为3、4、5的机器投票情况分别为(3, 9),(4, 8), (5, 8)。

(2) 变更投票。每台机器发出投票后,也会收到其他机器的投票,每台机器会根据一定规则来处理收到的其他机器的投票,并以此来决定是否需要变更自己的投票,这个规则也是整个Leader选举算法的核心所在,其中术语描述如下

· vote_sid:接收到的投票中所推举Leader服务器的SID。

· vote_zxid:接收到的投票中所推举Leader服务器的ZXID。

· self_sid:当前服务器自己的SID。

· self_zxid:当前服务器自己的ZXID。

  每次对收到的投票的处理,都是对(vote_sid, vote_zxid)和(self_sid, self_zxid)对比的过程。

    规则一:如果vote_zxid大于self_zxid,就认可当前收到的投票,并再次将该投票发送出去。

    规则二:如果vote_zxid小于self_zxid,那么坚持自己的投票,不做任何变更。

    规则三:如果vote_zxid等于self_zxid,那么就对比两者的SID,如果vote_sid大于self_sid,那么就认可当前收到的投票,并再次将该投票发送出去。

    规则四:如果vote_zxid等于self_zxid,并且vote_sid小于self_sid,那么坚持自己的投票,不做任何变更。

  结合上面规则,给出下面的集群变更过程。

(3) 确定Leader。经过第二轮投票后,集群中的每台机器都会再次接收到其他机器的投票,然后开始统计投票,如果一台机器收到了超过半数的相同投票,那么这个投票对应的SID机器即为Leader。此时Server3将成为Leader。

  由上面规则可知,通常那台服务器上的数据越新(ZXID会越大),其成为Leader的可能性越大,也就越能够保证数据的恢复。如果ZXID相同,则SID越大机会越大。

2.3 Leader选举实现细节

1. 服务器状态

  服务器具有四种状态,分别是LOOKING、FOLLOWING、LEADING、OBSERVING。

LOOKING:寻找Leader状态。当服务器处于该状态时,它会认为当前集群中没有Leader,因此需要进入Leader选举状态。

FOLLOWING:跟随者状态。表明当前服务器角色是Follower。

LEADING:领导者状态。表明当前服务器角色是Leader。

OBSERVING:观察者状态。表明当前服务器角色是Observer。

 2. 投票数据结构

  每个投票中包含了两个最基本的信息,所推举服务器的SID和ZXID,投票(Vote)在Zookeeper中包含字段如下

id:被推举的Leader的SID。

zxid:被推举的Leader事务ID。

 electionEpoch:逻辑时钟,用来判断多个投票是否在同一轮选举周期中,该值在服务端是一个自增序列,每次进入新一轮的投票后,都会对该值进行加1操作。

peerEpoch:被推举的Leader的epoch。

state:当前服务器的状态。

3. QuorumCnxManager:网络I/O

  每台服务器在启动的过程中,会启动一个QuorumPeerManager,负责各台服务器之间的底层Leader选举过程中的网络通信。

(1) 消息队列。QuorumCnxManager内部维护了一系列的队列,用来保存接收到的、待发送的消息以及消息的发送器,除接收队列以外,其他队列都按照SID分组形成队列集合,如一个集群中除了自身还有3台机器,那么就会为这3台机器分别创建一个发送队列,互不干扰。

· recvQueue:消息接收队列,用于存放那些从其他服务器接收到的消息。

· queueSendMap:消息发送队列,用于保存那些待发送的消息,按照SID进行分组。

· senderWorkerMap:发送器集合,每个SenderWorker消息发送器,都对应一台远程Zookeeper服务器,负责消息的发送,也按照SID进行分组。

· lastMessageSent:最近发送过的消息,为每个SID保留最近发送过的一个消息。

(2) 建立连接。为了能够相互投票,Zookeeper集群中的所有机器都需要两两建立起网络连接。QuorumCnxManager在启动时会创建一个ServerSocket来监听Leader选举的通信端口(默认为3888)。开启监听后,Zookeeper能够不断地接收到来自其他服务器的创建连接请求,在接收到其他服务器的TCP连接请求时,会进行处理。为了避免两台机器之间重复地创建TCP连接,Zookeeper只允许SID大的服务器主动和其他机器建立连接,否则断开连接。在接收到创建连接请求后,服务器通过对比自己和远程服务器的SID值来判断是否接收连接请求,如果当前服务器发现自己的SID更大,那么会断开当前连接,然后自己主动和远程服务器建立连接。一旦连接建立,就会根据远程服务器的SID来创建相应的消息发送器SendWorker和消息接收器RecvWorker,并启动。

(3) 消息接收与发送消息接收:由消息接收器RecvWorker负责,由于Zookeeper为每个远程服务器都分配一个单独的RecvWorker,因此,每个RecvWorker只需要不断地从这个TCP连接中读取消息,并将其保存到recvQueue队列中。消息发送:由于Zookeeper为每个远程服务器都分配一个单独的SendWorker,因此,每个SendWorker只需要不断地从对应的消息发送队列中获取出一个消息发送即可,同时将这个消息放入lastMessageSent中。在SendWorker中,一旦Zookeeper发现针对当前服务器的消息发送队列为空,那么此时需要从lastMessageSent中取出一个最近发送过的消息来进行再次发送,这是为了解决接收方在消息接收前或者接收到消息后服务器挂了,导致消息尚未被正确处理。同时,Zookeeper能够保证接收方在处理消息时,会对重复消息进行正确的处理。

4. FastLeaderElection:选举算法核心

· 外部投票:特指其他服务器发来的投票。

· 内部投票:服务器自身当前的投票。

· 选举轮次:Zookeeper服务器Leader选举的轮次,即logicalclock。

· PK:对内部投票和外部投票进行对比来确定是否需要变更内部投票。

(1) 选票管理

· sendqueue:选票发送队列,用于保存待发送的选票。

· recvqueue:选票接收队列,用于保存接收到的外部投票。

· WorkerReceiver:选票接收器。其会不断地从QuorumCnxManager中获取其他服务器发来的选举消息,并将其转换成一个选票,然后保存到recvqueue中,在选票接收过程中,如果发现该外部选票的选举轮次小于当前服务器的,那么忽略该外部投票,同时立即发送自己的内部投票。

 · WorkerSender:选票发送器,不断地从sendqueue中获取待发送的选票,并将其传递到底层QuorumCnxManager中。

(2) 算法核心

  上图展示了FastLeaderElection模块是如何与底层网络I/O进行交互的。Leader选举的基本流程如下

1. 自增选举轮次。Zookeeper规定所有有效的投票都必须在同一轮次中,在开始新一轮投票时,会首先对logicalclock进行自增操作。

2. 初始化选票。在开始进行新一轮投票之前,每个服务器都会初始化自身的选票,并且在初始化阶段,每台服务器都会将自己推举为Leader。

3. 发送初始化选票。完成选票的初始化后,服务器就会发起第一次投票。Zookeeper会将刚刚初始化好的选票放入sendqueue中,由发送器WorkerSender负责发送出去。

4. 接收外部投票。每台服务器会不断地从recvqueue队列中获取外部选票。如果服务器发现无法获取到任何外部投票,那么就会立即确认自己是否和集群中其他服务器保持着有效的连接,如果没有连接,则马上建立连接,如果已经建立了连接,则再次发送自己当前的内部投票。

 5. 判断选举轮次。在发送完初始化选票之后,接着开始处理外部投票。在处理外部投票时,会根据选举轮次来进行不同的处理。

· 外部投票的选举轮次大于内部投票。若服务器自身的选举轮次落后于该外部投票对应服务器的选举轮次,那么就会立即更新自己的选举轮次(logicalclock),并且清空所有已经收到的投票,然后使用初始化的投票来进行PK以确定是否变更内部投票。最终再将内部投票发送出去。

· 外部投票的选举轮次小于内部投。若服务器接收的外选票的选举轮次落后于自身的选举轮次,那么Zookeeper就会直接忽略该外部投票,不做任何处理,并返回步骤4。

· 外部投票的选举轮次等于内部投票。此时可以开始进行选票PK。

6. 选票PK。在进行选票PK时,符合任意一个条件就需要变更投票。

    · 若外部投票中推举的Leader服务器的选举轮次大于内部投票,那么需要变更投票。

    · 若选举轮次一致,那么就对比两者的ZXID,若外部投票的ZXID大,那么需要变更投票。

    · 若两者的ZXID一致,那么就对比两者的SID,若外部投票的SID大,那么就需要变更投票。

7. 变更投票。经过PK后,若确定了外部投票优于内部投票,那么就变更投票,即使用外部投票的选票信息来覆盖内部投票,变更完成后,再次将这个变更后的内部投票发送出去。

8. 选票归档。无论是否变更了投票,都会将刚刚收到的那份外部投票放入选票集合recvset中进行归档。recvset用于记录当前服务器在本轮次的Leader选举中收到的所有外部投票(按照服务队的SID区别,如{(1, vote1), (2, vote2)...})。

9. 统计投票。完成选票归档后,就可以开始统计投票,统计投票是为了统计集群中是否已经有过半的服务器认可了当前的内部投票,如果确定已经有过半服务器认可了该投票,则终止投票。否则返回步骤4。

10. 更新服务器状态。若已经确定可以终止投票,那么就开始更新服务器状态,服务器首选判断当前被过半服务器认可的投票所对应的Leader服务器是否是自己,若是自己,则将自己的服务器状态更新为LEADING,若不是,则根据具体情况来确定自己是FOLLOWING或是OBSERVING。

  以上10个步骤就是FastLeaderElection的核心,其中步骤4-9会经过几轮循环,直到有Leader选举产生。

三、总结

  经过本篇博文的学习,了解了Leader选举的具体细节,这对于之后的代码分析会打下很好的基础。也谢谢各位园友的观看~

        gaoshan个人解释,选举轮次,也就是逻辑时钟,即logicalclock。这个值,不会频繁变化,一次选举,自增一次。一次选举过程中,可能包括多次投票,投票不涉及逻辑时钟的自增。

         举例,初始情况下5台机器,sid分别为1、2、3、4、5,逻辑时钟都是0。依次启动后,开始选举,所有的机器逻辑时钟自增为1。经过多次投票,假设第三台机器为leader,其他4台机器为follower,此时5台机器的逻辑时钟都为1。

        一般情况下,逻辑时钟应该都是相同的。但是,由于一些机器崩溃的问题,是可能出现逻辑时钟不一致的情况的。例如,上例中,sid=3的机器为leader。之后某一刻,sid为1、3的机器崩溃,zookeeper仍然可以正常对外提供服务。但需要重新选主,剩下的2、4、5重新投票选主,假设sid=5成为新的leader,逻辑时钟自增,由1变成2。之后某一刻,sid为5的机器奔溃,sid为1的机器复活,仍然有3台机器运行,zookeeper可以对外提供服务,但需要重新选主。重新选主,逻辑时钟自增,这时sid为2、4的机器的逻辑时钟是由2自增为3,而sid为1的机器的逻辑时钟是由1自增为2。这种情况下,就出现了逻辑时钟不一致的情况。这时,需要清楚sid为1的机器内部的投票数据,因为这些投票数据都是过时的数据。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

ZK的选举算法 的相关文章

  • 4元数(转)

    这是国内找不到的超好文章 为什么大陆的4元数文章很垃圾呢 翻译中 奉献给大家 70秒即懂 能使用 用四元数 4元数 阔特尼恩 Quaternion旋转 C 中田 亨 独立行政法人 产业技术综合研究所 数字人类研究中心 研究员 博士 工学 2
  • 3.1 ZK客户端创建节点源码解析上(基于NIO)

    ZK客户端创建节点源码解析上 前言 1 为什么能用来做注册中心 2 创建节点 2 1 ZooKeeper create 方法 2 2 ClientCnxn queuePacket 方法 2 3 ClientCnxnSocketNIO doT
  • 乔戈里推荐的新版Java学习路线,开源!

    Java 学习路线一条龙版 by 程序员鱼皮 所以我又抽空做了新版的 Java 学习路线一条龙 补充了很多内容 比如面试题 常用 Java 类库 常用软件等 让整个路线 字数翻倍 同时区分了各知识点的学习必要性 使得无论是急着找工作还是想花
  • ZK的选举算法

    一 前言 前面学习了Zookeeper服务端的相关细节 其中对于集群启动而言 很重要的一部分就是Leader选举 接着就开始深入学习Leader选举 二 Leader选举 2 1 Leader选举概述 Leader选举是保证分布式数据一致性
  • 4万字 全面解读数据中台、数据仓库、数据湖等概念!建议收藏!

    作者丨修鹏李 建议阅读需50分钟 如今 随着诸如互联网以及物联网等技术的不断发展 越来越多的数据被生产出来 据统计 每天大约有超过2 5亿亿字节的各种各样数据产生 这些数据需要被存储起来并且能够被方便的分析和利用 随着大数据技术的不断更新和
  • 经典的Python爬虫和网络编程面试题

    1 动态加载又对及时性要求很高怎么处理 Selenium Phantomjs 尽量不使用 sleep 而使用 WebDriverWait 2 分布式爬虫主要解决什么问题 1 ip 2 带宽 3 cpu 4 io 3 什么是 URL URL
  • 2万字雄文:饿了么核心交易系统 5 年演化史!

    我为什么会写这篇文章 究其缘由 一是自己在交易域做了 4 年 有很多只有我才知道 才能串起来的故事 想把这些记录并保留下来 二是发现后边的很多同学看交易体系时 一接触就是分布式 SOA 每日百万 千万数据量 只知道它是这个样子 很难理解背后
  • zkServer.cmd点击无反应,报错:JAVA_HOME is not set

    window版本中的zk安装过程中遇到一些问题 zkServer cmd点击无反应 现象 window本地准备zk启动的时候 点击zkServer cmd 不弹启动日志的窗口 无反应 以下是排查过程 在zk的安装目录下 我的是D apach
  • Java中9种常见的CMS GC问题分析与解决

    目前 互联网上 Java 的 GC 资料要么是主要讲解理论 要么就是针对单一场景的 GC 问题进行了剖析 对整个体系总结的资料少之又少 前车之鉴 后事之师 美团的几位工程师历时一年多的时间 搜集了内部各种 GC 问题的分析文章 并结合个人的
  • ZK相关(转载)

    Paxos算法 https www douban com note 208430424 zAB https blog csdn net junchenbb0430 article details 77583955 utm medium di
  • 启用 Grails 休眠过滤器

    嗨 我正在使用Grails 过滤器插件 我正在尝试定义一个默认过滤器 如下所示 Defined inside the Book entity static hibernateFilters activeFilter condition ac
  • 选定的项目数据从表格到 ZK 中的文本框

    我正在开发一个小型 Web 应用程序 用于存储医院患者的数据 以便更多地了解 zk 及其令人惊叹的功能 这次我的目标是 当我选择一行 复选标记 时 我想将该行的数据 红色 获取到相应的文本框 蓝色 当我选择表的任何行时 这将起作用 也许这是
  • 如何检查元素是否在屏幕外

    我需要使用 jQuery 检查 DIV 元素是否没有脱离屏幕 这些元素是可见的 并根据 CSS 属性显示 但可以通过以下方式故意将它们放置在屏幕外 position absolute left 1000px top 1000px 我无法使用
  • 如何让 ZK webfragment 与嵌入式 Jetty 9 一起工作?

    这个最小的嵌入式 Jetty 项目可以正确启动 扫描注释并查找并映射带注释的 TestServlet 项目结构 src main java test Test java webapp test zul pom xml 测试 java pac
  • 如何使用 Selenium Java 2.8 获取当前 DOM?

    我正在使用最新版本的 Selenium 和chromedriver测试 ZK 应用程序 在测试期间 我想转储 DOM 或其中的一部分 以帮助我找到所需的元素 并且可能帮助必须维护测试的人 方法WebDriver getPageSource
  • applicationcontext.xml 和 .hbm 文件放在哪里?

    我正在学习 spring hibernate zk stack 并做我的第一个 crud 以下内容本教程 http books zkoss org wiki Small Talks 2011 December Integrate ZK5 w
  • Zk如何通过id到达包含的.zul页面组件?

    我无法通过包含的 zul 页面中的 id 访问组件 我有一个带有控制器的 main zul 我需要通过 java 控制器类获取包含的 zul 页面中的一个组件 但它返回 null 我知道包含的方法会创建新的 id 空间 但是有什么方法可以获
  • 覆盖ZK中的“处理”

  • 通过 Jquery 从 Datebox 中清除日期

    下面的代码在日期框模式弹出窗口中显示一个按钮 但我想清除单击该按钮时的日期 我尝试了很多东西 但无法通过 jQuery 方法做到这一点
  • 如何从js获取zk元素id

    我正在使用 ZK 我想从 js 获取 zk 元素的 id 我使用了不同的方式 像原生 html 一样声明组件 它从 js 获取 id 但它不正确 我已经使用 ZK 的 html 标签声明了该元素 但也不正确 我已经看到了一些像 Compon

随机推荐

  • 重力球——重力感应器应用

    首届 Google 暑期大学生博客分享大赛 2010 Andriod 篇 之前在网上看到一个HTC的Windows Mobile手机中的一个应用重力感应器的程序 蛋疼的小球 地址 http v youku com v show id XMT
  • Python字符串的常用方法(3-3)

    目录 一 字符串编码格式 二 字符串的格式化 三 字符串格式化函数 format 四 Python3 6加入的新格式化方案一f strings 五 格式化符号 六 format的使用方法 七 字符串的特殊字符 一 字符串编码格式 1 什么是
  • bootcmd和bootargs环境变量

    从网络启动 setenv bootargs console tty0 console ttymxc0 115200 root dev mmcblk1p2 rootwait rw setenv bootcmd tftp 80800000 zI
  • cuda c语言编程指南,CUDA C编程权威指南

    译者序 推荐序 自序 作者简介 技术审校者简介 前言 致谢 章基于CUDA的异构并行计算1 1 1并行计算1 1 1 1串行编程和并行编程2 1 1 2并行性3 1 1 3计算机架构4 1 2异构计算6 1 2 1异构架构7 1 2 2异构
  • PSIM联合VS--PLL锁相环

    在学习使用PSIM联合VS的过程中 有一项为采样三相电压信号建立软件锁相环练习PI的使用 在查询资料的过程中 网上的百度百科讲PLL作为产生n倍频来使用 这与我之前做电机控制中的PLL概念不太一致 所以产生了疑问 当时的许多知识 现在回头看
  • JetBrains IntelliJ IDEA Ultimate 2022.1.1 Win/macOS 中文

    下载链接 https sbww work 16343 IntelliJ IDEA安装和设置 IntelliJ IDEA 安装要求 硬件需求 至少需要 2 GB RAM 但是推荐使用 4 GB RAM 至少需要 1 5 GB 硬盘空间 1 G
  • 文件文档在线预览转换解决方案和应用

    文章目录 Java Word转PDF文件方案评测 一 kkFileView应用场景一 官网原始部署与应用 二 kkFileView应用场景二 编译 自定义制作docker镜像部署 三 kkfileview预览pdf文件以及关键词高亮和定位
  • Nacos配置管理

    目录 1 Nacos配置管理 1 1 统一配置管理 1 1 1 在nacos中添加配置文件 1 1 2 从微服务拉取配置 1 2 配置热更新 1 2 1 方式一 1 2 2 方式二 1 3 配置共享 1 添加一个环境共享配置 2 在user
  • 财报解读:份额企稳、均价上浮,小米高端化驶入正轨?

    时隔半个月 在雷军那场颇有反响的以 成长 为主题的个人演讲之后 小米发布了今年二季度财报 二季报中亮眼的财务数据 为雷军的演讲提供了一份更加有力的注解 小米经过三年探索 似乎已经找到了高端化的诀窍 因而实现了 成长 但当高端化转型已经成为市
  • 第一章 计算机系统的概述①

    一 操作系统概述 1 操作系统的概念 什么是操作系统 概念 操作系统 Operating System 0s 是指控制和管理整个计算机系统的硬件和软件资源 并合理地组织调度计算机的工作和资源的分配 以提供给用户和其他软件方便的接口和环境 它
  • 失传已久的广工Dr.com路由器最简单最小白的配置方法

    失传已久的广工路由器最简单最小白的配置方法 零 前言 一 准备工作 1 所需物品 2 原理及工具介绍 没兴趣的请直接跳过 二 路由器权限获取 须时两周 三 分析心跳包 1 安装wireshark 2 进行抓包 四 尝试第一次拨号 1 打开W
  • Xcode 之自己编译静态库

    今天介绍下 如何利用Xcode 新建一个静态库 以及如何编译成i386 armv7 armv7s 等平台架构 开发环境 MAC OS X 10 9 4 Xcode 5 0 2 背景知识 库分两种 静态库 a lib 和 动态库 so dll
  • 学员管理系统——面向对象

    文章目录 前言 基本思路 Student py main py StudentManage py 菜单 menu 根据菜单实现程序的大概逻辑 add student 添加学员信息 delete student 删除学员信息 modify s
  • STM32-定时器详解

    目录 前言 一 定时器基本介绍 1 STM32定时器 2 通用定时器功能和特点 3 计数器模式 4 定时器工作原理 a 定时器框图 b 时钟产生器部分 c 时基单元 d 输入捕获通道 e 输出比较通道 PWM 二 定时器中断应用 1 内部时
  • SpringBoot基本操作(四)——SpringBoot使用RedisTemplate整合Redis(有demo)

    SpringBoot2 0笔记 一 SpringBoot基本操作 环境搭建及项目创建 有demo 二 SpringBoot基本操作 使用IDEA打war包发布及测试 三 SpringBoot基本操作 SpringBoot整合SpringDa
  • Visual Studio Community 2019 评估期结束,登录一直失败问题

    今天打开VS2019 发现它试用期过期了需要登录 点击登录 发现一直说浏览器版本太低 需要升级浏览器 真正点击下载Edge浏览器 它又不直接跳转到该浏览器中 反复试了好多次 简直让人崩溃 后来网上搜索到用设备代码流的方式可以解决 https
  • 简图记录-驱动debug之打印总结(printk、dmesg、logcat)

    简图记录总结 在驱动开发过程中 常会用到一些打印做问题定位 无论是提前设计或者调试过程中添加 打印都是一种常用的手段 以下为打印相关问题总结 一 常见驱动打印的添加与查看 1 内核打印printk 概念 printk是内核中根据日志级别向控
  • shell编程必须会的30道题目

    linux运维人员必会的30道shell编程面试题 一 序言 前几天一个做开发的朋友发给我一个链接 http oldboy blog 51cto com 2561410 1632876 from singlemessage isappins
  • linux启动jar包指定日志输出目录下,linux 启动jar包 指定yml配置文件和输入日志文件...

    命令为 nohup java jar project jar spring config location home project conf application yml gt home project conf nohup out 2
  • ZK的选举算法

    一 前言 前面学习了Zookeeper服务端的相关细节 其中对于集群启动而言 很重要的一部分就是Leader选举 接着就开始深入学习Leader选举 二 Leader选举 2 1 Leader选举概述 Leader选举是保证分布式数据一致性