Raft共识算法在分布式系统中是常用的共识算法之一,论文原文In Search of an Understandable Consensus Algorithm ,作者在论文中指出Poxas共识算法的两大问题,其一是难懂,其二是应用到实际系统存在困难。针对Paxos存在的问题,作者的目的是提出一个易懂的共识算法,论文中有单独一小节论述Raft是一个实用的、安全可用、有效易懂的共识算法。本文描述了Raft共识算法的细节,很多内容描述及引用图片均摘自论文原文。
Raft概述

我们主要分以下三部分对Raft进行讨论:

Leader election——a new leader must be chosen when
an existing leader fails. (领导人选举)
Log replication——the leader must accept log entries from clients and replicate them across the cluster,
forcing the other logs to agree with its own.(日志复制)
Safety——the key safety property for Raft. (安全性)

正常工作过程中,Raft分为两部分,首先是leader选举过程,然后在选举出来的leader基础上进行正常操作,比如日志复制操作等。

一个Raft集群通常包含2N+1
个服务器,允许系统有N

个故障服务器。每个服务器处于3个状态之一:leader、follower或candidate。正常操作状态下,仅有一个leader,其他的服务器均为follower。follower是被动的,不会对自身发出的请求而是对来自leader和candidate的请求做出响应。leader处理所有的client请求(若client联系follower,则该follower将转发给leader)。candidate状态用来选举leader。状态转换如下图所示:

为了进行领导人选举和日志复制等,需要服务器节点存储如下状态信息:
状态 所有服务器上持久存在的
currentTerm 服务器最后一次知道的任期号(初始化为 0,持续递增)
votedFor 在当前获得选票的候选人的 Id
log[] 日志条目集;每一个条目包含一个用户状态机执行的指令,和收到时的任期号
状态 所有服务器上经常变的
commitIndex 已知的最大的已经被提交的日志条目的索引值
lastApplied 最后被应用到状态机的日志条目索引值(初始化为 0,持续递增)
状态 在领导人里经常改变的 (选举后重新初始化)
nextIndex[] 对于每一个服务器,需要发送给他的下一个日志条目的索引值(初始化为领导人最后索引值加一)
matchIndex[] 对于每一个服务器,已经复制给他的日志的最高索引值

Raft在任何时刻都满足如下特性:

Election Safety:在一个任期中只能有一个leader;
Leader Append-Only:leader不会覆盖或删除日志中的entry,只有添加entry(follower存在依据leader回滚日志的情况);
Log Matching:如果两个日志包含了一条具有相同index和term的entry,那么这两个日志在这个index之前的所有entry都相同;
Leader Completeness: 如果在某一任期一条entry被提交committed了,那么在更高任期的leader中这条entry一定存在;(领导人选举时会保证这一性质,后面会讲到这个问题)
State Machine Safety:如果一个节点将一条entry应用到状态机中,那么任何节点也不会再次将该index的entry应用到状态机里;

下面我们详细讨论这几部分。
Leader选举(Leader election)

一个节点初始状态为follower,当follower在选举超时时间内未收到leader的心跳消息,则转换为candidate状态。为了避免选举冲突,这个超时时间是一个随机数(一般为150~300ms)。超时成为candidate后,向其他节点发出RequestVoteRPC请求,假设有2N+1
个节点,收到N+1

个节点以上的同意回应,即被选举为leader节点,开始下一阶段的工作。如果在选举期间接收到eader发来的心跳信息,则candidate转为follower状态。

在选举期间,可能会出现多个candidate的情况,可能在一轮选举过程中都没有收到多数的同意票,此时再次随机超时,进入第二轮选举过程,直至选出leader或着重新收到leader心跳信息,转为follower状态。

正常状态下,leader会不断的广播心跳信息,follower收到leader的心跳信息后会重置超时。当leader崩溃或者出现异常离线,此时网络中follower节点接收不到心跳信息,超时再次进入选举流程,选举出一个leader。

这里还有补充一些细节,每个leader可以理解为都是有自己的任期(term)的,每一期起始于选举阶段,直到因节点失效等原因任期结束。每一期选举期间,每个follower节点只能投票一次。图中t3可能是因为没有获得超半数票等造成选举失败,须进行下一轮选举,此时follower可以再次对最先到达的candidate发出的RequestVote请求投票(先到先得)。

对所有的请求(RequestVote、AppendEntry等请求),如果发现其Term小于当前节点,则拒绝请求,如果是candidate选举期间,收到不小于当前节点任期的leader节点发来的AppendEntry请求,则认可该leader,candidate转换为follower。
日志复制(Log replication)

leader选举成功后,将进入有效工作阶段,即日志复制阶段,其中日志复制过程会分记录日志和提交数据两个阶段。

整个过程如下:

首先client向leader发出command指令;(每一次command指令都可以认为是一个entry,或者说是日志项)
leader收到client的command指令后,将这个command entry追加到本地日志中,此时这个command是uncommitted状态,因此并没有更新节点的当前状态;
之后,leader向所有follower发送这条entry,也就是通过日志复制AppendEntries消息 (可以是一条也可以是多条日志项) 将日志项复制到集群其他节点上,follower接收到后 (这里有判断条件的,并不是所有leader发送来的日志项都无条件接收,而且还可能存在本地与leader日志不一致的情况,后面会详细说明,这里先看正常情况) 追加到本地日志中,并回应leader成功或者失败;
leader收到大多数follower的确认回应后,此entry在leader节点由uncommitted变为committed状态,此时按这条command更新leader状态,或者说将该日志项应用到状态机,然后向client返回执行结果;
在下一心跳中(这里也可以是或者说多数情况下是新的日志复制AppendEntries消息,会带有相关信息,后面后详细的字段说明会讲到),leader会通知所有follower更新确认的entry,follower收到后,更新状态,这样,所有节点都完成client指定command的状态更新。

可以看到client每次提交command指令,服务节点都先将该指令entry追加记录到日志中,等leader确认大多数节点已追加记录此条日志后,在进行提交确认,更新节点状态。如果还对这个过程有些模糊的话,可以参考Raft动画演示,较为直观的演示了领导人选举及日志复制的过程。
安全(Safety)

