想必每个接触过分布式系统的同学都没少看到过“一致性”这个词,但是我最近有一个越来越强烈的感觉:“一致性”这个词已经被严重的误用了,以至于当我看到这个词的时候,我甚至得花些功夫去思考这到底指的是哪个“一致性”,更严重的是,当别人在谈到“一致性”的时候,实际上他们在谈的完全是另一种东西。
无辜的Paxos
故事的起因来源于Paxos(没错,又是这货),网上对于Paxos的文献太多,而且质量参差不齐,在绝大多数的中文文档中,你都可以看到这样的描述:“Paxos是一个分布式强一致性协议”,不瞒你说,每次看到这样的表述的时候,我的内心是崩溃的…且听我慢慢道来。
问题的由来很大一部分原因在于英文对中文的翻译,因此我们必须将术语还原到英文进行讨论,『一致性』对应的英文名词应该是Consistency没错了,然后我们在Lamport大神的原始论文《Paxos Made Simple》中搜索关键词,你会发现:
没错,论文中一次都没有提到过Consistency,也就是说,Paxos和『一致性』根本半毛钱关系都没有啊!那Paxos究竟是什么呢?论文中写的很明确——”The Consensus Algorithm”。
PS:本文中所有使用中文“一致”均指Consistency,“共识”为Consensus。
Consistency = Consensus?
词典会告诉你,Consusens的意思就是“一致”(我想这也许就是中文文献中对“一致性”误用的根源),似乎和Consistency是一样的?答案是否定的。虽然这两个单词的译意接近,但是在分布式系统中作为专业名词来讲,其代表的含义实则相差甚远。
我们常说的“一致性(Consistency)”在分布式系统中指的是副本(Replication)问题中对于同一个数据的多个副本,其对外表现的数据一致性,如线性一致性、因果一致性、最终一致性等,都是用来描述副本问题中的一致性的。
而共识(Consensus)则不同,我认为对Censensus最合适的翻译是共识而非一致,关于共识问题的定义详见我之前的文章,简单来说,共识问题中所有的节点要最终达成共识,由于最终目标是所有节点都要达成一致,所以根本不存在一致性强弱之分。
只有当你使用像Paxos这样的共识算法作为解决副本问题的核心组件时(工业界非常常见,通常是变种的Paxos作为核心实现Replicated State Machine,同样见这篇文章),才会对外展现出不同的一致性级别。但是,即使是在这样的场景下,讨论一个共识算法的一致性也是不合适的,因为整个副本系统最终的一致性并不单单取决于共识算法,Client访问所遵循的规范也会有决定性的作用。比如说:即使副本系统使用multi-paxos在所有副本服务器上同步了日志序号,但如果Client被允许从非Leader节点获取数据,则整个副本系统仍然不是强一致的(思考如果访问了非多数派节点的情况)。
做个总结:
- Paxos是共识(Consensus)算法而不是强一致性(Consistency)协议
- 一致性(Consistency)是副本(Replication)问题中的概念,共识(Consensus)算法没有一致性级别的区分
CAP和ACID
Consistency和Consensus的区分就很头大了,但这还不算完,大名鼎鼎的CAP定理和关系数据库ACID属性中的字母“C”代表的都是Consistency,然而却也代表着截然不同的含义,前者是数据副本的更新一致性,后者则是数据库状态的一致性,这里就不展开了,感兴趣的话可以翻翻任意一本数据库基础教材。
这重要么?
这种误用真的很严重么?我觉得需要从两个角度看,其一:对于真心想了解分布式系统的人来说,很严重,对他们的学习造成了很大阻碍(依赖于中文资料者尤甚),其二:对于工业界的分布式系统从业者来说,没什么关系,实际上这样的使用反而方便了大家日常的交流,极大的简化了问题和模型。
所以说,我写这篇文章的目的绝对不是要指责谁,事实上,很多中文资料的笔者都是在分布式领域有着深厚践经验的大牛,对分布式系统的理解比我不知高到哪里去了,我想要做的,只是要指出这个现象,避免更多刚进入分布式系统领域的新人被这种误用阻碍了前进的步伐(我就曾经被这些似是而非的”一致性“搞得头晕脑胀)。
究其根本,还是学术界和工业界的思路不同。学术界注重体系,探讨问题往往是从模型出发,从问题入手,而工业界则讲究实用,不求体系,更加侧重于场景,副本问题是共识算法在工业界中最主要的应用场景,因此才更加滋长了这种误用。
最后,附上一张我在学习分布式系统理论的过程中梳理的脑图供君参考,本来是想拿来单独写一篇文章的,惭愧。