Raft一致性算法分析与总结

手搓RTOS内核:从GD32裸机实现抢占式调度与上下文切换 实时操作系统(RTOS)是嵌入式开发的核心基础,其本质在于对CPU、中断、内存与任务的协同管控。理解RTOS需穿透HAL库与IDE封装,回归ARM Cortex-M架构底层原理——包括向量表重映射、SysTick精密计时、PendSV异常触发机制及寄存器上下文保存/恢复流程。这些能力直接决定系统实时性、可靠性和可认证性,广泛应用于工业控制、医疗设备等高安全场景。本文以GD32F103为平台,全程不依赖HAL库与自动代码生成,聚焦最小可行内核(MVOS)构建,详解抢占式调度器、二值信号量与系统滴答三大模块的裸 阅读详情

Raft简介

Raft是一个用于日志复制,同步的一致性算法。它提供了和Paxos一样的功能和性能,但是它的算法结构与Paxos不同。这使得Raft相比Paxos更好理解,并且更容易构建实际的系统。为了强调可理解性,Raft将一致性算法分解为几个关键流程(模块),例如选主,安全性,日志复制,通过将分布式一致性这个复杂的问题转化为一系列的小问题进而各个击破的方式来解决问题。同时它通过实施一个更强的一致性来减少一些不必要的状态,进一步降低了复杂性。Raft还包括了一个新机制,允许线上进行动态的集群扩容,利用有交集的大多数机制来保证安全性。

####一些背景知识

#####A. 一致性算法简单回顾

一致性算法允许一个集群像一个整体一样工作,即使其中一些机器出现故障也不会影响正常服务。正因为如此,一致性算法在构建可信赖的大型分布式系统中都扮演着重要的角色。Paxos算法在过去10年中统治着这一领域:绝大多数实现都是基于Paxos,同时在教学领域讲解一致性问题时Paxos也经常拿来作为范例。但是不幸的是,尽管有很多工作都在试图降低它的复杂性,但是Paxos仍然难以理解。并且,Paxos自身算法的结构不能直接用于实际系统中,想要使用必须要进行大幅度改变,这些都导致无论在工业界还是教育界,Paxos都让人很DT。

时势造英雄,在这样的背景下Raft应运而生。Raft算法使用了一些特别的技巧使得它易于理解,包括算法分解(Raft主要分为选主,日志复制和安全三个大模块),同时在不影响功能的情况下,减少复制状态机的状态,降低复杂性。Raft算法或多或少的和已经存在的一些一致性算法有着相似之处,但是也具有如下特征:

  • 强leader语义:相比其他一致性算法,Raft使用增强形式的leader语义。举个例子,日志只能由leader复制给其它节点。这简化了日志复制需要的管理工作,使得Raft易于理解。
  • leader的选择:Raft使用随机计时器来选择leader,它的实现只是在心跳机制(任何一致性算法中都必须实现)上多做了一点“文章”,不会增加延迟和复杂性。
  • 关系改变:Raft使用了一个新机制joint consensus允许集群动态在线扩容,保障Raft的可持续服务能力。

Raft算法已经被证明是安全正确的,同时也有实验支撑Raft的效率不比其他一致性算法差。最关键是Raft算法要易于理解,在实际系统应用中易于实现的特点使得它成为了解决分布式系统一致性问题上新的“宠儿”。

#####B. 复制状态机

一致性算法是从复制状态机中提出的。简单地讲,复制状态机就是通过彼此之间的通信来将一个集群从一个一致性状态转向下一个一致性状态,它要能容忍很多错误情形。经典如GFS,HDFS都是使用了单独的复制状态机负责选主,存储一些能够在leader crash情况下进行恢复的配置信息等,比如Chubby和ZooKeeper。

复制状态机的典型实现是基于复制日志,如下图所示:

每个server上存储了一个包含一系列指令的日志,这些指令,状态机要按序执行。每一个日志在相同的位置存放相同的指令(可以理解成一个log包含一堆entry,这些entry组成一个数组,每个entry是一个command,数组相同偏移处的command相同),所以每一个状态机都执行了相同序列的指令。一致性算法就是基于这样一个简单的前提:集群中所有机器当前处于一个一致性状态,如果它们从该状态出发执行相同序列的指令走状态机的话,那么它们的下一个状态一定一致。但由于分布式系统中存在三态(成功,失败,无响应),如何来确保每台机器上的日志一致就非常复杂,也是一致性算法需要解决的问题。通常来讲,一致性算法需要具有以下特征:

  • 安全性:在非拜占庭故障下,包括网络分区,延迟,丢包,乱序等等情况下都保证正确。
  • 绝对可用:只要集群中大多数机器正常,集群就能错误容忍,进行正常服务。
  • 不依赖时序保证一致性:由于使用逻辑时钟,所以物理时钟错误或者极端的消息延迟都不影响可用性。
  • 通常情况下,一个指令可以在一轮RPC周期内由大多数节点完成,宕机或者运行速度慢的少数派不影响系统整体性能。

