怎么保持分布式系统中数据的一致性

1.什么是CAP:
一致性(Consistency)
可用性(Availability)
分区容忍性(Partition tolerance)
CAP原理是说这三个要素最多只能同时满足两点,不可能同时兼顾三点,因此在分布式架构设计时必须进行取舍,而分布式数据系统,分区容忍性是最基本的要求,否则就失去了价值,因此只能在一致性和可用性之间取一个平衡。其实对于大多数web系统并不需要强一致性,因此牺牲一致性,换取高可用性是现在多数分布式数据库产品的方向。
2.数据一致性
数据一致性分为强一致性和最终一致性:
强一致性就是在任何时刻所有的用户或者进程查询到的都是最近一次成功更新的数据。强一致性是程度最高一致性要求,也是最难实现的。关系型数据库更新操作就是这个案例。
最终一致性和强一致性相对,在某一时刻用户或者进程查询到的数据可能都不同,但是最终成功更新的数据都会被所有用户或者进程查询到。当前主流的nosql数据库都是采用这种一致性策略。
3.保持数据一致性的解决方案
分布式锁可以解决这个问题。
1、数据库层面的分布式锁
建立一张两个字段的锁表,一个id,另一个字段就表示锁,当分布式系统中的某个服务器想要修改数据的时候先去数据库中查询这个字段,如果这个字段没有值就像这个字段中写入一个值,然后去真正的修改数据,这个时候如果有其它的服务器也想要修改这个数据库,访问锁表发现已经有这个值存在就会进入等待状态,当第一个访问的服务器结束操作时会删除掉这个字段让后面的服务器也可以对这个字段进行操作了。
2、缓存层面的分布式锁
以redis为例,redis中有一个setnx (set if not exits) 存入数据,服务器想要去操作数据库的时候会优先执行这个命令,如果没有人执行过这个命令就会往redis中存入一个值并且返回一个true,就等于有人拿到了执行权,等到拿到锁的服务器执行完之后会释放锁,如果执行这个命令返回的结果时false就表示有人占住了锁,等待锁的释放在继续执行。
3、zookeeper层面的分布式锁
使用zookeeper创建临时序列节点来实现分布式锁,适用于顺序执行的程序,大体思路就是创建临时序列节点,找出最小的序列节点,获取分布式锁,程序执行完成之后此序列节点消失,通过watch来监控节点的变化,从剩下的节点的找到最小的序列节点,获取分布式锁,执行相应处理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值