Java-55 深入浅出 分布式服务 分布式一致性 强一致、弱一致、单调读一致、最终一致

点一下关注吧!!!非常感谢!!持续更新!!!

🚀 AI篇持续更新中!(长期更新)

目前2025年06月16日更新到:
AI炼丹日志-29 - 字节跳动 DeerFlow 深度研究框斜体样式架 私有部署 测试上手 架构研究,持续打造实用AI工具指南!📐🤖

💻 Java篇正式开启!(300篇)

目前2025年06月25日更新到:
Java-54 深入浅出 分布式服务 基本概念 对比集群 常见模式 通信方式 三态详解
MyBatis 已完结,Spring 已完结,Nginx已完结,Tomcat已完结,分布式服务正在更新!深入浅出助你打牢基础!

📊 大数据板块已完成多项干货更新(300篇):

包括 Hadoop、Hive、Kafka、Flink、ClickHouse、Elasticsearch 等二十余项核心组件,覆盖离线+实时数仓全栈!
目前2025年06月13日更新到:
大数据-278 Spark MLib - 基础介绍 机器学习算法 梯度提升树 GBDT案例 详解

请添加图片描述

分布式一致性

分布式数据一致性,指的是数据在多分副本中存储时,各副本中的数据是一致的。分布式一致性(Distributed Consistency)是指:在分布式系统中,多个节点对同一份数据在某个时刻所持有的状态是否一致。这是分布式系统的核心难题之一,尤其在网络不可靠、节点可能故障的情况下,保持一致性尤为复杂。

在一个分布式系统中,数据通常会复制到多个节点上(比如多副本机制),以提升可用性与容错性。这时候,如何保证多个副本的数据一致性,就成为系统设计的关键。
举个例子:你在一个电商平台上下单后,数据库A写入了“你买了一个手机”,但数据库B没来得及同步,如果此时你查看订单却提示“无订单记录”,那就是一致性问题。

副本一致性

分布式系统中的数据一致性挑战

在分布式系统架构中,数据一致性管理面临着比单机系统更复杂的挑战。传统关系型数据库通过ACID(原子性、一致性、隔离性和持久性)四原则确保事务处理的可靠性,但在分布式环境中,这些保障的实现难度显著增加。

数据副本的必要性与价值

分布式系统维护多个数据副本具有多重优势:

  • 高可用性:当某个节点故障时,其他副本可以继续提供服务
  • 负载均衡:读写请求可以分散到不同节点,提高系统吞吐量
  • 地理分布:将数据放置在不同地理位置的节点,降低用户访问延迟

副本同步的核心问题

实现多副本同步面临的主要技术挑战包括:

  1. 网络延迟的必然性

    • 即使是同一数据中心内的机器间通信,也存在微妙级的延迟差异
    • 跨地域分布时,网络延迟可达数百毫秒(例如中美之间的网络延迟约为150-200ms)
  2. 并发控制的复杂性

    • 当两个客户端同时更新不同副本时,系统需要协调这些操作的顺序
    • 例如:用户A在北京节点修改账户余额,同时用户B在上海节点进行转账操作
  3. 故障处理的难度

    • 在网络分区发生时(如交换机故障),部分节点可能无法及时接收更新
    • 系统需要决定是停止服务等待恢复,还是继续以不一致状态运行

实际场景中的不一致窗口

不一致性通常表现为暂时性的"窗口期",例如:

  • 用户完成支付后立即刷新页面,可能看到未更新的余额
  • 社交媒体的"点赞"计数在不同数据中心显示不同数值
  • 库存系统在秒杀活动期间可能出现超卖现象

这些不一致情况虽然短暂,但对于关键业务系统来说可能造成严重后果,需要开发者通过适当的一致性模型和补偿机制来应对。分布式系统中,数据往往会有多个副本,如果是一台数据库处理所有的数据请求,那么ACID四原则,基本可以保证数据的一致性。而多个副本就需要保证数据有多份拷贝。这就带来了同步问题,因为我们几乎没有办法保证可以同时更新所有机器中的包括备份的所有数据。网络延迟,即使我在同一时间给所有机器发送了更新数据的请求,也不能保证这些请求被响应的时间保持一致存在时间差,就会存在某些机器之间的数据不一致的情况。

在这里插入图片描述
总得来说,我们无法找到一种能够满足分布式系统所有系统属性的分布式一致性解决方案。因此,如果既保证数据的一致性,同时又不影响系统运行的性能,是每一个分布式系统都需要重点考虑和权衡的。于是,一致性级别由此诞生。