####Raft算法

前面对Raft算法进行了简要的介绍,这里开始对它进行深入分析。Raft实现一致性的机制是这样的:首先选择一个leader全权负责管理日志复制,leader从客户端接收log entries,将它们复制给集群中的其它机器,然后负责告诉其它机器什么时候将日志应用于它们的状态机。举个例子,leader可以在无需询问其它server的情况下决定把新entries放在哪个位置,数据永远是从leader流向其它机器。一个leader可以fail或者与其他机器失去连接,这种情形下会有新的leader被选举出来。

通过leader机制,Raft将一致性难题分解为三个相对独立的子问题:

  • Leader选举:当前leader跪了的情况下,新leader被选举出来。
  • 日志复制:leader必须能够从客户端接收log entries,然后将它们复制给其他机器,强制它们与自己一致。
  • 安全性:如果任何节点将偏移x的log entry应用于自己的状态机,那么其他节点改变状态机时使用的偏移x的指令必须与之相同。

#####A. Raft基本知识

一个Raft集群包含单数个server,5个是一个典型配置,允许该系统最多容忍两个机器fail。在任何时刻,每个server有三种状态:leader,follower,candidate。正常运行时,只有一个leader,其余全是follower。follower是被动的:它们不主动提出请求,只是响应leader和candidate的请求。leader负责处理所有客户端请求(如果客户端先连接某个follower,该follower要负责把它重定向到leader)。第三种状态candidate用于选主。下图展示了这些状态以及它们之间的转化:

Raft将时间分解成任意长度的terms,如下图所示:

terms有连续单调递增的编号,每个term开始于选举,这一阶段每个candidate都试图成为leader。如果一个candidate选举成功,它就在该term剩余周期内履行leader职责。在某种情形下,可能出现选票分散,没有选出leader的情况,这时新的term立即开始。Raft确保在任何term都只可能存在一个leader。term在Raft用作逻辑时钟,servers可以利用term判断一些过时的信息:比如过时的leader。每台server都存储当前term号,它随时间单调递增。term号可以在任何server通信时改变:如果某台server的当前term号小于其它servers,那么这台server必须更新它的term号,与它人保持一致;如果一个candidate或者leader发现自己的term过期,它就必须要“放下身段”变成follower;如果某台server收到一个过时的请求(拥有过时的term号),它会拒绝该请求。Raft servers使用RPC交互,基本的一致性算法只需要两种RPC。RequestVote RPCs由candidate在选举阶段发起。AppendEntries RPCs在leader复制数据时发起,leader在和其他人做心跳时也用该RPC。servers发起一个RPC,如果在没得到响应,则需要不断重试。另外,发起RPC是并行的。

#####B. leader选举

Raft使用心跳机制来触发选举。当server启动时,初始状态都是follower。每一个server都有一个定时器,超时时间为election timeout,如果某server没有超时的情况下收到来自leader或者candidate的任何RPC,定时器重启,如果超时,它就开始一次选举。leader给其他人发RPC要么复制日志,要么就是用来告诉followers老子是leader,你们不用选举的心跳(告诉followers对状态机应用日志的消息夹杂在心跳中)。如果某个candidate获得了大多数人的选票,它就赢得了选举成为新leader。每个server在某个term周期内只能给最多一个人投票,按照先来先给的原则。新leader要给其他人发送心跳,阻止新选举。

在等待选票过程中,一个candidate,假设为A,可能收到它人的声称自己是leader的AppendEntries RPC,如果那家伙的term号大于等于A的,那么A承认他是leader,自己重新变成follower。如果那家伙比自己小,那么A拒绝该RPC,继续保持candidate状态。

还有第三种可能性就是candidate既没选举成功也没选举失败:如果多个followers同时成为candidate去拉选票,导致选票分散,任何candidate都没拿到大多数选票,这种情况下Raft使用超时机制来解决。Raft给每一个server都分配一个随机长度的election timeout(一般是150——300ms),所以同时出现多个candidate的可能性不大,即使机缘巧合同时出现了多个candidate导致选票分散,那么它们就等待自己的election timeout超时,重新开始一次新选举(再一再二不能再三再四,不可能每次都同时出现多个candidate),实验也证明这个机制在选举过程中收敛速度很快。

#####C. 日志复制

