彻底搞透分布式一致性

分布式系统下的数据一致性可以分为两大类:

  1. 事务一致性:当多个节点进行操作时,所有节点最终达成的状态都是一致的 。这需要通过协调来保证操作的正确性 , 避免出现数据不一致的情况;
  2. 副本一致性:数据的多个副本之间保持一致性,这需要保证在对数据进行修改时,所有副本都能够及时更新,避免数据出现不同步的情况;
定义都比较抽象,举个例子感受一下:
  1. 事务一致性:电商平台使用优惠券下单场景:

彻底搞透分布式一致性

文章插图
图片
  1. 下单成功,优惠券必须处于“已锁定”状态;
  2. 支付成功,优惠券必须处于“已使用”状态;
  3. 订单取消,优惠券需要恢复为“待使用”状态;
  4. 优惠券和订单间就属于“事务一致”,两者间存在强关联关系 。
  1. 副本一致性:
  • MySQL 主从复制:是指在主数据库上进行数据操作后,将这些操作同步到一个或多个从数据库上 。从库必须与主库保持同步,以便从库中的数据和主库中的数据保持一致;
  • redis 与 MySQL 一致性:在将 Redis 作为存储使用时,可以将 MySQL 看做主节点,Redis 看做从节点,当 MySQL 数据发生变更时,自动同步到 Redis 中,并保持数据的一致性;

  1. 彻底搞透分布式一致性

    文章插图
    image
【注】本文着重介绍 “事务一致性”,多副本一致性,详见 缓存 或 ES 篇 。
1. 脱离数据库事务的怀抱在关系型数据库中,事务(Transaction)是指一组数据库操作,这些操作要么全部成功要么全部失败 。事务可以保证某些数据操作的一致性,当某一条操作失败时,会进行回滚,即撤销已执行的操作,使数据恢复到操作前的状态 。
提到事务一致性,不得不说数据库事务 ACID:ACID是指数据库事务的四个关键特性,分别为原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)和持久性(Durability):
  1. 原子性(Atomicity):事务应该被视为一个原子操作,即事务中的所有操作要么全部执行成功,要么全部失败回滚 。如果事务执行过程中出现错误 , 所有修改操作将被回滚撤销,不会对数据造成损坏;
  2. 一致性(Consistency):事务执行前后 , 数据应该保持一致状态 。所有数据修改操作都必须确保数据库的约束条件、触发器等规则不会被破坏 , 保持数据完整性;
  3. 隔离性(Isolation):多个事务同时对同一数据进行操作时 , 事务之间应该相互隔离,互不干扰 。数据库系统应该确保在并发情况下,事务的执行结果和串行执行的结果一致;
  4. 持久性(Durability):事务完成后,其对数据库所作的所有修改都应该被永久保存,即使系统崩溃或重启后,修改的数据也应该是可用的;
银行转账应用程序就是典型的 ACID 模型的应用场景 。假设用户A要向用户B转账1000元,转账过程就是一个事务,具有原子性、一致性、隔离性和持久性四大特性:
  1. 原子性:转账过程总共涉及两个操作:从A账户中减去1000元,向B账户中加上1000元 。如果这两个操作中的任何一个失败 , 整个事务都将失败回滚;
  2. 一致性:转账前后所有账户的余额总和应该是不变的 , 不会出现余额不足或超额的情况;
  3. 隔离性:如果同时发起两个转账事务,应该确保每个事务只访问自己的数据,不会互相干扰;
  4. 持久性:一旦转账完成,更改数据的事务就必须写入磁盘,保证即使系统崩溃或重启后 , 这些数据仍然是可用的;
数据库事务绝对是程序员的一大利器,但由于各种原因,这把利器离我们越来越远:


推荐阅读