一致性分类

强一致性 Strong Consistency

这种强一致性级别是最符合用户直觉的,它要求系统在写入完成后,所有后续的读取操作都能立即获取到最新的数据。例如,当用户在电商网站下单成功后,立即查看订单状态就能看到最新结果;或者在银行转账后,账户余额会立即更新并可见。

强一致性带来的良好用户体验主要体现在以下几个方面:

  1. 数据实时可见:用户无需担心看到过期数据
  2. 操作可预测:系统行为与用户期望完全一致
  3. 事务完整性:复杂的业务逻辑能够正确执行

然而,实现强一致性会带来显著的性能影响:

  1. 系统需要等待所有副本同步完成才能响应
  2. 跨节点的锁竞争会增加延迟
  3. 网络分区时可能完全不可用

典型的实现挑战包括:

  1. 分布式事务需要两阶段提交(2PC)
  2. 需要严格的读写锁机制
  3. 必须处理CAP理论中的取舍

在实际应用中,只有对数据准确性要求极高的场景才会采用强一致性,如:

  • 金融交易系统
  • 医疗数据存储
  • 航空订票系统
  • 库存管理系统

相比之下,最终一致性系统虽然性能更好,但需要用户容忍短暂的数据不一致,在社交网络、内容分发等场景更为常见。这种一致性级别是最符合用户直觉的,它要求系统写入什么,读出来的也会是什么,用户体验好,但实现起来往往对系统的性能影响大,但是强一致很难实现。

  • 所有读操作在任意时间看到的都是最新写入的数据。
  • 类似单机系统行为。
  • 牺牲了性能(特别是写操作),但保证体验一致。
  • 例子:Google Spanner、Zookeeper、部分 Paxos/Raft 实现。

弱一致性 Weak Consistency

这种一致性级别约束了系统在写入成功后,不承诺立即可以读到写入值,也不承诺多久之后数据能够达到一致,但会尽可能的在某个时间之后,数据达到一致的状态。
这种 最终一致性(Eventual Consistency) 级别在分布式系统中较为常见,它约束了系统在写入操作成功后,不会立即保证所有节点都能读取到最新的写入值,同时也不承诺数据达到一致状态的具体时间。然而,系统会尽可能在某个不确定的时间段后,确保所有副本之间的数据最终达到一致状态。

具体来说,最终一致性通常出现在以下几种场景中:

  1. 分布式数据库或存储系统(如 DynamoDB、Cassandra):写入可能先在一个节点上成功,但同步到其他节点需要一定的时间。
  2. 内容分发网络(CDN):文件更新后,不同地区的缓存节点可能不会立即生效,而是逐步同步。
  3. 消息队列系统(如 Kafka):消费者可能不会立刻看到生产者写入的最新消息,但最终会消费到所有数据。

在实际应用中,最终一致性牺牲了强一致性的即时性,以提高系统的可用性(Availability)分区容错性(Partition Tolerance),适用于对实时性要求不高但需要高可用的业务场景,如社交媒体的点赞计数、评论系统等。
用户读取自己写入结果的一致性,保证用户永远都能够第一时间看到自己更新的内容。比如说我们发送了一条朋友圈,朋友圈的内容是不是第一时间被看到其实不重要,但是一定要显示在自己的列表中。

  • 不保证读取的是最新的数据,只能保证最终会一致。
  • 一般用于对一致性要求不高的业务,比如缓存系统(如 Redis)。
  • 延迟小,性能好,但可能看到旧数据。

解决方案:
● 方案1:一种方案是对于一些特定的内容我们每次都是去主库读取(但是主库的压力大)
● 方案2:我们设置了一个更新时间窗口,在刚刚更新的一段时间内,我们默认都从主库取,过了这个窗口之后,我们会挑选最近有过更新的从库进行读取
● 方案3:我们直接记录用户更新的时间戳,在请求的时候带上这个时间戳,凡是最后更新时间小于这个时间戳的从库都不响应

单调读一致性

本次读到的数据不能比上次读到的数据旧,由于主从节点更新数据的时间不一致,导致用户在不停的刷新的过程中,有时候能刷出来,有时候刷不出来。
解决方案:根据用户ID计算一个hash值,再通过Hash值映射到机器,同一个用户不管怎么刷新,都只会映射到一台机器上,这样就保证了不会读到其他从库的内容,带来用户的不好的体验。