一旦选举出了一个leader,它就开始负责服务客户端的请求。每个客户端的请求都包含一个要被复制状态机执行的指令。leader首先要把这个指令追加到log中形成一个新的entry,然后通过AppendEntries RPCs并行的把该entry发给其他servers,其他server如果发现没问题,复制成功后会给leader一个表示成功的ACK,leader收到大多数ACK后应用该日志,返回客户端执行结果。如果followers crash或者丢包,leader会不断重试AppendEntries RPC。Logs按照下图组织:

每个log entry都存储着一条用于状态机的指令,同时保存从leader收到该entry时的term号。该term号可以用来判断一些log之间的不一致状态。每一个entry还有一个index指明自己在log中的位置。

leader需要决定什么时候将日志应用给状态机是安全的,被应用的entry叫committed。Raft保证committed entries持久化,并且最终被其他状态机应用。一个log entry一旦复制给了大多数节点就成为committed。同时要注意一种情况,如果当前待提交entry之前有未提交的entry,即使是以前过时的leader创建的,只要满足已存储在大多数节点上就一次性按顺序都提交。leader要追踪最新的committed的index,并在每次AppendEntries RPCs(包括心跳)都要捎带,以使其他server知道一个log entry是已提交的,从而在它们本地的状态机上也应用。

Raft的日志机制提供两个保证,统称为Log Matching Property:

  • 不同机器的日志中如果有两个entry有相同的偏移和term号,那么它们存储相同的指令。
  • 如果不同机器上的日志中有两个相同偏移和term号的日志,那么日志中这个entry之前的所有entry保持一致。

第一个保证是由于一个leader在指定的偏移和指定的term,只能创建一个entry,log entries不能改变位置。第二个保证通过AppendEntries RPC的一个简单的一致性检查机制完成。当发起一个AppendEntries RPC,leader会包含正好排在新entries之前的那个entry的偏移和term号,如果follower发现在相同偏移处没有相同term号的一个entry,那么它拒绝接受新的entries。这个一致性检查以一种类似归纳法的方式进行:初始状态大家都没有日志,不需要进行Log Matching Property检查,但是无论何时followers只要日志要追加都要进行此项检查。因此,只要AppendEntries返回成功,leader就知道这个follower的日志一定和自己的完全一样。

在正常情形下,leader和follower的日志肯定是一致的,所以AppendEntries一致性检查从不失败。然而,如果leader crash,那么它们的日志很可能出现不一致。这种不一致会随着leader或者followers的crash变得非常复杂。下图展示了所有日志不一致的情形:

如上图(a)(b)followers可能丢失日志,(c)(d)有多余的日志,或者是(e)(f)跨越多个terms的又丢失又多余。在Raft里,leader强制followers和自己的日志严格一致,这意味着followers的日志很可能被leader的新推送日志所覆盖。

leader为了强制它人与自己一致,势必要先找出自己和follower之间存在分歧的点,也就是我的日志与你们的从哪里开始不同。然后令followers删掉那个分歧点之后的日志,再将自己在那个点之后的日志同步给followers。这个实现也是通过AppendEntries RPCs的一致性检查来做的。leader会把发给每一个follower的新日志的偏移nextIndex也告诉followers。当新leader刚开始服务时,它把所有follower的nextIndex都初始化为它最新的log entry的偏移+1(如上图中的11)。如果一个follower的日志和leader的不一致,AppendEntries RPC会失败,leader就减小nextIndex然后重试,直到找到分歧点,剩下的就好办了,移除冲突日志entries,同步自己的。当然这里有很大的优化余地,完全不需要一步一步回溯,怎么玩请自己看论文 1,很简单。

#####D. 安全性

前文讲解了Raft如何选主和如何进行日志复制,然而这些还不足以保证不同节点能执行严格一致的指令序列,需要额外的一些安全机制。比如,一个follower可能在当前leader commit日志时不可用,然而过会它又被选举成了新leader,这样这个新leader可能会用新的entries覆盖掉刚才那些已经committed的entries。结果不同的复制状态机可能会执行不同的指令序列,产生不一致的状况。这里Raft增加了一个可以确保新leader一定包含任何之前commited entries的选举机制。

(1) 选举限制

Raft使用了一个投票规则来阻止一个不包含所有commited entries的candidate选举成功。一个candidate为了选举成功必须联系大多数节点,假设它们的集合叫A,而一个entry如果能commit必然存储在大多数节点,这意味着对于每一个已经committed的entry,A集合中必然有一个节点持有它。如果这个candidate的Log不比A中任何一个节点旧才有机会被选举为leader,所以这个candidate如果要成为leader一定已经持有了所有commited entries(注意我说的持有指只是储存,不一定被应用到了复制状态机中。比如一个老的leader将一个entry发往大多数节点,它们都成功接收,老leader随即就commit这个entry,然后挂掉,此时这个entry叫commited entry,但是它不一定应用在了集群中所有的复制状态机上)。这个实现在RequestVote RPC中:该RPC包含了candidate log的信息,选民如果发现被选举人的log没有自己新,就拒绝投票。Raft通过比较最近的日志的偏移和term号来决定谁的日志更新。如果两者最近的日志term号不同,那么越大的越新,如果term号一样,越长的日志(拥有更多entries)越新。

