一文了解分布式事务

本文涉及的产品
日志服务 SLS,月写入数据量 50GB 1个月
简介: 一文了解分布式事务

1、为什么有分布式事务

分布式系统经常出现的异常 机器宕机、网络异常、消息丢失、消息乱序、数据错误、不可靠的 TCP、存储数据丢失...

分布式事务是企业集成中的一个技术难点,也是每一个分布式系统架构中都会涉及到的一个 东西,特别是在微服务架构中,几乎可以说是无法避免。

2、CAP 定理与 BASE 理论

1、CAP 定理

CAP 原则又称 CAP 定理,指的是在一个分布式系统中

 一致性(Consistency)

       在分布式系统中的所有数据备份,在同一时刻是否同样的值。(等同于所有节点访 问同一份最新的数据副本)

 可用性(Availability)

       在集群中一部分节点故障后,集群整体是否还能响应客户端的读写请求。(对数据 更新具备高可用性)

 分区容错性(Partition tolerance)

      大多数分布式系统都分布在多个子网络。每个子网络就叫做一个区(partition)。 分区容错的意思是,区间通信可能失败。比如,一台服务器放在中国,另一台服务 器放在美国,这就是两个区,它们之间可能无法通信。

CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

一般来说,分区容错无法避免,因此可以认为 CAP 的 P 总是成立。CAP 定理告诉我们, 剩下的 C 和 A 无法同时做到。

(1)当前满足CP,能否也满足A?
假设当前分布式系统满足CP, 在网络发生分区的情况下,为达到C一致性, 请求只能一直等待,等待网络分区情况解除,系统数据同步完成才能返回,这就无法满足可用性A。

(2)当前满足AP,能否也满足C?
假设当前分布式系统满足AP, 系统要求在一定的时间内就要返回,在发生网络分区的情况下,为了保证P,即使出现网络分区也要正常提供服务,按时返回数据,可这样不同客户端访问同一份数据会得到不同的结果,这就不能保证数据的一致性C。

raft 算法

Raft是一个用于管理日志一致性的协议。它将分布式一致性分解为多个子问题:Leader选举(Leader election)、日志复制(Log replication)、安全性(Safety)、日志压缩(Log compaction)等。同时,Raft算法使用了更强的假设来减少了需要考虑的状态,使之变的易于理解和实现。Raft将系统中的角色分为领导者(Leader)、跟从者(Follower)和候选者(Candidate):

  • Leader:接受客户端请求,并向Follower同步请求日志,当日志同步到大多数节点上后告诉Follower提交日志
  • Follower:接受并持久化Leader同步的日志,在Leader告之日志可以提交之后,提交日志
  • Candidate:Leader选举过程中的临时角色

Raft 使用心跳(heartbeat)触发Leader选举。当服务器启动时,初始化为Follower。Leader向所有Followers周期性发送heartbeat如果Follower在选举超时时间内没有收到Leader的heartbeat,就会等待一段随机的时间后发起一次Leader选举

每一个follower都有一个时钟,是一个随机的值,表示的是follower等待成为leader的时间,谁的时钟先跑完,则发起leader选举

Follower将其当前term加一然后转换为Candidate。它首先给自己投票并且给集群中的其他服务器发送 RequestVote RPC。结果有以下三种情况:

  • 赢得了多数的选票,成功选举为Leader
  • 收到了Leader的消息,表示有其它服务器已经抢先当选了Leader;
  • 没有服务器赢得多数的选票,Leader选举失败,等待选举时间超时后发起下一次选举

2、面临的问题

对于多数大型互联网应用的场景,主机众多、部署分散,而且现在的集群规模越来越大,所 以节点故障、网络故障是常态,而且要保证服务可用性达到 99.99999%(N 个 9),即保证P 和 A,舍弃 C。

3、BASE 理论

是对 CAP 理论的延伸,思想是即使无法做到强一致性(CAP 的一致性就是强一致性),但可以采用适当的采取弱一致性,即最终一致性。

