java架构师培训-分布式系统的一致性原理

2021年01月18日 17:01

105

    在说明一致性原理之前,可以先了解一下cap理论和base理论。

java架构师培训-分布式系统的一致性原理

    为了对多个副本进行一致性处理,通常有几种方法:同步更新-也就是说,写操作需要等待两个节点都成功更新后才能返回。这样,如果发生网络分区故障,则写操作将不可用,以A为代价。异步更新-即,写操作直接返回,而无需等待节点成功更新,节点将异步更新数据。这样,牺牲了C来保证A。妥协-只要集群中超过一半的节点是正常且一致的,就可以满足要求。此时,读取操作仅需要比较副本集数据的修改时间或版本号,以选择最新的副本集数据,因此系统具有很强的一致性。如果允许“数据一致性具有延迟时间”,则最终是一致性。


    如Cassandra中的折衷型方案QUORUM,只要超过半数的节点更新成功便返回,读取时返回多数副本的一致的值。然后,对于不一致的副本,可以通过readrepair的方式解决。readrepair:读取某条数据时,查询所有副本中的这条数据,比较数据与大多数副本的最新数据是否一致,若否,则进行一致性修复。此种情况是强一致性的。


    又如Redis的master-slave模式,更新成功一个节点即返回,其他节点异步地去备份数据。这种方式只保证了最终一致性。最终一致性:相比于数据时刻保持一致的强一致性,最终一致性允许某段时间内数据不一致。但是随着时间的增长,数据最终会到达一致的状态。此种情况只能保证最终一致性。著名的DNS也是最终一致性的成功例子。


    强一致性算法:1989年就诞生了著名的Paxos经典算法(zookeeper就采用了Paxos算法的近亲兄弟Zab算法),但由于Paxos算法难以理解、实现和排错,所以不断有人尝试优化算法,2013年终于有了重大突破:Raft算法的出现,其中Go语言实现的Raft算法就是Etcd,功能类似于zookeeper。


    Base的思想:基本可用、柔性状态、最终一致性,主要针对数据库领域的数据拆分,通过数据分片(如Mycat、Amodeba等)来提升系统的可用性。由于分片拆分后会涉及分布式事务,所以接下来看一下如何用最终一致性的思路来实现分布式事务,也就是柔性事务。


  推荐阅读:jvm培训:如何判断哪些对象需要回收?


更多鲁班学院java高级培训免费课程试听地址https://www.lubanjava.com/course.html

鲁班学院java高级培训课程https://www.lubanjava.com/course/detail/519.html

加群即可领取鲁班学院最新Java高级培训课程资料学习包 群号:700541970


咨询(2)
免费试听
领取优惠
加群交流

扫一扫
加群领取架构师资料

售后反馈
返回顶部