(2) 提交早期terms的entries

正如前面所述的那样,一个leader如果知道一个当前term的entry如果储在大多数节点,就认为它可以commit。但是,一个leader不能也认为一个早于当前term的entry如果存在大多数节点,那么也是可以commit的。下图展示了这样一种状况,一个老的log存储在大多数节点上,但是仍有可能被新leader覆盖掉:

要消除上图中的问题,Raft采取针对老term的日志entries绝不能仅仅通过它在集群中副本的数量满足大多数,就认为是可以commit的。完整的commit语义也演变成:一个日志entry如果能够被认为是可以提交的,必须同时满足两个条件:

  • 这个entry存储在大多数节点上
  • 当前term至少有一个entry存储在大多数节点。

以上图为例,这两个条件确保一旦当前leader将term4的entry复制给大多数节点,那么S5不可能被选举为新leader了(日志term号过时)。综合考虑,通过上述的选举和commit机制,leaders永远不会覆盖已提交entries,并且leader的日志永远绝对是”the truth”。

(3) 调解过期leader

在Raft中有可能同一时刻不只一个server是leader。一个leader突然与集群中其他servers失去连接,导致新leader被选出,这时刚才的老leader又恢复连接,此时集群中就有了两个leader。这个老leader很可能继续为客户端服务,试图去复制entries给集群中的其它servers。但是Raft的term机制粉碎了这个老leader试图造成任何不一致的行为。每一个RPC servers都要交换它们的当前term号,新leader一旦被选举出来,肯定有一个大多数群体包含了最新的term号,老leader的RPC都必须要联系一个大多数群体,它必然会发现自己的term号过期,从而主动让贤,退变为follower状态。

然而有可能是老leader commit一个entry后失去连接,这时新leader必然有那个commit的entry,只是新leader可能还没commit它,这时新leader会在初次服务客户端前先把这个entry再commit一次,followers如果已经commit过直接返回成功,没commit就commit后返回成功而已,不会造成不一致。

#####E. Follower 或者candidate crash

Followers和candidate的crash比起leader来说处理要简单很多,它们的处理流程是相同的,如果某个follower或者candidate crash了,那么未来发往它的RequestVote和AppendEntries RPCs 都会失败,Raft采取的策略就是不停的重发,如果crash的机器恢复就会执行成功。另外,如果server crash是在完成一个RPC但在回复之前,那么在它恢复之后仍然会收到相同的RPC(让它重试一次),Raft的所有RPC都是幂等操作,如果follower已经有了某个entry,但是leader又让它复制,follower直接忽略即可。

#####F. 时间与可用性

Raft集群的可用性需要满足一个时间关系,即下面的公式:

broadcastTime代表平均的广播延迟(从并行发起RPC开始,直到收到大多数的回复为止)。electionTimeout就是前文所述的超时时间间隔,MTBF代表一个机器两次宕机时间间隔的平均值。broadcastTime必须远远小于electionTimeout,否则会频繁触发无意义的选举重启。electionTimeout远远小于MTBF就很好理解了。

####集群扩容

迄今为止的讨论都是假设集群配置不变的情况下(参与一致性算法的机器数目不变),但是实际中集群扩容(广义概念,泛指集群容量变化,可增可减)有时是必须的。比如业务所需,集群需要扩容,或者某机器永久损坏,需要从集群中剔除等等。

扩容最大的挑战就是保证一致性很困难,因为扩容不是原子的,有可能集群中一部分机器用老配置信息,另一部分用新配置信息,如上图所示,因此究竟多少算大多数在集群中可能存在分歧。扩容一般都分为两个阶段,有很多实现方法,比较典型的就是第一阶段,使所有旧配置信息失效,这段时间不对外提供服务;第二阶段允许新配置信息,重新对外服务。在Raft中集群第一阶段首先使集群转向一个被称作联合一致性(joint consensus)的状态;一旦这个联合一致性(有一个特殊的Cold,new entry表征)被提交,这个系统就开始向新配置迁移。joint consensus既包含老配置信息,又包含新配置信息,它的规则(Cold,new规则)如下:

  • log entries复制给集群中所有机器,不管配置信息新旧
  • 任何配置的server都有权利当leader
  • 达成一致所需要的大多数(不管是选举还是entry提交),既要包括老配置中的一个大多数也要包括新配置机器中的一个大多数。