前面描述了Raft算法是如何选举和复制日志的。然而,到目前为止描述的机制并不能充分的保证每一个状态机会按照相同的顺序执行相同的指令。我们需要再继续深入思考以下几个问题:

第一个问题,leader选举时follower收到candidate发起的投票请求,如果同意就进行回应,但具体的规则是什么呢?是所有的follower都有可能被选举为领导人吗?
第二个问题,leader可能在任何时刻挂掉,新任期的leader怎么提交之前任期的日志条目呢?

选举限制

针对第一个问题,之前并没有细讲,如果当前leader节点挂了,需要重新选举一个新leader,此时follower节点的状态可能是不同的,有的follower可能状态与刚刚挂掉的leader相同,状态较新,有的follower可能记录的当前index比原leader节点的少很多,状态更新相对滞后,此时,从系统最优的角度看,选状态最新的candidate为佳,从正确性的角度看,要确保Leader Completeness,即如果在某一任期一条entry被提交成功了,那么在更高任期的leader中这条entry一定存在,反过来讲就是如果一个candidate的状态旧于目前被committed的状态,它一定不能被选为leader。具体到投票规则:
1) 节点只投给拥有不比自己日志状态旧的节点;
2)每个节点在一个term内只能投一次,在满足1的条件下,先到先得;

我们看一下请求投票 RPC(由候选人负责调用用来征集选票)的定义:
参数 解释
term 候选人的任期号
candidateId 请求选票的候选人的 Id
lastLogIndex 候选人的最后日志条目的索引值
lastLogTerm 候选人最后日志条目的任期号
返回值 解释
term 当前任期号,以便于候选人去更新自己的任期号
voteGranted 候选人赢得了此张选票时为真

接收者实现:

如果term < currentTerm返回 false
如果 votedFor 为空或者为 candidateId,并且候选人的日志至少和自己一样新,那么就投票给他

可以看到RequestVote投票请求中包含了lastLogIndex和lastLogTerm用于比较日志状态。这样,虽然不能保证最新状态的candidate成为leader,但能够保证被选为leader的节点一定拥有最新被committed的状态,但不能保证拥有最新uncommitted状态entries。
提交之前任期的日志条目

领导人知道一条当前任期内的日志记录是可以被提交的,只要它被存储到了大多数的服务器上。但是之前任期的未提交的日志条目,即使已经被存储到大多数节点上,也依然有可能会被后续任期的领导人覆盖掉。下图说明了这种情况:

如图的时间序列展示了为什么领导人无法决定对老任期号的日志条目进行提交。在 (a) 中,S1 是领导者,部分的复制了索引位置 2 的日志条目。在 (b) 中,S1崩溃了,然后S5在任期3里通过S3、S4和自己的选票赢得选举,然后从客户端接收了一条不一样的日志条目放在了索引 2 处。然后到 (c),S5又崩溃了;S1重新启动,选举成功,开始复制日志。在这时,来自任期2的那条日志已经被复制到了集群中的大多数机器上,但是还没有被提交。如果S1在(d)中又崩溃了,S5可以重新被选举成功(通过来自S2,S3和S4的选票),然后覆盖了他们在索引 2 处的日志。反之,如果在崩溃之前,S1 把自己主导的新任期里产生的日志条目复制到了大多数机器上,就如 (e) 中那样,那么在后面任期里面这些新的日志条目就会被提交(因为S5 就不可能选举成功)。 这样在同一时刻就同时保证了,之前的所有老的日志条目就会被提交。

为了消除上图里描述的情况,Raft永远不会通过计算副本数目的方式去提交一个之前任期内的日志条目。只有领导人当前任期里的日志条目通过计算副本数目可以被提交;一旦当前任期的日志条目以这种方式被提交,那么由于日志匹配特性,之前的日志条目也都会被间接的提交。

当领导人复制之前任期里的日志时,Raft 会为所有日志保留原始的任期号。

对Raft中几种情况的思考
follower节点与leader日志内容不一致时怎么处理?

我们先举例说明:正常情况下,follower节点应该向B节点一样与leader节点日志内容一致,但也会出现A、C等情况,出现了不一致,以A、B节点为例,当leader节点向follower节点发送AppendEntries<prevLogIndex=7,prevLogTerm=3,entries=[x<-4]>,leaderCommit=7时,我们分析一下发生了什么,B节点日志与prevLogIndex=7,prevLogTerm=3相匹配,将index=7(x<-5)这条entry提交committed,并在日志中新加入entryx<-4,处于uncommitted状态;A节点接收到时,当前日志index<prevLogIndex与prevLogIndex=7,prevLogTerm=3不相匹配,拒接该请求,不会将x<-4添加到日志中,当leader知道A节点因日志不一致拒接了该请求后,不断递减preLogIndex重新发送请求,直到A节点index,term与prevLogIndex,prevLogTerm相匹配,将leader的entries复制到A节点中,达成日志状态一致。

我们看一下附加日志AppendEntries RPC(由领导人负责调用复制日志指令;也会用作heartbeat)的定义:
参数 解释
term 领导人的任期号
leaderId 领导人的 Id,以便于跟随者重定向请求
prevLogIndex 新的日志条目紧随之前的索引值
prevLogTerm prevLogIndex 条目的任期号
entries[] 准备存储的日志条目(表示心跳时为空;一次性发送多个是为了提高效率)
leaderCommit 领导人已经提交的日志的索引值
返回值 解释
term 当前的任期号,用于领导人去更新自己
success 跟随者包含了匹配上 prevLogIndex 和 prevLogTerm 的日志时为真

接收者实现:

如果 term < currentTerm 就返回 false;
如果日志在 prevLogIndex 位置处的日志条目的任期号和 prevLogTerm 不匹配,则返回 false;
如果已经存在的日志条目和新的产生冲突(索引值相同但是任期号不同),删除这一条和之后所有的;(raft中follower处理不一致的一个原则就是一切听从leader)
附加日志中尚未存在的任何新条目;
如果 leaderCommit > commitIndex,令 commitIndex 等于 leaderCommit 和 新日志条目索引值中较小的一个;