在这里插入图片描述

因果一致性

如果节点A在更新完某个数据后通知了节点B,那么节点B之后对该数据的访问和修改都是基于A更新后的值。
与此同时,和节点A无因果关系的节点C的数据访问则没有这样的限制。

最终一致性 Eventual Consistency

最终一致性是所有分布式一致性模型当中最弱的,可以认为是没有任何优化的最弱一致性,它的意义是说,我不考虑所有的中间状态的影响,只保证当没有新的更新之后,经过一段时间之后,最终系统内所有副本的数据是正确的。
它最大程度上保证了系统的并发能力,也因此,在高并发的场景下,它也是使用最广的一致性模型。最终一致性(Eventual Consistency)是分布式系统中最常见、最基础的一致性模型,也被称为最弱的一致性保证。它的核心思想是:系统不保证所有副本在任何时刻都保持完全一致,但保证在没有新的更新操作后,经过一段不确定的时间(可能是几毫秒到几小时不等),所有副本最终会达到一致状态。

具体来说,最终一致性具有以下重要特征:

  1. 中间状态的不确定性:在数据同步过程中,系统允许不同节点的数据存在临时不一致的情况
  2. 异步复制机制:数据变更通常采用异步传播方式,而非强一致的同步复制
  3. 收敛保证:确保在无新写入时,系统最终会达成一致
  4. 无锁设计:通常不需要全局锁或强同步机制,极大提高了系统吞吐量

这种模型最典型的应用场景包括:

  • 社交网络系统(如微博、Twitter的feed流)
  • 电商平台的库存系统(允许短暂超卖)
  • CDN内容分发网络
  • DNS域名解析系统

以电商库存系统为例,当多个用户同时抢购某商品时:

  1. 前端可能显示剩余库存为10件
  2. 10个用户同时下单成功
  3. 短时间内不同节点可能显示不同的剩余库存(如节点A显示0,节点B显示2)
  4. 经过几秒的数据同步后,所有节点最终都会正确显示库存为0

最终一致性之所以成为高并发系统的首选,是因为它:

  • 允许网络分区(CAP中的P)
  • 提供极高的可用性(CAP中的A)
  • 支持横向扩展(通过增加节点提高处理能力)
  • 降低了同步操作带来的延迟

不过,开发者需要特别注意:某些业务场景(如银行转账)可能需要更强的一致性保证,不能盲目使用最终一致性模型。

  • 一种弱一致性模型,强调:只要没有新的更新,所有副本最终会趋于一致。
  • 常用于高可用性优先的系统(如 Amazon Dynamo、Cassandra)。
  • 常配合 冲突解决策略(如 Last-Write-Wins) 一起使用。

在这里插入图片描述

与 CAP 原则的关系

在分布式系统中,无法同时满足一致性(C)、可用性(A)和分区容错性(P),最多只能同时满足两个。

  • CP(强一致):舍弃可用性,Zookeeper、Etcd、Spanner
  • AP(最终一致):舍弃一致性,Cassandra、DynamoDB
  • CA(理论上存在):不容忍分区,单机数据库

一致性算法(核心协议)

Paxos

  • 最经典、最早的分布式一致性算法。
  • 理论完备,但实现复杂。
  • 包括阶段:Prepare、Promise、Accept、Learn。
  • 适合学术研究、银行系统、核心调度等高一致性场景。

Raft

  • 为了“可理解性”设计的 Paxos 替代方案。
  • 模块清晰,分为 Leader 选举、日志复制、日志提交。
  • 应用:Etcd、Consul、TiKV、Kubernetes 控制面等。

Zab

  • Zookeeper 的一致性协议。
  • 类似 Raft,有 Leader 选举与事务日志复制。

应用场景

  • 分布式锁:强一致性(Zookeeper、Etcd)
  • 配置中心(如 Apollo):强一致性(Raft)
  • 高性能 NoSQL:最终一致性(Cassandra)
  • 微服务注册中心(如Nacos):可接受弱一致性
  • 分布式缓存系统:弱一致性(Redis Cluster)

挑战与工程实现难点

  • 网络分区:导致部分节点不可达,如何决定是否允许继续服务?
  • 脑裂(Split-Brain):多个节点以为自己是主节点,容易引发数据冲突。
  • 写冲突与合并策略:如 LWW、CRDT 等。
  • 性能与一致性权衡:如 Raft 中的同步复制 vs 异步复制。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

武子康

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值