joint consensus允许集群配置平滑过渡而不失去安全和一致性,同时集群可正常对外服务。集群配置信息以一个特殊的entry表征,存储在log中并和其他entry语义一样。当一个leader收到扩容请求,它就创建一个Cold,new的entry,并复制给集群其它其它机器,一旦有某个follower收到此entry并追加到自己的日志中,它就使用Cold,new规则(不需要committed)。leader按照Cold,new 规则对Cold,new进行commit。如果一个leader crash了,新leader既可能是没收到Cold,new的又可能是收到的,但是这两种情况都不会出现leader用Cnew规则做决策。

一旦Cold,new被提交,就开始向新配置转换。Raft保证只有拥有Cold,new的节点才会被选举为leader。现在leader可以很安全地创建一个叫Cnew的entry,然后复制给集群中属于新配置的节点。配置信息还是节点一收到就可以用来做决策。Cnew的commit使用Cnew 规则,旧配置已经与集群无关,新配置中不存在的机器可以着手关闭,Raft通过保证不让Cold和Cnew的节点有机会同时做决策来保障安全性。配置改变示意图如下:

有三个要注意的点:

(1) 新server加入进集群时也许没有存储任何log entries,它们需要很长时间来追上原有机器的“进度”,为了防止集群性能出现巨大的抖动,Raft在配置改变前又引入了一个特殊的阶段,当新机器加入集群时,它们作为无投票权的节点,即leader还是会将log entries复制给它们,但是不会被当做大多数对待。一旦这些“新人”追上了其他机器的进度,动态扩容可以像上述一样执行。

(2) 当前leader也许不是集群新配置中的一份子,在这种情况下,一旦Cnew被提交,这个leader就主动退出。这意味着当Cnew提交过程中这个leader要管理一个不包括它自己的集群。这时,它在给其他节点复制log entries时不把自己计入大多数。当Cnew提交成功,这个leader的使命就光荣完成了,在这个时间点前,只有Cold的节点才会被选举为leader。

(3) 第三个问题是被移除的机器可能会影响集群服务。这些机器不会再接收到心跳信息,它们因此可能重启选举,结果是它们用一个更新的term号发起RequestVote RPCs,当前leader无奈的退化为follower。新leader(拥有新配置的)还是会被选举出来,但是那些被移除的机器还是继续超时,开启选举,导致系统可用性降低。为解决这一问题,需要有一个机制让集群中节点能够忽略这种RequestVote RPCs,相信当前leader正在正常工作。Raft使用最小超时延迟(前面说过,Raft会随机为每个节点指定一个随机的election timeout,典型的是150ms到300ms,最小超时延迟就是它们之间的最小值)来保证,如果一个节点在最小超时延迟前收到一个RequestVote RPCs,那么该节点不会提升term号,也不会为其投票。这个不会影响正常的选举,因为正常选举中都是至少等待一个最小超时延迟才开始下一次选举的。

####Raft新集群扩容方案

为了降低集群扩容的复杂性,Raft还有一个可以备选的方案。它增强了扩容的限制:一次只允许一台机器加入或移除集群。复杂的扩容可以通过一系列的单机增加或删除变向实现。

当从集群中添加或删除一台机器时,任何旧配置集群中的大多数和任何新配置集群中的大多数必然存在一个交集,如下图所示。

注意就是这个交集让集群不可能存在两个互相独立,没有交集的大多数群体。因此系统中不会同时存在两个leader(一个由旧配置集群选举出来,一个由新配置集群选举出来),因此扩容是安全的,集群可以直接从旧配置转向新配置。

当leader收到添加或删除一台机器的请求,它将该Cnew添加到自己的log中,然后使用一样的复制机制,把这个entry复制给属于新配置集群的所有节点。只要节点把Cnew添加进log,就马上使用新配置信息,无需等到该entry提交。leader使用Cnew规则对Cnew进行提交,一旦提交完成,扩容就宣告完成,leader就知道任何没有Cnew的节点都不可能形成一个大多数,这样的节点也不可能成为集群的leader。Cnew的提交暗示了以下三件事情:

  1. leader获知扩容成功完成
  2. 如果新配置移除一台机器,那么这台机器可以着手关闭
  3. 新的扩容可以开始

正如上面所讲的那样,servers永远使用log中最新的配置,不管这个配置entry是否被提交。这样leader知道一