http://data.travel.sina.com.cn/tags/%E7%BC%85%E7%94%B8%E6%9E%9C%E5%8D%9A%E4%B8%9C%E6%96%B9%E7%94%B5%E8%AF%9D_18183615678
简单总结一下,出现不一致时核心的处理原则是一切遵从leader。当leader向follower发送AppendEntry请求,follower对AppendEntry进行一致性检查,如果通过,则更新状态信息,如果发现不一致,则拒绝请求,leader发现follower拒绝请求,出现了不一致,此时将递减nextIndex,并重新给该follower节点发送日志复制请求,直到找到日志一致的地方为止。然后把follower节点的日志覆盖为leader节点的日志内容。
leader挂掉了,怎么处理?

前面可能断断续续的提到这种情况的处理方法,首要的就是选出新leader,选出新leader后,可能上一任期还有一些entries并没有提交,处于uncommitted状态,该怎么办呢?处理方法是新leader只处理提交新任期的entries,上一任期未提交的entries,如果在新leader选举前已经被大多数节点记录在日志中,则新leader在提交最新entry时,之前处于未提交状态的entries也被committed了,因为如果两个日志包含了一条具有相同index和term的entry,那么这两个日志在这个index之前的所有entry都相同;如果在新leader选举前没有被大多数节点记录在日志中,则原有未提交的entries有可能被新leader的entries覆盖掉。
出现网络分区时怎么处理?

分布式系统中网络分区的情况基本无法避免,出现网络分区时,原有leader在分区的一侧,此时如果客户端发来指令,旧leader依旧在分区一测进行日志复制的过程,但因收不到大多数节点的确认,客户端所提交的指令entry只能记录在日志中,无法进行提交确认,处于uncommitted状态。而在分区的另一侧,此时收不到心跳信息,会进入选举流程重新选举一个leader,新leader负责分区零一侧的请求,进行日志复制等操作。因为新leader可以收到大多数follower确认,客户端的指令entry可以被提交,并更新节点状态,当网络分区恢复时,此时两个leader会收到彼此广播的心跳信息,此时,旧leader发现更大term的leader,旧leader转为follower,此时旧leader分区一侧的所有操作都要回滚,接受新leader的更新。
成员变更

在分布式系统中,节点数量或者说服务器数量不是一成不变的,我们有可能会随时增减节点数量,当增加节点时,有可能会出现两个leader选举成功的情况,主要是新旧配置不一致造成的,怎么处理呢?最简单粗暴的就是把目前所有节点都停掉,更新配置,再重启所有节点,但会造成一段时间服务不可用,很多情况下这是不能被允许的。raft的解决办法原论文中是联合共识(Joint Consensus)的办法,后来又提出了单节点变更(single-server changes)的方法。我们下面详细描述一下这个问题。

Raft要求,在任一任期内,只能有一个leader,而成员变更的麻烦就在于,成员变更时可能会出现两个leader,以一个例子说明:原系统有3个节点,成员为[1,2,3],现新增成员4、5。假设在成员变更时,1、2与3发生分区,此时,[1,2]为一组,1通过1、2两节点选举为leader,而5通过3、4、5选举为leader,就形成了2个leader并存的情况。

因为每个节点新旧配置更新的时间不同,造成了在某一时刻,可能会存在新旧配置的两个大多数情况的存在,上图中,旧配置的大多数是两个节点,而新配置的大多数是三个节点,在图中红线头的时刻存在两个大多数的情况,如果此时出现网络分区进行选举时就会出现两个leader的情况。

怎么解决呢?用什么办法才能不让上面两个大多少情况的出现呢?可通过单节点变更解决,即通过一次变更一个节点实现成员变更。主要思想是利用“一次变更一个节点,不会同时存在旧配置和新配置的两个大多数”的特性,实现成员变更。比如上面的情况,就可先将3节点集群[A,B,C]变更为4节点集群[A,B,C,D],再将4节点集群变更为5节点集群[A,B,C,D]。

为什么单节点变更不会造成两个大多数情况的出现呢?我们可以进行如下推理:假设原节点数为2n+1,则旧配置的大多数major_old=n+1,新加入1个节点,新配置节点数为2n+2,则新配置的大多数为major_new=n+2,同时存在两个大多数所需节点数目为major=major_old+major_new=n+1+n+2=2n+3>2n+2,也就是两个大多数所需节点数超出了节点总数,故不存在这种情况,如何是删除成员,其推理过程类似,结论相同。

具体的,我们依旧以这个3节点集群变更为5节点集群为例进行说明。假设现3节点集群[A,B,C],节点A为leader,配置为[A,B,C],我们先向集群加入节点D,新的配置为[A,B,C,D],成员变更通过以下两步实现:http://czjsc.cn/?article-39.html

第一步,leader节点A向新节点D同步数据;
第二步,leader将新配置[A,B,C,D]作为一个日志项复制到新配置中的所有节点(A,B,C,D)上,然后将新配置的日志项应用到本地状态机,完成单节点变更。

在变更后,现有集群的配置项就是[A,B,C,D],添加E节点也是同样的步骤。上面的描述如果理解的比较模糊的话,其实raft是采用将修改集群配置的命令放在日志条目中来处理的,其修改配置项,就是一条日志项,其流程与普通的日志项相同,只不过最后状态机执行的结果是配置变更。
日志压缩

日志压缩主要是为了解决无限增长的日志与有限的存贮空间的矛盾,可以想一个问题:对于已经committed的日志项,是否有必要一直保存下去?如果没有必要的话,是否可以对部分已committed的日志项删减或压缩呢?raft的主要的解决办法是采用快照进行日志压缩。

如上图所示,对于日志索引5之前的日志项可以删除,只保留一个快照(保存有当前状态以及一些任期索引号等元信息)即可。

具体工程实现时,一般每个节点独立打快照,当日志超过一定量会触发快照操作,具体实现以及更多细节待以后深究。
Client Protocol
http://data.travel.sina.com.cn/tags/%E6%9E%9C%E5%8D%9A%E4%B8%9C%E6%96%B9%E7%94%B5%E8%AF%9D%E5%BC%80%E6%88%B7_18183615678
raft共识算法真正工作时还需有一个客户端协议(client protocol),综合解决一些列的问题。比如会遇到下面这些问题:client怎么和集群交互呢?client如果知道leader节点的话,可以直接将command发给leader节点,如果不知道的话,可以随意发给集群中已知的节点,节点会将client的请求转给leader。其实上面还有个问题,client发送请求(或者command)给leader,但是leader迟迟不给回应怎么办?重试是一个办法。连接的leader崩溃了client怎么办?如果client超时重发command,怎么保证command不被状态机执行两次?client生成command的时候要给加上唯一ID,当server的日志中已存在相同command时会忽略。
附录

