zab协议为什么只保证超过一半的机器保持数据同步?这样有什么好处,会造成什么影响,还有剩下的没保证同步的机器,后来是怎么重新进入数据同步状态的?paxos也有类似的问题
举个例子。假设一个集群系统中就存储着一条数据(比如这条数据代表所有人支付宝的总额,所有人都秉承共产主义理念往这个账户里存钱取钱)。这个系统可能有多个客服姑娘(client) 对外服务,响应外部对数据的读写请求(读:看看现在总额多少呀;写:转入或转出资金),而系统内部则是一个个真正干活的工人(host),负责接受客服姑娘的对数据的询问和按照姑娘的指示修改数据。假设在某个时间点,有几个客户同时打电话询问现在总额多少啊。每个客服在完成服务的过程中,需要询问若干个工人才能得到答案来作出判断,最终反馈给客户;并且每个客服在此过程中使用到若干工人非常可能是不一样的。比如,客服1用到了工人1,工人2,工人3;客服2用到了工人1,工人4,工人5;而且每个工人可能知道的数据也是不一样(比如工人5在某个时间点去上厕所了,没有听到把总额加100的要求)。但是尽管可能有部分工人拥有的数据是过时的(就当前情况来看是错误的),但是客服1和客服2通过获取这些工人的回应后判断出来的结果是一样的,这是一致性的一个基本要求(读一致性)。所以你看到,怎么能够保证客服1 客服2的判断出来的是一样的呢?最低要求就是有工人总数一半以上的工人回复的结果是一样的可以,也就是说集群中保证有一半以上的数据是一致的就可以,这样就能满足响应对外读取服务的一致性。至于内部的不一致的工人,通过一定机制同步一下就可以达到一致(比如在某个时间点互相广播一下当前最新记录的时间戳,落后的自动去跟别人获取落下的这段时间的增量日志,然后按照增量日志对自己的记录进行更新)