【信息科学与工程学】计算机科学与自动化——第十五篇 云计算 第四系列 存储系统50 并行文件存储中的算法分析 Raft共识算法和令牌管理机制。项目内容编号​RAFT-1类型​分布式一致性协议存储类型​并行文件存储(元数据管理)存储产品模式​分布式元数据服务器集群、分布式协调服务需求/场景定义​在分布式元数据服务器集群中,需要保证元数据(如文件目录结构、权限、属性)的强一致性和高可用性。多个副本之间必须就元数据的更新顺序达成一致,即使部分节点故障,系统仍能继续提供服务。需要解决领导者选举、日志复制、安全性等问题。场景的数学分析​设集群有N个节点,最多容忍f个节点故障。根据CAP定理,需要选择一致性(C)和分区容错性( 阅读详情

相关推荐

Redis主从集群

本文详细介绍了Redis主从集群和哨兵机制的搭建及原理。主要内容包括:一、Redis主从集群搭建1. 实现读写分离架构,通过slaveof命令配置主从关系2. 详细讲解主从复制过程及数据同步机制(sync/psync)3. 分析主从集群的容灾处理方案二、哨兵机制实现1. 哨兵集群的配置和启动流程2. 哨兵工作原理:通过三个定时任务监控节点状态3. 故障转移过程:包括主观下线、客观下线判断和Leader选举三、分布式系统理论1. 解析CAP定理及其在分布式系统中的应用2. 介绍BASE理论的基本思想3. 分析

qq_47896523的博客 942

5分钟让你看懂Consul特性及搭建

一、前言 虽然说牛逼的公司都有那么几个牛逼的运维团队,牛逼的运维团队都有着神秘黑科技般敲代码的姿势;本人虽然不是一个运维工程师,但是有幸自己比较爱倒腾这些东西,也会那么一点点运维知识,虽然不算专业,但是还是可以在linux平台下敲一敲代码。去年由于自己业余时间搞了一个app项目,当时自己兼任后端开发,又同时兼任运维,经过多少个夜晚才把后端API网关 搭建起来,当时技术选型主要使用微服务架构,说到微...

Jlion 技术博客 9万+

智能车竞赛飞檐走壁组赛道制作全攻略:从电磁线铺设到立体元素搭建

本文提供了智能车竞赛飞檐走壁组赛道制作的完整指南。从电磁线选材、电流控制与精准铺设等基础入手,详细解析了垂直墙面、圆筒、跷跷板等核心立体元素的构建技巧与过渡处理。重点分享了确保赛道稳定、符合规则且便于调试的实战经验,帮助参赛队伍搭建可靠的立体赛道,为车模算法调试奠定坚实基础。

weixin_29292535的博客 1274

Consul详解

Spring Cloud 支持很多服务发现的软件,Eureka 只是其中之一,下面是 Spring Cloud 支持的服务发现软件以及特性对比:FeatureeuerkaConsulzookeeperetcd服务健康检查可配支持服务状态,内存,硬盘等(弱)长连接,keepalive连接心跳多数据中心—支持——kv 存储服务—支持支持支持一致性—raftpaxosraftcapapcacpcp使用接口(多语言能力)http(sidecar)支持 http 和 dns客户端htt...

qq_40652202的博客 4万+

Cube.js 安装避坑指南:从零到一键启动

本文是一份详细的Cube.js安装避坑指南,旨在帮助开发者从零开始顺利启动Cube.js。文章重点强调了安装前的环境准备,包括Node.js版本、包管理工具和项目路径等关键“地基”,并深入解析了使用npx安装的优势、数据库类型选择以及数据库连接配置的核心步骤与常见陷阱,确保您能高效完成安装并成功启动服务。

weixin_29218509的博客 429

【Linux】Petalinux使用QSPI FLASH引导启动

1. 预分配Flash空间使用Flash引导Petalinux做的系统,也有进阶的做法。部分图片和经验来源于网络,若有侵权麻烦联系我删除,主要是做笔记的时候忘记写来源了,做完笔记很久才写博客。1. 预分配Flash空间根据生成的bit文件大小估算BOOT.BIN文件的大小,为Flash大概分配四个分区:boot、bootenv、kernel、bootscr,分别存放BOOT.BIN文件、u-boot的环境变量、内核文件(image.ub/zImage/uImage等)、启动脚本boot.scr。

Tesseract_9527的博客 3375

Consul详细教程(SpringBoot案例)

consul是google开源的一个使用go语言开发的服务发现、配置管理中心服务。内置了服务注册与发现框 架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其他工具(比如ZooKeeper等)。服务部署简单,只有一个可运行的二进制的包。每个节点都需要运行agent,他有两种运行模式server和client。每个数据中心官方建议需要3或5个server节点以保证数据安全,同时保证server-leader的选举能够正确的进行。👀️。

liuerpeng1904的博客 5806

第95节:多模型多卡推理管理

多模型推理:在同一硬件平台上同时部署多个不同或相同的深度学习模型,满足多任务需求。多卡推理:利用多块 GPU 资源,提升推理吞吐量与并发能力。目标:合理分配 GPU 资源,实现高效、低延迟的推理服务。

yumeiguo的博客 217

Consul 注册中心介绍以及搭建

Consul是HashiCorp公司推出的开源工具,用于实现分布式系统的服务发现与配置。与其它分布式服务注册与发现的方案相比,Consul的方案更“一站式”,内置了服务注册与发现框架、分布一致性协议实现、健康检查、Key/Value存储、多数据中心方案,不再需要依赖其它工具(比如ZooKeeper等),使用起来也较为简单。Consul使用Go语言编写,因此具有天然可移植性(支持Linux,Windows和MacOS);安装包仅包含一个可执行文件,方便部署,与Docker等轻量级容器可无缝配合。......

怪咖@的博客 1万+

C#串口通信从入门到精通(11)——串口接收的数据存储到本地文件(txt、csv)

本文详细介绍如何将串口通信将数据进行本次存储,主要介绍常用的csv、txt格式文件,由多年实战经验总结,绝对干货!

qq_34059233的博客 7237

地方政府预算数据抓取:利用Python爬虫获取预算安排、资金分配与支出情况

爬虫是通过模拟浏览器行为,从互联网上自动获取数据的程序。在本案例中,我们将通过爬虫从地方政府的官方网站或预算公开平台抓取各类预算信息。这些信息一般以HTML网页的形式呈现,可以通过爬虫对网页内容进行解析,提取所需的预算数据。Python作为数据抓取的强大工具,凭借其简洁的语法、强大的第三方库(如requestsSelenium等)以及丰富的数据处理能力,成为了开发爬虫应用的首选语言。

2201_76125261的博客 941

【服务治理中间件】consul介绍和基本原理

Consul是一个服务网格解决方案,提供了一个功能齐全的控制平面,具有服务发现、配置和分段功能。这些功能中的每一项都可以根据需要单独使用,也可以一起使用来构建一个完整的服务网格。Consul需要一个数据平面,并支持代理和原生集成模型。Consul提供了一个简单的内置代理,因此一切都可以开箱即用,但也支持第三方代理集成,如Envoy。Consul的主要功能有:服务发现: Consul的客户端可以注册一个服务,比如api或mysql,其他客户端可以使用Consul来发现特定服务的提供者。

康师傅没有眼泪 5553

【雷达】一维和二维自适应波束形成(DBF))DBF附matlab代码

