此次咱们来讲说,有关于etcd原理的一些事情。以前咱们已经了解到了etcd是一个分布式的k-v存储,那么它到底是如何保证数据是如何复制到每一个节点上面去的呢?又是如何保证在网络分区的状况下能正常工做下去?raft协议究竟是什么?带着这些问题咱们继续往下看。服务器
咱们知道etcd使用raft协议来保证整个分布式的节点网络能正常的运转而且能正确的将数据复制到每一个节点上面去。那么什么是raft协议嘞?网络
首先咱们有这样一个背景:raft是想维护整一个网络,其中有一个领导人,这个领导人负责将收到的信息同步给网络中的其余全部节点,从而保证整个网络数据一致。分布式
若是你有必定的英文基础,我建议直接查看下面这个网站,它用动画很是清楚的描述了raft选举的整个过程:http://thesecretlivesofdata.com/raft/动画
这个其实已经说明的超级棒了,若是你还看不懂,我下面会用最简单的几个要点来进行最简单的说明。网站
首先说明一个理论,叫作大多数理论,很简单,举个栗子:日志
在etcd中的应用:blog
下面是一些选举过程当中节点的状态
leader 表示选举最终产生的领导人
candidate 候选状态,表示当前正在参与选举
follower 表示选举最终本身不是领导人,那本身就是从属节点get
etcd是经过日志复制来实现数据同步的
这个图网上也不少,说明的是日志复制的规则
每一个节点都有一份本身的日志,有的节点多,有的节点少,日志最多的确定是leader。
上图还有几个要点,我看别人没提到,我就提一下:同步
raft之因此厉害由于即便出现一些特殊状况,整个网络在必定的时间以后也能自动恢复并正常工做。源码
首先最多见的状况就是一个节点出现异常,有多是这个节点的服务器挂了,或者别的什么缘由。
还有一种异常状况是因为网络致使的,网络出现异常,致使节点之间的通讯存在异常,一部分节点与另外一部分之间没有办法访问了。以下图所示:
上面三个follower没有办法与下面的节点进行通讯。
总的来讲,只要整个网络中存在大多数节点正常运行,那么etcd就是可用的,而且可以保证数据正确。当网络恢复以后也能将数据调整到最新的状态。 raft强大的地方在于它能自动的进行状态的变化,自动进行选举,而且选举遵循必定的策略,进而保证整个网络的正常运转。同时保证数据的一致性。 了解etcd的这个原理有助于咱们后续的使用以及源码的阅读。