MIT 6.5840 Raft Implementation(2A, Leader Election)
Raft实现思路+细节
2A
任务分解
总体来说,2A中主要的任务就是选出领导人,在选出领导人的时候,我们要遵循下图。
在2A中,由于并没有出现日志复制,所以我们只需要考察两者的任期是否相等,以及接收者在本轮任期中有没有投票即可。
因而我们可以这样地给出2A中的实现内容:
完善
GetState()函数,这样才能让评测机知道我们选出了Leader完善Raft结构体(见论文上的State)
完善
RequestVote()函数,按照上图中的逻辑完善
Make()函数,对成员进行初始化完善
ticker()和MakeElection()函数,在没有收到领导人信息的时候开始选举初步写出heartbeat相关功能(只需要在接收时变成跟随者即可)
实现细节
关于Raft结构体,基本上需要参考论文上的State即可。
我在这里多加了一个safe状态(表示作为跟随者在这个周期内有没有收到领导人的信息,在收到RPC时置为
true,在ticker()初始化和变成跟随者时变成false,若ticker()检查时为false,则直接开始选举),这样就模拟了发动选举的过程。(credit to @Vargvain )关于
RequestVote()函数,在2A阶段我们先判断任期的大小关系,如果候选人更大,那就让接收者先同步任期,并变成追随者;如果接收者更大,就直接返回false。如果相等,那么就看是否已经投过票,如果投过,返回false,反之返回true。在这里,我建议封装好
toCandidate(), toFollower(), toLeader()这几个函数,这样可以减少代码复用,而且用到的也确实挺多的。关于
Make()函数,我们暂时只要给不同变量赋上初始值。关于
ticker()函数。首先要做的是调整ElectionTimeout,论文中有提到heartbeatInterval << ElectionTimeout,并且通过分析可以发现ElectionTimeout中随机值上界不超过下界的两倍,我选择ElectionTimeout = 400 + (rand.Int63() % 400)。接下来就是看是否是一个not safe的跟随者,如果是这样,那就开始选举(一个Go程)。选举函数基本是2A中最大的难点。首先,我们需要给
RequestVoteArgs赋好初始值,然后就对于每一个peer(当然,peerId != rf.me),处理RequestVoteReply,如果回复的任期更高,那就变成Follower,反之,统计票数,如果超过半数,就变成领导人。关于heartbeat,只需要依照
RequestVoteRPC的格式完成基本的AppendEntriesRPC,并在变成领导人时给每个人发就行。
注意事项
关于锁的一些小建议(credit to @lauyeeyu)
- 尽量缩短 Lock() 和 Unlock() 之间的长度(更细的控制)
- 在Sleep或者耗时间的操作中不要持有锁,会占用进程,或导致死锁
- 小心控制流语句 (continue, break, return) 可能会跳过你写的 Unlock()
- 读写变量前别忘了上锁
- 必要时(为了缩短上锁区域的长度)可以变量先读到临时变量,然后就可以解锁了,之后读取可以使用临时变量(但是要小心数据修改可能的隐患)
关于并发
- 有必要再去了解一下并发进行的形式和原理
对于这种情况,如果里面不用_peerId会出问题,因为在新开的Go程进行到某一阶段时可能peerId已经发生了变化。
关于测试
总时长情况大概如下图:
关于每一个测试后面的四个数字意义,见MIT课程页面
MIT 6.5840 Raft Implementation(2A, Leader Election)的更多相关文章
- ZooKeeper leader election
Paxos是分布式应用中解决同步问题的核心.作为应用研发工程师,我们总是倾向于使用一种相对简洁的方式实现复杂的算法.ZooKeeper leader election实现就是一个非常好的参考. 其实现 ...
- Kafka配置项unclean.leader.election.enable造成consumer出现offset重置现象
消费端出现offset重置为latest, earliest现象,类似log: (org.apache.kafka.clients.consumer.internals.Fetcher.handleF ...
- Leader Election 选举算法
今天讲一讲分布式系统中必不可少的选举算法. leader 就是一堆服务器中的协调者,某一个时刻只能有一个leader且所有服务器都承认这个leader. leader election就是在一组进程中 ...
- Leader Election
Leader Election Zookeeper的基本操作 Zookeeper虽然是分布式系统,但它并不是为文件存储而设计的,Zookeeper里存储的一般是配置信息和源信息.实际上,Zookeep ...
- Kafka学习笔记(4)----Kafka的Leader Election
1. Zookeeper的基本操作 zookeeper中的节点可以持久化/有序的两个维度分为四种类型: PERSIST:持久化无序(保存在磁盘中) PERSIST_SEQUENTIAL:持久化有序递增 ...
- Zookeeper 学习笔记之 Leader Election
ZooKeeper四种节点类型: Persist Persist_Sequential Ephemeral Ephemeral_Sequential 在节点上可注册的Watch,客户端先得到通知再得到 ...
- MIT 6.824 Lab2A Raft之领导者选举
实验准备 实验代码:git://g.csail.mit.edu/6.824-golabs-2021/src/raft 如何测试:go test -run 2A -race 相关论文:Raft Exte ...
- Raft
http://thesecretlivesofdata.com/raft/ https://github.com/coreos/etcd 1 Introduction Consensus algo ...
- Raft翻译
英文原文:https://web.stanford.edu/~ouster/cgi-bin/papers/raft-atc14 In Search of an Understandable Conse ...
- Raft与MongoDB复制集协议比较
在一文搞懂raft算法一文中,从raft论文出发,详细介绍了raft的工作流程以及对特殊情况的处理.但算法.协议这种偏抽象的东西,仅仅看论文还是比较难以掌握的,需要看看在工业界的具体实现.本文关注Mo ...
随机推荐
- GDOU-CTF-2023新生赛Pwn题解与反思
第一次参加CTF新生赛总结与反思 因为昨天学校那边要进行天梯模拟赛,所以被拉过去了.16点30分结束,就跑回来宿舍开始写.第一题和第二题一下子getshell,不用30分钟,可能我没想那么多,对比网上 ...
- 《爆肝整理》保姆级系列教程-玩转Charles抓包神器教程(14)-Charles过滤网络请求
1.简介 在日常工作测试中,经常要抓包看请求的request,response是不是传的对,返回的字段值对不对,众多的请求中看得眼花缭乱,如何找到自己想要的请求,那么我们就需要过滤请求.Charles ...
- 解决Kibana(OpenSearch)某些字段无法搜索问题
背景 最近在OpenSearch查看线上日志的时候,发现某个索引下有些字段无法直接在界面上筛选,搜索到也不高亮,非常的不方便,就像下面这样 字段左侧两个筛选按钮禁用了无法点击,提示 Unindexed ...
- Unity开发Hololens2—交互发布配置
Unity开发Hololens2-交互发布配置 环境配置 unity2021.3.15f visual studio 2019 pro MRTK 2.8.3 OpenXR 1.8.0 Hololens ...
- 搭建一个简易框架 3秒创建一个WebApi接口
前端ajax请求数据,传递的参数都是一个json字符串,经过多次解析发现其实都是一个DataSet {"selectA1":[{"Name":"156 ...
- Prism Sample 13-IActiveAwareCommands
本例和12的唯一区别,仅仅是在ViewModel中增加了一个IActiveAware,这决定了只有在Acitve状态的视图中才会执行自己ViewModel中的命令.
- 🚀 jdbc-plus是一款基于JdbcTemplate增强工具包, 已实现分页、多租户、动态表名等插件,可与mybatis、mybatis-plus等混合使用
jdbc-plus简介 jdbc-plus是一款基于JdbcTemplate增强工具包, 基于JdbcTemplate已实现分页.多租户.动态表名等插件,可自定义扩展插件,可与mybatis.myba ...
- 2022-12-11:行程和用户。以下为输出结果,请问sql语句如何写? +------------+-------------------+ | Day | Cancellation
2022-12-11:行程和用户.以下为输出结果,请问sql语句如何写? ±-----------±------------------+ | Day | Cancellation Rate | ±- ...
- 使用weexplus + vue开发APP的填坑之旅
最近需要撸一个app来满足用户的需求,找来找去发现flutter不错,决定用它但是时间不够(准备挤出时间再去研究flutter),进度又催得紧,最后决定选weex这个上手快些,说干就干打开官网跟着ap ...
- vscode 注释快捷键 一键注释和取消注释快捷键
// 注释:ctrl+/ /**/ 注释:alt+shift+a