竞选流程
etcd内部采用raft协议来实现,所以在etcd里面,节点有3个状态,一开始都是follower节点,然后接收leader的心跳信息,如果接收不到,就进入candidate进入下一轮term发起竞选,等到收到集群多数节点的投票时,该节点就会转变成新的leader节点。leader节点有可能出现故障,导致follower接收不到心跳,这时候就会发生上面的竞选,新的leader产生以后,旧的leader就会变成follower。其实就是有新的leader之后,所有其他节点都会变成follower。
成为leader也是有条件的,比如你的数据完整性,在竞选投票的时候,如果其他节点发现你的数据不完整,是不会给你投票的。
节点损坏
节点可能会因为各种原因损坏,导致无法正常工作。如果是leader节点那么就会导致follower收不到心跳而触发竞选机制,如果是follower节点,那么我们可以将这个节点删除以后在创建新的节点。因为损坏的节点依然会被计算在etcd总节点之中。
etcd采用基于仲裁模型的分布式共识,即(n + 1) / 2成员(多数)必须就提案一致才能提交给集群。因此当有follower损坏的时候,我们需要先删除在创建,而不能先创建在删除。
比如:如果有一个3个成员的集群,有一个成员损坏,那么这个集群仍然可以正常工作,这个时候删除损坏成员,该集群依然可以正常工作,然后添加新节点,这个行为是存在风险的,因为他可能会导致配置错误或无法加入集群,这种情况下,集群依然可以正常工作。而如果正确加入,依然可以正常工作。那我们想一下先增加新成员,如果增加失败,那么该集群总成员数量变成4个,而其中有1个早已损坏,还有一个刚添加的同样算是损坏,这将会使仲裁失效,所以默认情况下,etcd会拒绝这种成员的添加。