这里附加一张论文中的截图,里面详细讲明了不同节点需要维护什么信息,每个消息是怎么定义的,以及消息该如何处理等,不包含日志压缩以及成员变更部分:

这里补充一点,raft共识算法与pbft共识算法解决的是不同的问题,即raft节点不能存在恶意节点,节点消息可以延迟、丢失,但不能造假或作恶,即不能存在拜占庭节点。

本文对raft共识算法做了一个整体的梳理学习,可能会存在某些细节描述不清晰的地方,在真正工程代码实现时,还会存在更多的细节问题,同时,这里缺少证明为什么raft算法是正确的证明,有待今后更深一步理解共识算法后再行补充。

查看全文
如若内容造成侵权/违法违规/事实不符,请联系编程学习网邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!

相关文章

  1. unity官方内置网络unet的实例

    一、添加网络管理组件新创建一个网络管理器。该网络管理器将控制该项目的网络状态,包括游戏状态管理,生成点管理,场景管理,配对和允许访问相关信息。对于高级用户,可以从NetworkManager派生一个类来自定义组件的行为,扩展未涵盖的NetworkManager二、创建角色预制体:Netw…...

    2024/4/24 14:42:46
  2. 001 学习目标 第一期

    1) 一 、元素注册事件的两种方式添加事件两种方法:传统方法和监听注册方法1、传统 btn.onclick = function() {} 注册事件具有唯一性 ,一个元素智能处理一个函数 也就是最后一个会覆盖前面的。2 方法监听注册方式 : addEventListenereventTarfet.addEventListneer(type, …...

    2024/5/3 8:41:57
  3. 原来错的不是我而是这个世界

    这个世界病了 把渣当成荣耀, 把深情叫做舔狗, 把丧当成潮流, 把欲望当成理所当然!很喜欢的一部动漫 - 东京喰种所有人把喰种当成敌人 无差别屠杀,就好像它们生下来就有“罪” 何 “罪” 之有,站在人类的角度看喰种的世界是多么愚昧 作者刻画了 “喰种” 这种生物,在整部…...

    2024/5/3 4:01:28
  4. Vue性能优化方法

    文中例子来自https://www.youtube.com/watch?v=5B66qer8cZo 部分转载于链接:https://www.jianshu.com/p/f372d0e3de80函数型组件由于组件的生命周期处理在框架层面上十分耗时,所以,建议平常尽量使用函数型组件。这样,可以避免不必要的性能损失。只要在模板上声明functio…...

    2024/5/1 14:19:24
  5. 【比特币下跌】投资大师吉姆·罗杰斯(Jim Rogers):比特币的价值将降至零

    投资者吉姆罗杰斯(Jim Rogers)认为比特币仍处于泡沫之中,加密货币最终将变为零并消失。新闻 这位投资大师曾表示,比特币早在2017年就处于泡沫之中,他推测所有的加密货币最终都将消失。 在6月19日接受《朝日》杂志AERA dot采访时,投资者吉姆罗杰斯(Jim Rogers)表示,包括比特…...

    2024/4/24 14:42:42
  6. springboot基础入门篇

    基础入门:springboot入门课程导学第一关 创建和配置springboot项目1.1创建springboot项目1.2springboot项目maven文件配置第二关 springboot配置文件2.1 application文件2.2 pom文件第三关 使用注解的那些事3.1 基本注解介绍3.2 注解使用练习第四关 进阶之路,项目实战 课程导学…...

    2024/4/24 14:42:42
  7. (二)Redis数据类型,事务和Jedis操作Redis

    Redis五大基本类型 注:笔记整理来源 B站UP主狂神说Java官方文档:Redis 是一个开源(BSD许可)的,内存中的数据结构存储系统,它可以用作数据库、缓存和消息中间件。 它支持多种类型的数据结构,如 字符串(strings), 散列(hashes), 列表(lists), 集合(sets), 有序…...

    2024/5/2 22:38:26
  8. 世上最污技术解读,你这么说我就懂了,收藏!

    假设你是一位女性,你有一位男朋友,于此同时你和另外一位男生暧昧不清,比朋友好,又不是恋人。你随时可以甩了现任男友,另外一位马上就能补上。这是冷备份。 假设你是一位女性,同时和两位男性在交往,两位都是你男朋友。并且他们还互不干涉,独立运行。这就是双机热备份。 …...

    2024/4/24 14:42:40
  9. linux阿里云ecs发邮件

    参考文档:- [文档1]https://blog.csdn.net/ithomer/article/details/83744621 另外这篇文档实践讲解也很详细- [文档2]https://blog.csdn.net/yongren_z/article/details/85119088- [文档3]http://devgou.com/article/Linux-Email/#%E6%94%B6%E5%8F%91%E9%82%AE%E4%BB%B6%E6%B…...

    2024/4/24 14:42:41
  10. 百度飞桨世界冠军带你从零实践强化学习第五天(三岁白话时间)

    百度飞桨从零实践强化学习第五天连续动作空间上求解RL连续动作 vs 离散动作DDPGPARL DDPG的代码解析总结大作业问题1AssertionError: the action should be in range [-1.0, 1.0]问题2 类库安装失败评论区小编认为不错的东西,分享分享 这里是三岁,这个课程最后一节大课啦,时…...

    2024/4/24 14:42:37
  11. 常用聚类算法

    在直观印象中,说起聚类算法,首先想到的k-means. k-means作为经典的聚类算法,应用范围很广,但是在运行前要指定聚类的数量n,这个值对于最终的计算结果有很大的影响.而现在也没有通用的方法来得到这个值. 本文介绍了包括k-means在内的多种聚类算法,可以在实际中灵活使用. 聚类常用…...

    2024/4/18 16:37:30
  12. jquery操作hidden属性和disabled属性

    https://www.jb51.net/article/45262.htm 移除$(#rp_Remark).removeAttr("hidden");设置$(#rp_Remark).prop("hidden", "hidden");disabled和hidden一样操作...

    2024/4/20 10:36:08
  13. 任何时候你都需要知道这个原理!你不会把商品数据都放内存吧!

    “ 今天分享学习关于计算机存储。说到存储,会想到以前的光盘,u盘,大点的机械硬盘,到现在更加普遍使用的固态硬盘。这些也算是IO设备了,说到IO,不得不想起很多时候系统的瓶颈会出现的IO上。这一篇和大家分享存储器的层次结构1 我们不凡先看看这几个价格 “ 1990~2020随着硬…...

    2024/4/16 15:48:45
  14. 2-100之间的素数(质数) 和升序

    for(int i=2;i<=100;i++){ boolean x=false; //标识 用来记录最初的状态 for(int j=2;j<=i/2;j++){ if(i%j= =0){ System.out.println(i+“不是素数”); x=true; //状态改变 所以不是素数 break; } } if(!x){ //x==false 可以换成 !x 结果都是true System.out.…...

    2024/4/28 2:30:13
  15. PHPExcel读取时间日期

    1. PHPEXCEL读取值的方式 $phpexcel->getCell(B . $row)->getValue();2. PHPEXCEL读取 日期 的方式 遇到日期,取出来的值和原本excel文件中的值格式不一样,是一串数字。 比如,excel中格式为这个样子的:取出来又是这个样子:$time = date(Y-m-d,PHPExcel_Shared_Date::E…...

    2024/4/24 14:42:36
  16. springboot项目配置yml中数据源后报错Unknown database user_information(已解决)

    目录springboot项目配置yml中数据源后报错Unknown database user_information问题现象:问题分析:springboot项目配置yml中数据源后报错Unknown database user_information问题现象:今天在用.yml配置了springboot项目的Mysql数据源后,出现了无法访问数据库的问题:报错如下: Unkn…...

    2024/4/24 14:42:35
  17. uTools:mybatisLog参数格式化插件

    ...

    2024/4/24 14:42:34
  18. SpringBoot集成Shiro(二)验证用户角色

    SpringBoot集成Shiro(一)验证用户登录验证 SpringBoot集成Shiro(三)验证用户权限 SpringBoot集成Shiro(四)验证用户角色升级版Shiro 这个安全认证框架已经帮我们做了很多事情,在一般情况下,我们完全可以将它当做一个黑盒来使用。 在上一篇文章中,我们通过 Shiro 完成了…...

    2024/4/26 13:33:36
  19. linux操作命令记录

    将本地文件复制到远程机器scp -r /opt/module/azkaban/exec-server/ root@172.16.7.333:/opt/module/azkaban/在远程机器上创建文件夹(路径不存在就创建)ssh 172.16.7.41 mkdir -p /opt/module/azkaban/exec-server...

    2024/4/24 14:42:35
  20. MySQL安装失败,如何完全卸载MySQL

    MySQL安装失败,再安装时,必须将之前安装的全部卸载干净,在可以进行下次安装。eg: 下面是具体步骤: 第一步:先去控制面板中,将MySQL卸载第二步:到安装目录下,将MySQL文件夹永久删除。默认安装目录在C盘Program Files下,如果安装时修改了安装目录,就去修改的目录下找。…...

    2024/4/24 14:42:36

最新文章

  1. 文件传送协议

    壹、文件传输协议FTP 一、FTP简介 文件传送协议FTP曾是互联网上使用最广泛的协议&#xff1b; 在互联网发展的早期阶段&#xff0c;用FTP传送文件约占整个互联网的通信量的三分之一&#xff1b;知道1995年&#xff0c;www的通信量才首次超过FTP。 FTP实现的是通过网络实现异…...

    2024/5/3 11:26:23
  2. 梯度消失和梯度爆炸的一些处理方法

    在这里是记录一下梯度消失或梯度爆炸的一些处理技巧。全当学习总结了如有错误还请留言&#xff0c;在此感激不尽。 权重和梯度的更新公式如下&#xff1a; w w − η ⋅ ∇ w w w - \eta \cdot \nabla w ww−η⋅∇w 个人通俗的理解梯度消失就是网络模型在反向求导的时候出…...

    2024/3/20 10:50:27
  3. 第十二届蓝桥杯省赛真题(C/C++大学B组)

    目录 #A 空间 #B 卡片 #C 直线 #D 货物摆放 #E 路径 #F 时间显示 #G 砝码称重 #H 杨辉三角形 #I 双向排序 #J 括号序列 #A 空间 #include <bits/stdc.h> using namespace std;int main() {cout<<256 * 1024 * 1024 / 4<<endl;return 0; } #B 卡片…...

    2024/5/3 11:07:58
  4. audio_video_img图片音视频异步可视化加载

    最近在做即时消息&#xff0c;消息类型除了文字还有音频、视频、图片展示&#xff0c;如果消息很多&#xff0c;在切换聊天框时&#xff0c;会有明显卡顿&#xff0c;后续做了懒加载&#xff0c;方案是只加载用户能看到的资源&#xff0c;看不到的先不加载&#xff1b; LazyAud…...

    2024/5/2 22:59:28
  5. 【外汇早评】美通胀数据走低,美元调整

    原标题:【外汇早评】美通胀数据走低,美元调整昨日美国方面公布了新一期的核心PCE物价指数数据,同比增长1.6%,低于前值和预期值的1.7%,距离美联储的通胀目标2%继续走低,通胀压力较低,且此前美国一季度GDP初值中的消费部分下滑明显,因此市场对美联储后续更可能降息的政策…...

    2024/5/1 17:30:59
  6. 【原油贵金属周评】原油多头拥挤,价格调整

    原标题:【原油贵金属周评】原油多头拥挤,价格调整本周国际劳动节,我们喜迎四天假期,但是整个金融市场确实流动性充沛,大事频发,各个商品波动剧烈。美国方面,在本周四凌晨公布5月份的利率决议和新闻发布会,维持联邦基金利率在2.25%-2.50%不变,符合市场预期。同时美联储…...

    2024/5/2 16:16:39
  7. 【外汇周评】靓丽非农不及疲软通胀影响

    原标题:【外汇周评】靓丽非农不及疲软通胀影响在刚结束的周五,美国方面公布了新一期的非农就业数据,大幅好于前值和预期,新增就业重新回到20万以上。具体数据: 美国4月非农就业人口变动 26.3万人,预期 19万人,前值 19.6万人。 美国4月失业率 3.6%,预期 3.8%,前值 3…...

    2024/4/29 2:29:43
  8. 【原油贵金属早评】库存继续增加,油价收跌

    原标题:【原油贵金属早评】库存继续增加,油价收跌周三清晨公布美国当周API原油库存数据,上周原油库存增加281万桶至4.692亿桶,增幅超过预期的74.4万桶。且有消息人士称,沙特阿美据悉将于6月向亚洲炼油厂额外出售更多原油,印度炼油商预计将每日获得至多20万桶的额外原油供…...

    2024/5/2 9:28:15
  9. 【外汇早评】日本央行会议纪要不改日元强势

    原标题:【外汇早评】日本央行会议纪要不改日元强势近两日日元大幅走强与近期市场风险情绪上升,避险资金回流日元有关,也与前一段时间的美日贸易谈判给日本缓冲期,日本方面对汇率问题也避免继续贬值有关。虽然今日早间日本央行公布的利率会议纪要仍然是支持宽松政策,但这符…...

    2024/4/27 17:58:04
  10. 【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响

    原标题:【原油贵金属早评】欧佩克稳定市场,填补伊朗问题的影响近日伊朗局势升温,导致市场担忧影响原油供给,油价试图反弹。此时OPEC表态稳定市场。据消息人士透露,沙特6月石油出口料将低于700万桶/日,沙特已经收到石油消费国提出的6月份扩大出口的“适度要求”,沙特将满…...

    2024/4/27 14:22:49
  11. 【外汇早评】美欲与伊朗重谈协议

    原标题:【外汇早评】美欲与伊朗重谈协议美国对伊朗的制裁遭到伊朗的抗议,昨日伊朗方面提出将部分退出伊核协议。而此行为又遭到欧洲方面对伊朗的谴责和警告,伊朗外长昨日回应称,欧洲国家履行它们的义务,伊核协议就能保证存续。据传闻伊朗的导弹已经对准了以色列和美国的航…...

    2024/4/28 1:28:33
  12. 【原油贵金属早评】波动率飙升,市场情绪动荡

    原标题:【原油贵金属早评】波动率飙升,市场情绪动荡因中美贸易谈判不安情绪影响,金融市场各资产品种出现明显的波动。随着美国与中方开启第十一轮谈判之际,美国按照既定计划向中国2000亿商品征收25%的关税,市场情绪有所平复,已经开始接受这一事实。虽然波动率-恐慌指数VI…...

    2024/4/30 9:43:09
  13. 【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试

    原标题:【原油贵金属周评】伊朗局势升温,黄金多头跃跃欲试美国和伊朗的局势继续升温,市场风险情绪上升,避险黄金有向上突破阻力的迹象。原油方面稍显平稳,近期美国和OPEC加大供给及市场需求回落的影响,伊朗局势并未推升油价走强。近期中美贸易谈判摩擦再度升级,美国对中…...

    2024/4/27 17:59:30
  14. 【原油贵金属早评】市场情绪继续恶化,黄金上破

    原标题:【原油贵金属早评】市场情绪继续恶化,黄金上破周初中国针对于美国加征关税的进行的反制措施引发市场情绪的大幅波动,人民币汇率出现大幅的贬值动能,金融市场受到非常明显的冲击。尤其是波动率起来之后,对于股市的表现尤其不安。隔夜美国股市出现明显的下行走势,这…...

    2024/5/2 15:04:34
  15. 【外汇早评】美伊僵持,风险情绪继续升温

    原标题:【外汇早评】美伊僵持,风险情绪继续升温昨日沙特两艘油轮再次发生爆炸事件,导致波斯湾局势进一步恶化,市场担忧美伊可能会出现摩擦生火,避险品种获得支撑,黄金和日元大幅走强。美指受中美贸易问题影响而在低位震荡。继5月12日,四艘商船在阿联酋领海附近的阿曼湾、…...

    2024/4/28 1:34:08
  16. 【原油贵金属早评】贸易冲突导致需求低迷,油价弱势

    原标题:【原油贵金属早评】贸易冲突导致需求低迷,油价弱势近日虽然伊朗局势升温,中东地区几起油船被袭击事件影响,但油价并未走高,而是出于调整结构中。由于市场预期局势失控的可能性较低,而中美贸易问题导致的全球经济衰退风险更大,需求会持续低迷,因此油价调整压力较…...

    2024/4/26 19:03:37
  17. 氧生福地 玩美北湖(上)——为时光守候两千年

    原标题:氧生福地 玩美北湖(上)——为时光守候两千年一次说走就走的旅行,只有一张高铁票的距离~ 所以,湖南郴州,我来了~ 从广州南站出发,一个半小时就到达郴州西站了。在动车上,同时改票的南风兄和我居然被分到了一个车厢,所以一路非常愉快地聊了过来。 挺好,最起…...

    2024/4/29 20:46:55
  18. 氧生福地 玩美北湖(中)——永春梯田里的美与鲜

    原标题:氧生福地 玩美北湖(中)——永春梯田里的美与鲜一觉醒来,因为大家太爱“美”照,在柳毅山庄去寻找龙女而错过了早餐时间。近十点,向导坏坏还是带着饥肠辘辘的我们去吃郴州最富有盛名的“鱼头粉”。说这是“十二分推荐”,到郴州必吃的美食之一。 哇塞!那个味美香甜…...

    2024/4/30 22:21:04
  19. 氧生福地 玩美北湖(下)——奔跑吧骚年!

    原标题:氧生福地 玩美北湖(下)——奔跑吧骚年!让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 让我们红尘做伴 活得潇潇洒洒 策马奔腾共享人世繁华 对酒当歌唱出心中喜悦 轰轰烈烈把握青春年华 啊……啊……啊 两…...

    2024/5/1 4:32:01
  20. 扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!

    原标题:扒开伪装医用面膜,翻六倍价格宰客,小姐姐注意了!扒开伪装医用面膜,翻六倍价格宰客!当行业里的某一品项火爆了,就会有很多商家蹭热度,装逼忽悠,最近火爆朋友圈的医用面膜,被沾上了污点,到底怎么回事呢? “比普通面膜安全、效果好!痘痘、痘印、敏感肌都能用…...

    2024/4/27 23:24:42
  21. 「发现」铁皮石斛仙草之神奇功效用于医用面膜

    原标题:「发现」铁皮石斛仙草之神奇功效用于医用面膜丽彦妆铁皮石斛医用面膜|石斛多糖无菌修护补水贴19大优势: 1、铁皮石斛:自唐宋以来,一直被列为皇室贡品,铁皮石斛生于海拔1600米的悬崖峭壁之上,繁殖力差,产量极低,所以古代仅供皇室、贵族享用 2、铁皮石斛自古民间…...

    2024/4/28 5:48:52
  22. 丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者

    原标题:丽彦妆\医用面膜\冷敷贴轻奢医学护肤引导者【公司简介】 广州华彬企业隶属香港华彬集团有限公司,专注美业21年,其旗下品牌: 「圣茵美」私密荷尔蒙抗衰,产后修复 「圣仪轩」私密荷尔蒙抗衰,产后修复 「花茵莳」私密荷尔蒙抗衰,产后修复 「丽彦妆」专注医学护…...

    2024/4/30 9:42:22
  23. 广州械字号面膜生产厂家OEM/ODM4项须知!

    原标题:广州械字号面膜生产厂家OEM/ODM4项须知!广州械字号面膜生产厂家OEM/ODM流程及注意事项解读: 械字号医用面膜,其实在我国并没有严格的定义,通常我们说的医美面膜指的应该是一种「医用敷料」,也就是说,医用面膜其实算作「医疗器械」的一种,又称「医用冷敷贴」。 …...

    2024/5/2 9:07:46
  24. 械字号医用眼膜缓解用眼过度到底有无作用?

    原标题:械字号医用眼膜缓解用眼过度到底有无作用?医用眼膜/械字号眼膜/医用冷敷眼贴 凝胶层为亲水高分子材料,含70%以上的水分。体表皮肤温度传导到本产品的凝胶层,热量被凝胶内水分子吸收,通过水分的蒸发带走大量的热量,可迅速地降低体表皮肤局部温度,减轻局部皮肤的灼…...

    2024/4/30 9:42:49
  25. 配置失败还原请勿关闭计算机,电脑开机屏幕上面显示,配置失败还原更改 请勿关闭计算机 开不了机 这个问题怎么办...

    解析如下&#xff1a;1、长按电脑电源键直至关机&#xff0c;然后再按一次电源健重启电脑&#xff0c;按F8健进入安全模式2、安全模式下进入Windows系统桌面后&#xff0c;按住“winR”打开运行窗口&#xff0c;输入“services.msc”打开服务设置3、在服务界面&#xff0c;选中…...

    2022/11/19 21:17:18
  26. 错误使用 reshape要执行 RESHAPE,请勿更改元素数目。

    %读入6幅图像&#xff08;每一幅图像的大小是564*564&#xff09; f1 imread(WashingtonDC_Band1_564.tif); subplot(3,2,1),imshow(f1); f2 imread(WashingtonDC_Band2_564.tif); subplot(3,2,2),imshow(f2); f3 imread(WashingtonDC_Band3_564.tif); subplot(3,2,3),imsho…...

    2022/11/19 21:17:16
  27. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机...

    win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”问题的解决方法在win7系统关机时如果有升级系统的或者其他需要会直接进入一个 等待界面&#xff0c;在等待界面中我们需要等待操作结束才能关机&#xff0c;虽然这比较麻烦&#xff0c;但是对系统进行配置和升级…...

    2022/11/19 21:17:15
  28. 台式电脑显示配置100%请勿关闭计算机,“准备配置windows 请勿关闭计算机”的解决方法...

    有不少用户在重装Win7系统或更新系统后会遇到“准备配置windows&#xff0c;请勿关闭计算机”的提示&#xff0c;要过很久才能进入系统&#xff0c;有的用户甚至几个小时也无法进入&#xff0c;下面就教大家这个问题的解决方法。第一种方法&#xff1a;我们首先在左下角的“开始…...

    2022/11/19 21:17:14
  29. win7 正在配置 请勿关闭计算机,怎么办Win7开机显示正在配置Windows Update请勿关机...

    置信有很多用户都跟小编一样遇到过这样的问题&#xff0c;电脑时发现开机屏幕显现“正在配置Windows Update&#xff0c;请勿关机”(如下图所示)&#xff0c;而且还需求等大约5分钟才干进入系统。这是怎样回事呢&#xff1f;一切都是正常操作的&#xff0c;为什么开时机呈现“正…...

    2022/11/19 21:17:13
  30. 准备配置windows 请勿关闭计算机 蓝屏,Win7开机总是出现提示“配置Windows请勿关机”...

    Win7系统开机启动时总是出现“配置Windows请勿关机”的提示&#xff0c;没过几秒后电脑自动重启&#xff0c;每次开机都这样无法进入系统&#xff0c;此时碰到这种现象的用户就可以使用以下5种方法解决问题。方法一&#xff1a;开机按下F8&#xff0c;在出现的Windows高级启动选…...

    2022/11/19 21:17:12
  31. 准备windows请勿关闭计算机要多久,windows10系统提示正在准备windows请勿关闭计算机怎么办...

    有不少windows10系统用户反映说碰到这样一个情况&#xff0c;就是电脑提示正在准备windows请勿关闭计算机&#xff0c;碰到这样的问题该怎么解决呢&#xff0c;现在小编就给大家分享一下windows10系统提示正在准备windows请勿关闭计算机的具体第一种方法&#xff1a;1、2、依次…...

    2022/11/19 21:17:11
  32. 配置 已完成 请勿关闭计算机,win7系统关机提示“配置Windows Update已完成30%请勿关闭计算机”的解决方法...

    今天和大家分享一下win7系统重装了Win7旗舰版系统后&#xff0c;每次关机的时候桌面上都会显示一个“配置Windows Update的界面&#xff0c;提示请勿关闭计算机”&#xff0c;每次停留好几分钟才能正常关机&#xff0c;导致什么情况引起的呢&#xff1f;出现配置Windows Update…...

    2022/11/19 21:17:10
  33. 电脑桌面一直是清理请关闭计算机,windows7一直卡在清理 请勿关闭计算机-win7清理请勿关机,win7配置更新35%不动...

    只能是等着&#xff0c;别无他法。说是卡着如果你看硬盘灯应该在读写。如果从 Win 10 无法正常回滚&#xff0c;只能是考虑备份数据后重装系统了。解决来方案一&#xff1a;管理员运行cmd&#xff1a;net stop WuAuServcd %windir%ren SoftwareDistribution SDoldnet start WuA…...

    2022/11/19 21:17:09
  34. 计算机配置更新不起,电脑提示“配置Windows Update请勿关闭计算机”怎么办?

    原标题&#xff1a;电脑提示“配置Windows Update请勿关闭计算机”怎么办&#xff1f;win7系统中在开机与关闭的时候总是显示“配置windows update请勿关闭计算机”相信有不少朋友都曾遇到过一次两次还能忍但经常遇到就叫人感到心烦了遇到这种问题怎么办呢&#xff1f;一般的方…...

    2022/11/19 21:17:08
  35. 计算机正在配置无法关机,关机提示 windows7 正在配置windows 请勿关闭计算机 ,然后等了一晚上也没有关掉。现在电脑无法正常关机...

    关机提示 windows7 正在配置windows 请勿关闭计算机 &#xff0c;然后等了一晚上也没有关掉。现在电脑无法正常关机以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;关机提示 windows7 正在配…...

    2022/11/19 21:17:05
  36. 钉钉提示请勿通过开发者调试模式_钉钉请勿通过开发者调试模式是真的吗好不好用...

    钉钉请勿通过开发者调试模式是真的吗好不好用 更新时间:2020-04-20 22:24:19 浏览次数:729次 区域: 南阳 > 卧龙 列举网提醒您:为保障您的权益,请不要提前支付任何费用! 虚拟位置外设器!!轨迹模拟&虚拟位置外设神器 专业用于:钉钉,外勤365,红圈通,企业微信和…...

    2022/11/19 21:17:05
  37. 配置失败还原请勿关闭计算机怎么办,win7系统出现“配置windows update失败 还原更改 请勿关闭计算机”,长时间没反应,无法进入系统的解决方案...

    前几天班里有位学生电脑(windows 7系统)出问题了&#xff0c;具体表现是开机时一直停留在“配置windows update失败 还原更改 请勿关闭计算机”这个界面&#xff0c;长时间没反应&#xff0c;无法进入系统。这个问题原来帮其他同学也解决过&#xff0c;网上搜了不少资料&#x…...

    2022/11/19 21:17:04
  38. 一个电脑无法关闭计算机你应该怎么办,电脑显示“清理请勿关闭计算机”怎么办?...

    本文为你提供了3个有效解决电脑显示“清理请勿关闭计算机”问题的方法&#xff0c;并在最后教给你1种保护系统安全的好方法&#xff0c;一起来看看&#xff01;电脑出现“清理请勿关闭计算机”在Windows 7(SP1)和Windows Server 2008 R2 SP1中&#xff0c;添加了1个新功能在“磁…...

    2022/11/19 21:17:03
  39. 请勿关闭计算机还原更改要多久,电脑显示:配置windows更新失败,正在还原更改,请勿关闭计算机怎么办...

    许多用户在长期不使用电脑的时候&#xff0c;开启电脑发现电脑显示&#xff1a;配置windows更新失败&#xff0c;正在还原更改&#xff0c;请勿关闭计算机。。.这要怎么办呢&#xff1f;下面小编就带着大家一起看看吧&#xff01;如果能够正常进入系统&#xff0c;建议您暂时移…...

    2022/11/19 21:17:02
  40. 还原更改请勿关闭计算机 要多久,配置windows update失败 还原更改 请勿关闭计算机,电脑开机后一直显示以...

    配置windows update失败 还原更改 请勿关闭计算机&#xff0c;电脑开机后一直显示以以下文字资料是由(历史新知网www.lishixinzhi.com)小编为大家搜集整理后发布的内容&#xff0c;让我们赶快一起来看一下吧&#xff01;配置windows update失败 还原更改 请勿关闭计算机&#x…...

    2022/11/19 21:17:01
  41. 电脑配置中请勿关闭计算机怎么办,准备配置windows请勿关闭计算机一直显示怎么办【图解】...

    不知道大家有没有遇到过这样的一个问题&#xff0c;就是我们的win7系统在关机的时候&#xff0c;总是喜欢显示“准备配置windows&#xff0c;请勿关机”这样的一个页面&#xff0c;没有什么大碍&#xff0c;但是如果一直等着的话就要两个小时甚至更久都关不了机&#xff0c;非常…...

    2022/11/19 21:17:00
  42. 正在准备配置请勿关闭计算机,正在准备配置windows请勿关闭计算机时间长了解决教程...

    当电脑出现正在准备配置windows请勿关闭计算机时&#xff0c;一般是您正对windows进行升级&#xff0c;但是这个要是长时间没有反应&#xff0c;我们不能再傻等下去了。可能是电脑出了别的问题了&#xff0c;来看看教程的说法。正在准备配置windows请勿关闭计算机时间长了方法一…...

    2022/11/19 21:16:59
  43. 配置失败还原请勿关闭计算机,配置Windows Update失败,还原更改请勿关闭计算机...

    我们使用电脑的过程中有时会遇到这种情况&#xff0c;当我们打开电脑之后&#xff0c;发现一直停留在一个界面&#xff1a;“配置Windows Update失败&#xff0c;还原更改请勿关闭计算机”&#xff0c;等了许久还是无法进入系统。如果我们遇到此类问题应该如何解决呢&#xff0…...

    2022/11/19 21:16:58
  44. 如何在iPhone上关闭“请勿打扰”

    Apple’s “Do Not Disturb While Driving” is a potentially lifesaving iPhone feature, but it doesn’t always turn on automatically at the appropriate time. For example, you might be a passenger in a moving car, but your iPhone may think you’re the one dri…...

    2022/11/19 21:16:57