强一直和最终一致 解决方案

a、强一致性:

R+W>N,建设有3个节点,每次读时,读2个节点并且数据一致;写时,写2个节点都成功才算写成功。这种是强一致性。

2PC,3PC 多个节点都成功时,才算成功,否则进行回滚操作。

PAXOS,类似于2PC,解决分布式系统如何就某个值(决议)达成一致,进行投票选举。是一种无主的节点的算法。分布式的协调服务zookeeper就实现了这个算法,保障一致性。mongodb中的集群方案replicaset也实现了类似的算法。

b、 弱一致性(最终一致):

由于分布式系统在数据同步时的网络延迟等等因素,无法保证副本数据和主节点时刻保持一致,当出现不一致的时,可以采用以下几种策略保证最终一致性

Gossip(Cassandra,Dynamo),是带冗余容错算法,也就是最终一致性的算法,无法保证某时刻所有节点数据一致,它是一个去中心化的部署方式,集群中每个节点维护一组状态,状态可以用key,value,外带一个版本号表示,版本大的比版本小的数据新,节点之间相互交流数据的版本信息,并更新数据,类似病毒式的传递,这样数据可以达到最终一致。Cassandra就是采取这种策略来进行数据的同步,并且维护节点的健康状态。

向量时钟(Dynamo),是一种数据不一致导致冲突的解决策略,系统采用乐观锁的策略,这样对同一个值进行操作时,就可能会出现多个版本,由向量时钟来解决一致性;每个元素是(更新值的节点,序列号),每当更新一个值时,都带上这些信息,从下图可见,D3和D4出现数据的冲突,那么在下次操作时,会由更新值的节点做冲突的解决。Dynamo采用的就是这种策略进行冲突的解决。

 

时间戳(Cassandra),每次更新节点时,都带上时间戳信息,冲突的解决以时间戳最晚的为准。以Cassandra为代表。

Merle tree(Cassandra,Dynamo),在每个节点上针对每个区间里的数据构造一棵Merkle Tree,这样,在两台节点进行数据比对时,从Merkle Tree的根节点开始进行比对,如果根节点一样,则表示两个副本目前是一致的,不再需要任何处理;如果不一样,则遍历Merkle Tree,定位到不一致的节点也非常快速,大大节省了比对时间以及数据的传输量。Dynamo和cassandra中的副本同步采用这种方案。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值