Raft在etcd中的实现(三)选举流程

2018-04-07

Raft中的选举流程

Raft中使用心跳机制来出发leader选举。当服务器启动的时候,服务器成为follower。只要follower从leader或者candidate收到有效的RPCs就会保持follower状态。如果follower在一段时间内(该段时间被称为election timeout)没有收到消息,则它会假设当前没有可用的leader,然后开启选举新leader的流程。流程如下:

Read More

Raft在etcd中的实现(二)节点发送消息和接收消息流程

2018-04-02

发送消息流程

raft中节点发送消息的流程.png

流程简介

上图是raft中发送消息的流程。大致分为以下的过程。

  1. 由raftexample/raft.go部分发起。前文提到过该部分主要是为应用层提供服务。
  2. 经由raft/node.go部分转发到共识模块。前文提到过该部分主要起到应用层和共识模块的衔接作用。
  3. 共识模块raft/raft.go,对消息进行处理后,将消息append到msgs。注意共识模块自身不管是如何将消息通过通讯传输到其他节点的。这边只是放入到msgs中。
  4. raft/node.go部分监测到msgs中有内容了。使用newReady生成一个一个新的ready对象,并发送给readyc通道。
  5. raftexample/raft.go中,监测到readyc通道有内容之后,会进行写wal日志,增加Storage日志条目,判断是否需要打快照等动作。最后通过transoport组件,经http协议将消息发送给对应的节点。

    代码详解

  6. 消息的发起部分。raft中有3类RPC,分别为AppendEntries RPCs,RequestVote RPCs,以及InstallSnapshot RPCs。通过发起的形式分成以下两种。 1.1 raft自行触发的比方说leader通过AppendEntries发送心跳包,以及RequestVote RPC等。图中最左部分的tickerC是发起者,是通过设置时钟来完成的。
Read More

Raft在etcd中的实现(一)存储及重要的组件

2018-04-01

raftexample简介

本文中raft的实现以etcd中raftexample实现为例。 raftexample的例子中,启动了一个kv数据库作为raft的state machine,另外启动了一个http数据库来响应客户端的请求。其中proposeC以及commitC,errorC主要用来交互,proposeC为由客户端发送过来的条目,通过httpserver流向共识部分raftNode;commitC为经共识的条目,由raftNode流向kv数据库。

Read More

Raft一致性算法伪码详解

2018-03-29

State ```go /* Persistent state on all servers: (Updated on stable storage before responding to RPCs) */ currentTerm //当前任期
votedFor //当前任期的候选者编号,无则为null log[] //日志条目

Read More