自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(11)
  • 资源 (2)
  • 收藏
  • 关注

原创 实现拜占庭容错的Raft算法-总结

n个节点中存在f个拜占庭节点, 选举和日志提交需要quorum个节点的确认(n-f)/2 -f>f 半数以上的正常节点的共识不会被f个拜占庭节点推翻得出n=5f+1. quorum=3f+1共识结点, 客户端, 互相持有对方公钥。

2024-04-28 23:28:36 755 1

原创 实现拜占庭容错的Raft算法-防篡改

如果Follower在添加日志时进行篡改, 对BRaft的安全性无影响, 因为剩下的节点依然能够达成共识, 而篡改了日志的Follower将不具备成为Leader的能力。BRaft中任意节点需要给返回客户端的响应进行数字签名, 客户端持有所有节点的公钥, 它负责校验所有响应确保响应的消息未被篡改且每个节点只响应一次。恶意Leader节点可以拒绝客户端请求, 因此BRaft的客户端交互不再仅依赖Leader, 而是需要所有参与共识的节点参与;4 如果客户端收到f+1个一致的响应, 则将其视为正确的响应。

2024-04-28 23:12:38 198

原创 实现拜占庭容错的Raft算法-日志分发2

在AppendEntries中, 移除原本Follower根据Leader的CommitIndex更新自己提交记录的逻辑, 在AppendEntriesCommit中根据map记录的日志接收数量判断是否已在集群内达成共识。在日志分发1中, 构造了AppendEntries和AppendEntriesCommit的基本逻辑, 还有一些细节需要调整。移除Leader更新CommitIndex的代码, 采用和Follower一样的更新方式。增加一行applyCond.signal, 通知日志应用状态机。

2024-04-27 23:11:36 123

原创 实现拜占庭容错的Raft算法-日志分发1

BRaft中Follower不能直接相信Leader的CommitIndex, 因此需要在Leader完成追加后发送一条AppendEntriesCommit广播, 告知其他节点某日志已被我添加记录到map, 当一条日志确实已被多数节点添加, 根据map记录推进CommitIndex的更新, 这对于Leader来说也一样, 因为不能相信Follower确实添加了日志, 也就不能直接更新CommitIndex。增加了一轮广播后On^2复杂度, 性能大幅下降, PartB原本的一些测试会无法通过。

2024-04-27 03:58:31 447

原创 实现拜占庭容错的Raft算法-领导选举部分

先发起一次PreRequestVote, Follower响应自身最新的已提交日志Term, Index作为验证要求, 然后Leader发送RequestVote, 其中带上自己算出来的要求日志hash签名, Follower校验后进行投票。新增预投票RPC调用, Follower响应自身持有的最新日志Term和Index, Leader据此找出该日志项进行哈希签名返回给Follower, 包含在RequestVote请求中。领导选举部分需要防范的是, 候选人是拜占庭节点,伪造持有最新的日志骗取选票。

2024-04-25 22:40:31 259

原创 MIT 6.5840Raft 总览

选举流程就是向其他所有Peer发送Request Vote RPC请求,看是否获得半数以上选票当选,这个过程需要为每个RPC请求启动一个goroutine,因为耗时不确定,请求可能堵塞或丢失。日志同步和领导选举工作流的生命周期不同,领导选举工作流会持续在整个raft实例的存活周期中,而日志同步工作流只会持续它当选为领导的任期term中,如果再次当选,启动的是一个新的工作流。领导选举的超时间隔是在一个小范围内随机的,而日志同步的超时间隔是固定的。PartB 日志同步,完善领导选举。1 领导选举,时钟触发。

2024-02-13 08:19:59 372

原创 Golang并发基础

锁的保护范围即锁要保护的共享变量集,锁的范围越大性能越差,因此用锁的基本策略是渐进式加锁,对一个类来说,先用一把大锁保护所有共享字段,确保逻辑正确后,再逐步减低锁粒度。Raft中,发送RequestVote,AppendEntries RPC请求前,本机读写文件前,向Apply Channel发送数据时,要及时释放锁。raft中整个类使用一把锁保护起来,编码时,将所有需要保护的字段置于锁后,如果一个函数需要持有锁才能调用,应在其名称中加上Locked(规范)轻量级线程,称为协程;

2024-02-13 08:17:39 487

原创

解决maven控制台输出乱码https://blog.csdn.net/weixin_42443070/article/details/88085762创建空mavenhttps://blog.csdn.net/wfy2695766757/article/details/81189291本机+idea配置tomcathttps://www.jianshu.com/p/3c75f7fd2f90解决tomcat 404https://blog.csdn.net/hupixiong/article/

2020-07-28 22:29:46 84

原创 动态规划1 斐波那契 路径取舍

递归模板public void recur (int level,int param){//终止逻辑 if(level>MAX_LEVEL){ return; } //处理本层 process(level,param); //递归 recur(level+1,newParam);}动态规划与递归分治没有本质区别(看有无最优子结构)找到重复子问题,动态规划可以淘汰中途次优解leetcode 509public .

2020-06-23 20:37:19 99

原创 Struts 框架基础

Struts 是 Apache 软件基金会(ASF)赞助的一个开源项目。它最初是 Jakarta 项目中的一个子项目,并在 2004 年 3 月成为 ASF 的顶级项目。它实现了基于 Java EE Web 应用的 Model-View-Controller(MVC)设计模式的应用框架,其采用的主要技术是 Java Servlet、JSP 以及 Custom Tag Library 等技术,是 MVC 经典设计模式中的一个经典产品。 Struts2 是非侵入式设计,即不依赖于 Servle...

2020-06-23 16:24:35 220

原创 java 函数式编程

Lambda 表达式是在 Java 8 中引入的,并且成为了 Java 8 最大的特点。它使得功能性编程变得非常便利,极大地简化了开发工作。否则代码可读性差语法一个 Lambda 表达式具有下面这样的语法特征。它由三个部分组成:第一部分为一个括号内用逗号分隔的参数列表,参数即函数式接口里面方法的参数;第二部分为一个箭头符号:->;第三部分为方法体,可以是表达式和代码块。语法如下:parameter -> expression body下面列举了 Lambda 表..

2020-06-23 13:32:16 121

博客文章《完成端口详解》配套代码

这份代码是我博客里的文章《完成端口详解 - 手把手教你玩转网络编程系列之三》的配套代码 里面的代码包括VC++2008/VC++2010编写的完成端口服务器端的代码,还包括一个对服务器端进行压力测试的客户端,都是经过我精心调试过,并且带有非常详尽的代码注释的。当然,作为教学代码,为了能够使得代码结构清晰明了,我还是对代码有所简化,如果想要用于产品开发,最好还是需要自己再完善一下 详情请参见我的博客 http://blog.csdn.net/piggyxp

2018-12-28

jsp公交查询系统源码(java开发)

公交查询系统 java公交查询系统 jsp公交查询系统源码(java开发)

2018-12-28

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除