BASE 是指

 基本可用(Basically Available)

 基本可用是指分布式系统在出现故障的时候,允许损失部分可用性(例如响应时间、 功能上的可用性),允许损失部分可用性。需要注意的是,基本可用绝不等价于系 统不可用。

 响应时间上的损失:正常情况下搜索引擎需要在 0.5 秒之内返回给用户相应的 查询结果,但由于出现故障(比如系统部分机房发生断电或断网故障),查询 结果的响应时间增加到了 1~2 秒。

 功能上的损失:购物网站在购物高峰(如双十一)时,为了保护系统的稳定性, 部分消费者可能会被引导到一个降级页面。

 软状态( Soft State)

 软状态是指允许系统存在中间状态,而该中间状态不会影响系统整体可用性。分布 式存储中一般一份数据会有多个副本,允许不同副本同步的延时就是软状态的体 现。mysql replication 的异步复制也是一种体现。

 最终一致性( Eventual Consistency)

 最终一致性是指系统中的所有数据副本经过一定时间后,最终能够达到一致的状 态。弱一致性和强一致性相反,最终一致性是弱一致性的一种特殊情况。

4、强一致性、弱一致性、最终一致性

从客户端角度,多进程并发访问时,更新过的数据在不同进程如何获取的不同策略,决定了 不同的一致性。对于关系型数据库,要求更新过的数据能被后续的访问都能看到,这是强一 致性。如果能容忍后续的部分或者全部访问不到,则是弱一致性。如果经过一段时间后要求 能访问到更新后的数据,则是最终一致性

相关实践学习
通过日志服务实现云资源OSS的安全审计
本实验介绍如何通过日志服务实现云资源OSS的安全审计。
相关文章
|
算法 安全 Java
使用Collections.shuffle打乱集合顺序
使用Collections.shuffle打乱集合顺序
|
存储 JavaScript
如何在 Vue 中进行国际化和多语言支持?
如何在 Vue 中进行国际化和多语言支持?
255 5
|
缓存 算法 NoSQL
【分布式详解】一致性算法、全局唯一ID、分布式锁、分布式事务、 分布式缓存、分布式任务、分布式会话
分布式系统通过副本控制协议,使得从系统外部读取系统内部各个副本的数据在一定的约束条件下相同,称之为副本一致性(consistency)。副本一致性是针对分布式系统而言的,不是针对某一个副本而言。强一致性(strong consistency):任何时刻任何用户或节点都可以读到最近一次成功更新的副本数据。强一致性是程度最高的一致性要求,也是实践中最难以实现的一致性。单调一致性(monotonic consistency):任何时刻,任何用户一旦读到某个数据在某次更新后的值,这个用户不会再读到比这个值更旧的值。
1165 0
|
XML 数据格式
Camunda常用功能
Camunda常用接口简介
4309 1
Camunda常用功能
|
7月前
|
存储 算法 Java
G1原理—1.G1回收器的分区机制
本文深入探讨了G1垃圾回收器的多个核心概念与实现细节,包括分区(Region)管理、新生代动态扩展机制以及停顿预测模型。首先分析了G1中Region大小的计算规则及其对性能的影响,强调Region大小需为2的幂次以优化内存分配效率并避免碎片化。其次介绍了新生代内存分配方式及动态扩展流程,通过自由分区列表调整新生代大小以平衡GC时间和程序运行时间。最后重点解析了基于衰减算法的停顿预测模型,该模型利用历史GC数据加权平均来精准预测每次GC所需时间,从而确保满足用户设定的停顿时间目标。这些机制共同作用,使G1能够在大内存场景下实现高效垃圾回收与低延迟表现。
305 10
G1原理—1.G1回收器的分区机制
|
12月前
线程CPU异常定位分析
【10月更文挑战第3天】 开发过程中会出现一些CPU异常升高的问题,想要定位到具体的位置就需要一系列的分析,记录一些分析手段。
257 0
|
消息中间件 程序员 调度
简单高效!本地消息表助你轻松实现分布式事务
本文由小米分享,介绍如何使用本地消息表解决分布式事务问题。分布式事务在微服务架构中变得复杂,本地消息表提供了一种简单高效的方法。它通过在同一事务中处理业务操作和消息记录,然后异步发送消息,确保数据一致性。文章详细阐述了本地消息表的原理、实现步骤、优势及不足,强调了其实现的简单性、高性能和高可靠性,但也指出其潜在的开发复杂度和延迟性问题。
1399 9
|
消息中间件 中间件 关系型数据库
常用的分布式事务解决方案(四)
常用的分布式事务解决方案(四)
|
Java Spring 容器
Spring使用异步注解@Async正确姿势
Spring使用异步注解@Async正确姿势,异步任务,spring boot
174 3
|
JSON Java API
Python教程:一文了解Python requests模块
Python 中的 requests 模块是一个简洁而强大的 HTTP 库,用于向 Web 服务器发送 HTTP 请求和处理响应。它让开发者能够更轻松地与网络资源进行交互,包括发送 GET、POST、PUT、DELETE 等类型的请求,并处理返回的数据。
1116 6