顾名思义,一致性协议的应用是为了维护各节点数据的一致性,换句话说,就是使集群里的节点存储的数据是一模一样的。那么这样的技术,在现实生活中真的迫切需要嘛?其实这样的需求从古至今一直存在,这里我们举个趣味性的例子,可能很多人知道拜占庭将军问题,古时候东罗马帝国幅员辽阔,各个将军掌管各自的军队分散在帝国各处,他们之间靠信差交流。当东罗马帝国遭遇战争,将军们需要联合起来才能打倒敌方军队。这个时候将军们需要对最基本的进攻还是撤退达成一致。如果一齐进攻,他们能打倒敌人,如果一齐撤退,他们还有机会东山再起。此时将军们派出各自的信差去传达指令。那么帝国里有那么多将军,大家如何达成一致?最简单的,指派一个上将军,大家都听他的命令就好。那么上将军将怎么安排自己的信使?如果信使路上遇到了危险不幸逝去,那么长时间等不来回信的上将军该怎么处理?如果不幸逝世的是上将军怎么办?如果上将军是敌方间谍,专门传递虚假消息怎么办?比如间谍上将军对A将军传达撤退命令,对B将军传达进攻命令,那么最终只有B将军进攻,B就会全军覆没!这些情况其实都真实反映一致性协议需要考虑的种种问题。 分布式一致性协议 - 图1

  • 强一致性
    • 说明:保证系统改变提交以后立即改变集群的状态。
    • 模型:
      • Paxos
      • Raft(muti-paxos)
      • ZAB(muti-paxos)
  • 弱一致性

    • 说明:也叫最终一致性,系统不保证改变提交以后立即改变集群的状态,但是随着时间的推移最终状态是一致的。
    • 模型:
      • DNS系统
      • Gossip协议

        一致性算法实现举例

  • Google的Chubby分布式锁服务,采用了Paxos算法

  • etcd分布式键值数据库,采用了Raft算法
  • ZooKeeper分布式应用协调服务,Chubby的开源实现,采用ZAB算法
  • Redis数据库便使用Gossip传播协议保持一致性
  • Pow最为人所熟知的应用是比特币