什么场景需要变量
正常情况下,我们最多接触的是RAFT中选举Leader,并正常提交数据的过来。并且了解leader或者follower出现故障之后,如何恢复的过程。今天讨论的场景,是关于成员变更。例如:A、B、C三台机器,A机器负载比较高,需要更强的A1机器顶上。这时候,需要用到成员变更。原来的集群A、B,C,换成A1,B,C。
变成的方式
方案一:停掉A,增加A1。
方案二:增加A1,停掉A。
方案三:直接对成员更新其配置(例如需要在原来三个集群中,增加两个成员)
存在的问题
以上两种方式,都可以达到更换机器的目的。但存在的问题也比较明显,无论是方案一还是二,都存在一个可用性问题。
对于方案一
先停掉A的时候,如果B或者C机器中任何一台出现故障,则集群不可用。相当于此时为单点。
对于方案二
增加了机器A1到集群中,此时,A、B、C中的Leader需要向A1同步数据较长时间,A1这段时间无法提交日志。如果此时,A、B、C中任何一台机器坏掉,则此时,集群因为是四台机器,需要三台机器达成共识才能对外服务。假设此时B为主,A挂掉,如果客户端提交一个日志,则B必须把日志提交到A1,B,C均成功才能认为群集达成共识。而此时A1的日志还没有顺序写到最新,所以无法响应最新的日志写入,所以集群此时不可用