我认为, 讨论分布式存储时, 一定要区分上帝视角和观察者视角, 否则经常会导致混乱. 上帝视角是指对多个副本进行同一时刻完整性的观察, 而观察者就是通常说的用户角度. 上帝的观察是非常绝对而准确的, 而且不会对系统产生任何作用. 而观察者则不是, 观察者的每一次观察可能会导致系统的状态发生改变. 例如, 对于 Paxos 来说, 读操作可能导致数据的写和删除.

对于一个3个节点的集群, 我们说某一份数据存在两个副本, 这是上帝视角的观察. 从用户的角度来观察, 可能观察到0到2个副本. 一致性协议要解决的一般是观察者的顺序一致性, 同时要隐藏副本数量, 只让观察者看到数据的存在或者不存在, 而不是副本的数量.

一个很经典的一致性问题, 在3个节点的集群中, 如果上帝视角看到是两个副本, 那么观察者第一次看到是存在(按多数派来决定是否存在), 那么第二次观察就不能说不存在.

之前讨论过, 即使上帝看到2/3多数派副本存在, 观察者的观察结果未必就是存在. 如果观察者观察时只看到两个节点其中一个节点无数据, 这种情况就是所谓的 unknown(未决, uncommitted). 因为观察讨厌 unknown, 所以, Paxos 会更新集群的状态(同步数据), 让集群的状态变成 committed.

回到顺序一致性的问题来, 如果第二次观察时, 虽然不能说不存在, 但可以说 unknown, 这并不违反系统的一致性原则. 不过, 违反了高可用原则.

分布式系统, unknown 状态是一个非常重要的概念. 上帝视角没有 unknown, 但观察者视角有. 我们有上帝视角, 但集群的用户只有观察视角, 一定要注意.

相关文章