1 简介 数字波束形成技术是天线波束形成原理与数字信号处理技术相结合的产物,其广泛应用于阵列信号处理领域.由于电磁工作环境的恶化和大量射频干扰的存在,在极低的信干噪比(SINR)条件下进行目标检测和信息提取十分困难.对于阵列系统,往往采用自适应数字波束形成(ADBF)技术,来抑制强干扰和方向性干扰对有用信号的影响.介绍了数字波束形成器的基本原理及其DSP的实现结构.​ 2 完整代码 clc;clear all;close all;%%%%%%%%%%%%%%%%%一维DBF%%%%%%%%%%%%%

qq_59747472的博客 7265

分布式一致性协议:Paxos算法

Paxos 术语 Proposal Value:提案的值。即合同约定中指定的票选候选人。 Proposal Number:提案的编号。会在贿选阶段,本地持久化。 Proposal:提案=提案的编号+提案的值。 Chosen:批准/选定,一旦某个值被Chosen,后续Paxos都必须用该值进行交互。 算法分析 算法背景是什么? 答:分布式节点,需要消息互通,保持状态(数据)一致性。 算法面临的挑战是什么? 答:CA的抉择,以及对于P的无奈(网络丢包现象不可避免,无法掌控)。 算法追求的效果是什

GZHarryAnonymous的博客 295

MATLAB 控制 E4438C 信号源的研究

通过 MATLAB,我们可以实现对 E4438C 的远程控制,从而实现更高的自动化和可编程性。总结起来,通过使用 MATLAB 和 Instrument Control Toolbox,我们可以轻松地控制 E4438C 信号源并生成各种类型的信号。需要注意的是,以上代码仅为示例,实际应用中可能需要根据具体情况进行更详细的配置和错误处理。此外,MATLAB 还提供了一系列函数和命令,可用于控制 E4438C 信号源的其他功能,如频率调谐、功率设置、调制设置等。您可以根据自己的需求进行相应的配置和控制。

RswtPerl的博客 1012

C# WinForm 基于DirectShow.dll编写的程序,可边预览边保存视频,音频和图片

