工作中用到了Consul来做服务发现,之后一段时间里,我会陆续发一些文章来讲述Consul实现原理。在前一篇文章中,我介绍了Raft算法。这篇文章会讲讲Consul是如何使用Raft算法来实现分布式一致性的。
Consul中的Raft
只有以server模式运行的Consul节点,才会被认为是Raft节点集的一部分。所有的client节点会把收到的请求转发到server节点中。这么设计的原因主要是出于性能方面的考虑:节点集中的个数越多,那么法定个数的值也就越大,这会导致leader节点可能需要等待数百个follower节点对一条log entry的agree信息。
在开始的时候,单个Consul server进入到bootstrap模式,这种模式允许它把自己选举为leader。当leader被选举出来之后,别的server就可以被加入到节点集中,从而保障了一致性和安全性。最终,当最初的几台server被加进来后,bootstrap模式可以被关闭。
consul server加入节点集之后,他们会知道哪台机器是当前的leader。当一个RPC请求到达一台非leader server上时,这个请求会被转发到leader上。如果这个请求是一个查询类型(只读),leader会基于现在的状态机生成结果。如果这个请求是一个事物类型的请求(会修改状态),leader会生成一个新的log entry,并用Raft的方法去处理它。当这个log entry被提交并且被应用到状态机上时