Coin163

一致性 分布式一致性算法--Raft

2016-07-23by admin, 次阅读

本篇文章主要介绍了"一致性 分布式一致性算法--Raft",主要涉及到一致性方面的内容,对于MySql感兴趣的同学可以参考一下: 前面一篇文章讲了Paxos协议,这篇文章讲它的姊妹篇Raft协议,相对于Paxos协议,Raft协议更为简单,也更容易工程实现。有关Raft协议和工程...

     前面一篇文章讲了Paxos协议,这篇文章讲它的姊妹篇Raft协议,相对于Paxos协议,Raft协议更为简单,也更容易工程实现。有关Raft协议和工程实现可以参考这个链接https://raft.github.io/,里面包含了大量的论文,视屏已经动画演示,非常有助于理解协议。
概念与术语
leader:领导者,提供客户提供服务(生成写日志)的节点,任何时候raft系统中只能有一个leader。
follower:跟随者,被动接受请求的节点,不会发送任何请求,只会响应来自leader或者candidate的请求。如果接受到客户请求,会转发给leader。
candidate:候选人,选举过程中产生,follower在超时时间内没有收到leader的心跳或者日志,则切换到candidate状态,进入选举流程。
termId:任期号,时间被划分成一个个任期,每次选举后都会产生一个新的termId,一个任期内只有一个leader。termId相当于paxos的proposalId。
RequestVote:请求投票,candidate在选举过程中发起,收到quorum(多数派)响应后,成为leader。
AppendEntries:附加日志,leader发送日志和心跳的机制
election timeout:选举超时,如果follower在一段时间内没有收到任何消息(追加日志或者心跳),就是选举超时。
Raft协议主要包括三部分,leader选举,日志复制和成员变更。

Raft协议的原则和特点
a.系统中有一个leader,所有的请求都交由leader处理,leader发起同步请求,当多数派响应后才返回客户端。
b.leader从来不修改自身的日志,只做追加操作
c.日志只从leader流向follower,leader中包含了所有已经提交的日志
d.如果日志在某个term中达成了多数派,则以后的任期中日志一定会存在
e.如果某个节点在某个(term,index)应用了日志,则在相同的位置,其它节点一定会应用相同的日志。
f.不依赖各个节点物理时序保证一致性,通过逻辑递增的term-id和log-id保证。
e.可用性:只要有大多数机器可运行并可相互通信,就可以保证可用,比如5节点的系统可以容忍2节点失效。
f.容易理解:相对于Paxos协议实现逻辑清晰容易理解,并且有很多工程实现,而Paxos则难以理解,也没有工程实现。
g.主要实现包括3部分:leader选举,日志复制,复制快照和成员变更;日志类型包括:选举投票,追加日志(心跳),复制快照

leader选举流程
关键词:随机超时,FIFO
      服务器启动时初始状态都是follower,如果在超时时间内没有收到leader发送的心跳包,则进入candidate状态进行选举,服务器启动时和leader挂掉时处理一样。为了避免选票瓜分的情况,比如5个节点ABCDE,leader A 挂掉后,还剩4个节点,raft协议约定,每个服务器在一个term只能投一张票,假设B,D分别有最新的日志,且同时发起选举投票,则可能出现B和D分别得到2张票的情况,如果这样都得不到大多数确认,无法选出leader。为了避免这种情况发生,raft利用随机超时机制避免选票瓜分情况。选举超时时间从一个固定的区间随机选择,由于每个服务器的超时时间不同,则leader挂掉后,超时时间最短且拥有最多日志的follower最先开始选主,并成为leader。一旦candidate成为leader,就会向其他服务器发送心跳包阻止新一轮的选举开始。


《MySQL必知必会学习笔记》:游标的使用 mysql官网 mysql命令 mysql安装

《MySQL必知必会学习笔记》:游标的使用",主要涉及到Mysql方面的内容,对于MySql感兴趣的同学可以参考一下: 《MySQL必知必会学习笔记》:游标的使用游标是什么?? 《...

mysql获取表行数的方法 mysql 管理工具 mysql官网 mysql下载64位

mysql获取表行数的方法",主要涉及到Mysql方面的内容,对于MySql感兴趣的同学可以参考一下: http://www.cnblogs.com/wangtao_20/archive/2011/04/12/2014218.html如果你的需要是统计总行数时...

Mysql命令备忘 mysql常用命令 mysql登录命令 mysql数据库命令

Mysql命令备忘",主要涉及到mysql命令方面的内容,对于MySql感兴趣的同学可以参考一下: 零散的知识太容易忘记了。。。每次都要现查。。把我自己容易忘的汇总一下 下载...

------分隔线----------------------------