基于微软的DirectShow.dll的二次开发1.自动识别连接的摄像头跟麦克风且可以对其进行选择(默认选中第一个)2.可录制wmv和avi两种格式的视频并且都带有音频,avi可以录制的分辨率和帧数进行选择,wmv默认进行了淸晰度优化如不喜欢可去除代码中有相关提示3.可在预览点开之后进行拍照,也可边录制视频边拍照4.添加了视频和音频的压缩功能(酌情使用)这次二次开发发现C#对DirectShow的相关信息太少,这次做完也不敢藏私共享出来,还望大家指正

Raft一致性算法

Why Not Paxos Paxos算法是莱斯利·兰伯特(LeslieLamport,就是 LaTeX 中的”La”,此人现在在微软研究院)于1990年提出的一种基于消息传递的一致性算法。由于算法难以理解起初并没有引起人们的重视,使Lamport在八年后1998年重新发表到ACM Transactions on Computer Systems上(The Part-TimeParlia

Mirage520的专栏 663

OV9734 DATASHEET,完整规格书

OV9734完整规格书,包括电气参数,尺寸规格,寄存器配置表等

Raft学习传送门

Raft官网 官方可视化动画1 官方可视化动画2 论文中文翻译 论文英文地址 Paxos Made Simple论文翻译 Raft理解 技术分享 《分布式一致性raft算法实现原理》 状态机 MIT: raft实现 分布式系统学习2-Raft算法分析与实现 分布式系统MIT 6.824学习资源 知乎大神的:Raft实现指南 mit-6.824 Lab 2: Raft...

风破 721

廖雪峰Python教程[完整版]

廖雪峰的python教程整理的,已经排好版了,而且还是完整的,适合小白

RocketMQ 多副本前置篇:初探raft协议

本文根据raft官方给出的raft动画进行学习,其动画展示地址:http://thesecretlivesofdata.com/raft/

luzhensmart的专栏 259

SnnGrow文章推荐:Raft算法分析

Raft 是一种更为简单方便易于理解的分布式算法,主要解决了分布式中的一致性问题。相比传统的 Paxos 算法,Raft 将大量的计算问题分解成为了一些简单的相对独立的子问题,并有着和 Multi-Paxos 同样的性能,下面我们通过文章内容描述,以还原 Raft 内部原理。

OpenSnn开源社区 278

一致性算法分析

目的 :一致性算法的出现是为了解决一致性问题,一致性问题是指对于一组服务器(集群),给定一组操作,需要使用一种协议使得它们的结果最终达成一致,看起来好像是一台服务器一样。 作用 :一致性算法在构建可信赖的大规模软件中扮演者重要的角色,常用的一致性算法Raft、Paxos算法等。 提出背景: 一致性算法是在复制状态机的背景下产生的,复制状态机用于解决分布式系统中的各种容错问题。复制状态机通过

phantom_111的博客 1万+

Raft算法分析与理解

最近看Raft算法,相比于Paxos算法的而言,这个算法确实是要容易理解很多。在官网上面也能够找到很好的实现代码。我挑选了https://github.com/willemt/raft 这个版本的实现帮助自己理解Raft算法。

飞鸟 2613

RAFT实践

1. raft org 2. paper 3.animation 4. python examples Raft-python 这个不是很好用。 simpleRaft Raft算法分析与理解 这哥们找了2个 5. video及其解释, 该文章下面一系列的raft分析。 6.Raft一致性算法 图解 Raft 一致性算法图解 R...

weixin_30532369的博客 184

redis源码之sentinel高可用架构分析-分布式一致性Raft算法

===================================================== redis源码学习系列文章: redis源码分析之sha1算法分析 redis源码分析之字典源码分析 redis源码分析之内存编码分析intset, ziplist编码分析 redis源码分析之跳跃表 redis源码分析之内存淘汰策略的原理分析 redis源码分析之对象系统源码分析string, list链表,hash哈希,set集合,zset有序集合 redis源码分析之异步进程保存数据rdb文

永远积极向上、永远热泪盈眶、永远豪情满怀、永远坦坦荡荡 547

分布式系统事务一致性

2019独角兽企业重金招聘Python工程师标准>>> ...

weixin_33805557的博客 81

【算法分析】Basic Paxos算法解析

什么是Paxos算法 Paxos算法是莱斯利·兰伯特(LeslieLamport,2014年图灵奖获得者,目前就职微软研究院)于1990年提出的一种基于消息传递且具有高度容错特性的一致性算法,是目前公认的解决分布式一致性问题最有效的算法之一 Google Chubby的作者Mike Burrows说过这个世界上只有一种一致性算法,那就是Paxos,其它的算法都是残次品。 Paxos算法有两...

HaoBBNuanMM的博客 1091
上一篇: 从etcd看Raft协议
下一篇: scribe、chukwa、kafka、flume日志系统对比
linuxheik
博客等级 码龄15年 865粉丝 135原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值