分布式一致性想象一下,我们有一个单节点系统,且作为数据库服务器,然后存储了一个值(假设为X) 。然后,有一个客户端往服务器发送了一个值(假设为8) 。只要服务器接受到这个值即可,这个值在单节点上的一致性非常容易保证:

文章插图
单机环境
【图解Raft:应该是最容易理解的分布式一致性算法】但是,如果数据库服务器有多个节点呢?比如,如下图所示,有三个节点:a,b,c 。这时候客户端对这个由3个节点组成的数据库集群进行操作时的值一致性如何保证,这就是分布式一致性问题 。而Raft就是一种实现了分布式一致性的协议(还有其他一些一致性算法,例如:ZAB、PAXOS等):

文章插图
分布式环境
一些概念讲解Raft算法之前,先普及一些Raft协议涉及到的概念:
term:任期,比如新的选举任期,即整个集群初始化时,或者新的Leader选举就会开始一个新的选举任期 。
大多数:假设一个集群由N个节点组成,那么大多数就是至少N/2+1 。例如:3个节点的集群,大多数就是至少2;5个节点的集群,大多数就是至少3 。
状态:每个节点有三种状态,且某一时刻只能是三种状态中的一种:Follower(图左),Candidate(图中),Leader(图右) 。假设三种状态不同图案如下所示:

文章插图
节点状态图
初始化状态时,三个节点都是Follower状态,并且term为0,如下图所示:

文章插图
初始化
Leader选举Leader选举需要某个节点发起投票,在确定哪个节点向其他节点发起投票之前,每个节点会分配一个随机的选举超时时间(election timeout) 。在这个时间内,节点必须等待,不能成为Candidate状态 。现在假设节点a等待168ms , 节点b等待210ms , 节点c等待200ms。由于a的等待时间最短,所以它会最先成为Candidate,并向另外两个节点发起投票请求,希望它们能选举自己为Leader:

文章插图
发起投票请求
另外两个节点收到请求后,假设将它们的投票返回给Candidate状态节点a,节点a由于得到了大多数节点的投票,就会从Candidate变为Leader,如下图所示,这个过程就叫做Leader选举(Leader Election) 。接下来,这个分布式系统所有的改变都要先经过节点a,即Leader节点:

文章插图
Leader节点
如果某个时刻,Follower不再收到Leader的消息,它就会变成Candidate 。然后请求其他节点给他投票(类似拉票一样) 。其他节点就会回复它投票结果,如果它能得到大多数节点的投票,它就能成为新的Leader 。
日志复制假设接下来客户端发起一个SET 5的请求,这个请求会首先由leader即节点a接收到,并且节点a写入一条日志 。由于这条日志还没被其他任何节点接收,所以它的状态是uncommitted 。

文章插图
sc_20190511173101.png
为了提交这条日志,Leader会将这条日志通过心跳消息复制给其他的Follower节点:

文章插图
日志复制
一旦有大多数节点成功写入这条日志,那么Leader节点的这条日志状态就会更新为committed状态,并且值更新为5:

文章插图
sc_20190511173806.png
Leader节点然后通知其他Follower节点,其他节点也会将值更新为5 。如下图所示,这个时候集群的状态是完全一致的,这个过程就叫做日志复制(Log Replication):

文章插图
sc_20190511174011.png
两个超时接下来介绍Raft中两个很重要的超时设置:选举超时和心跳超时 。
- 选举超时
推荐阅读
- 图解Kubernetes故障排查指南
- 保肝茶应该怎样喝,男人喝什么茶最好
- 中乙|中乙球员月薪一万是高薪?这不应该是很正常的事情吗?
- 如何选择普洱茶,如何选择和鉴别普洱茶
- 步行健身的最好方式是什么 步行健身的正确方式应该是什么
- 老式海尔冰箱调温图解 老式海尔冰箱温度调节
- 五峰毛尖的冲泡方法图解
- 翡翠|购买翡翠原石被忽悠了,应该怎么处理?
- 包教包会!用一张白纸教你推导出 RAFT 算法
- 餐厨垃圾应该如何处理
