很多人会把分布式共识和分布式一致性搞混,分布式共识各个分布式节点大家对一个key的背后所代表的值达成一致性,比如系统有五个节点:A,B,C,D,E,这五个节点会对key:"programmer" 形成共识 “苦逼”,这是分布式共识。
zookeeper,etcd,consule都是分布式共识系统的一部分,每个节点上存放着相同的共识数据,不是强一致性,是时序一致性系统,每个节点上读到的未必是最新的数据,但最新的数据肯定会按照写入的顺序依次来到。工业界用的比较多的分布式一致性协议是raft协议,一个类似于两阶段提交的协议。
而一个系统的分布式一致性则不一定要求每个节点都形成共识,存放相同的value,我们完全可以通过控制读&写副本的数目和总的副本的数目,来达到所谓的强一致性,即所谓的: R+W > N.还是刚才的例子,系统有五个节点A,B,C,D,E,在这里我们把他们看成是五个读写副本,一个client告诉A “程序员真苦逼”, 然后A告诉C,D “程序员好苦逼”,在这里就相当于client写了3个副本,然后B,E是不知道程序员苦逼这个事情的,要是我们只读一个副本,很可能读到B或者E,那么好了,我们是不知道程序员苦逼这个事情的。但是我们要是控制读取时读三个副本,然后取里面消息最新的,好了,这三个副本里面必含有程序员真苦逼这个消息,是吧?这就是R+W>N来实现强一致性。
R+W>N,这个参数的调整也要根据我们具体的需求来搞,要是一个强调吞吐的系统,那么W设小一些,要是一个读多的系统,那么R小一些,这些都是根据具体情况具体分析的。