《亿级流量架构之分布式事务思路及方法.docx》由会员分享,可在线阅读,更多相关《亿级流量架构之分布式事务思路及方法.docx(20页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、口难点,分布式事务本概念出发,一步一面 后 及 以 ti享 讨分 性工 I t流 式基一致交 布从中一他 分时务看与 是惯事接、 锁习理直顾 式的梳以回 布滁先可结 分完会话总 及不面的便 以写9楚方 务能绍清己 事可介分予 式章始十。 布文开念分 分篇步概部些基本概念,对基本什么是分布式事务在日常生活中,很多事要么全部 做一局部,不然就会产生其他复 转账的例子,对于同一个账号,A 东取钱500,那么A转出去之后 除,B账号数目增加:事务 =(A 500),像这样多个步骤放在一 不执行,如果我们的数据 在跨库调用,由于网络具 证事务分布式执行呢?如 ?在讲解分布式事务之前ACID,下面逐一讲解
2、:看要就如何点没都存保理称到么是何处假举在扣增 欢,B目号 W喜00数账 做人5钱,B 不多转的00 部,m出号5 全题往账除 么问北AJ扣 国的湖将号 做杂在要账行 执者 么要 务事 是就 起存有果先储在多个数据库中,也 不平安性以及延时性, 执行到一半断电又该如 简单回顾事务的一些特原子性(Atomic)在化学中,分子构成的物质,分子是保持化学特性的最小 单位,如“20,CO2H20,C02等,由原子构成的物质,原子保 持物质特性,像FeFe啥的,意思就是不可分害U ,再分成质子 中子啥的就不是我们认为的物质了,这儿的原子性也是这 个道理,就是事务不可以再拆分,例如上面的事务,看着可 以是
3、由两个过程组成的事务,但是你拆开就不是我们认为 该有的过程,所以,事务不可再分,具有原子性。一致性(Consistency)致性也很好理解道自己这儿被存了5 0 0块,B账号没有 账号没有钱,B账号 不可能出现A账号 据不一致了,这样的于上面的 少钱,那么 ,银行账户5 0 0块,也5 00 块,B,说明事务账户,如果银行想知问题,产生中间数据,那么就不有A的数 号定就7 账行一那现 A执是,出 前务块块行 亍事O。执 M 块5050骤 务00个有 事5这也些 个个共是号某。 两这总就账中致对于第 2和第 3种情况,协调者均认为参与者无法成 功执行事务,为了整个集群数据的一致性,所以要向各个
4、参与者发送事务回滚通知,具体步骤如下:1 .协调者向各个参与者发送事务rollback通知,请求回滚事务;.参与者收到事务回滚通知之后执行rollback操作,然后释放占有的资源;2 .参与者向协调者返回事务rollback结果信息。协调者参与者集群1询问参与者是否可以正常执行事务1.2局部参与者事务未成功执行1.1执行事务 但是不提交2,要求所有参与者回滚事务2.1回滚事务 醐资源2.2反应事务回滚情况两阶段提交协议解决的是分布式数据库数据强一致性问 题,实际应用中更多的是用来解决事务操作的原子性,下 图描绘了协调者与参与者的状态转换。投票请求参与者状态转换参与者状态转换协调者状态转换站在协
5、调者的角度,在发起投票之后就进入了 WAIT 等 待状态,等待所有参与者回复各自事务执行状态,并在收 到所有参与者的回复后决策下一步是发送 commit提交 或 rollback回滚信息。站在参与者的角度,当回复完协调者的投票请求之后便进 入 READY状态(能够正常执行事务),接下去就是等 待协调者最终的决策通知,一旦收到通知便可依据决策执 行 commit 或 rollback 操作。两阶段提交协议原理简单、易于实现,但是缺点也是显而 易见的,包含如下:单点问题协一正正协一正正整者。事提器二回库 段务第或据 阶服在交数 两在如提个 个所比务整交宕阶滚集过机段,勺匕匕臂不*集障 库故 ”据为
6、将 孑数因 2个者 中整调 着响协 情影果 ,会如 中呈就, 程,中务 及 月 供 提 K法 刃无同步阻塞两阶段提交执行过程中,所有的参与者都需要听从协调者 的统一调度,期间处于阻塞状态而不能从事其他操作,这 样效率极其低下。数据不一致性两阶段提交协议虽然是分布式数据强一致性所设计,但仍然存在数据不一致性的可能性。比方在第二阶段中,假设协调者发出了事务 commit通知,但是因为网络问题该通知仅被一局部参与者所收到并执行了 commit操作,其余的参与者那么因为没有收到通知一直处于阻塞状态,这时候就产生时候就产生了数据的不一致性。针对上述问题可以引入 超时机制 和 互询机制在很大 程度上予以解
7、决。超时机制对于协调者来说如果在指定时间内没有收到所有参与者 的应答,那么可以自动退出 WAIT状态,并向所有参与者 发送 rollback 通知。对于参与者来说如果位于 READY 状态,但是在指定时间内没有收到协调者的第二阶段通知, 那么不能武断地执行 rollback操作,因为协调者可能发送 的是 commit通知,这个时候执行 rollback 就会导致 数据不一致。互询机制此时,我们可以 参与者 B的执 commit 操作, 如果 B此时还 调者发出的肯定此时,我们可以 参与者 B的执 commit 操作, 如果 B此时还 调者发出的肯定介行那么没是READY 状态,那么 当所有的参
8、与者都 交协议无法处理,入互询机制,让参与者 A 去询问其他 情况。如果 B 执行了 rollback 或A 可以大胆的与 B执行相同的操作; 有到达 READY 状态,那么可以推断出协 rollback通知;如果 B 同样位于A可以继续询问另外的参与者。只有 位于 READY状态时,此时两阶段提 将陷入长时间的阻塞状态。三阶段提交协议两 对 针 X17 t m m o两 对 针 X17 t m m oc p 3 zv 议 协 交 提 段 阶 三预 个,入 引 过 通 议 协 交 提 段 阶 三 题 问 的 在 存 交 提 段盘 询 预 为 别 分 段 阶 个 三 的 交 提 段 阶 三O 匕
9、匕 育 性 统 系 升 提提 务 溥 及 以 t 1m m o- e r p z( 交 提 预t 1m m o c n a cd o commit)。协调者参与者Can commit ?Pre commit ?OKD执行事务 但是不提交CommitOK提交事务J释放资源三阶段提交示意第一阶段:预询盘该阶段协调者会去询问各个参与者是否能够正常执行事 务,参与者根据自身情况回复一个预估值,相对于真正的 执行事务,这个过程是轻量的,具体步骤如下:1 .协调者向各个参与者发送事务询问通知,询问是否可以执行事务操作,并等待回 复;.各个参与者依据自身状况回复一个预估值,如果预估自己能够正常执行事务就返
10、回确定信息,并进入预备状态,否那么返回否认信息。第二阶段:预提交本阶段协调者会根据第一阶段的询盘结果采取相应操作,询盘结果主要有 3种:1 .所有的参与者都返回确定信息。2 . 一个或多个参与者返回否认信息。3 .协调者等待超时。针对第 1种情况,协调者会向所有参与者发送事务执行 请求,具体步骤如下:1 .协调者向所有的事务参与者发送事务执行通知;.参与者收到通知后执行事务但不提交;2 .参与者将事务执行情况返回给客户端。o针执行,状态,在对于骤口个步各2述向中第参出 发 者 与,为 时认 超者 待调 等协 者,t r o b a那么事请会务求务常备事正预断法出中无退具体步骤如下:1 .协调者
11、向所有事务参与者发送abort通知;.参与者收到通知后中断事务。协调者参与者集群1向所有参与者发送can commit请求,询问是否可以执行事务12如果存在一个或者多个参与者 一丕能执丘甥或置超过一2.向所有参与者发送abort通知收到通知或者等待超时执行中断第三阶段:事务提交如果第二阶段事务未中断,那么本阶段协调者将会依据事 务执行返回的结果来决定提交或回滚事务,分为 3种情 况:1 .所有的参与者都能正常执行事务。2 . 一个或多个参与者执行事务失败。3 .协调者等待超时。针对第 1种情况,协调者向各个参与者发起事务提交请 求,具体步骤如下:1 .协调者向所有参与者发送事务commit通知
12、;.所有参与者在收到通知之后执行commit操作,并释放占有的资源;2 .参与者向协调者反应事务提交结果。提交事务 释放资源提交事务 释放资源执行事务 但是不提交针对第 2和第 3种情况,协调者认为事务无法成功执 行,于是向各个参与者发送事务回滚请求,具体步骤如下:1.2. 协调者向所有参与者发送事务rollback通知; 所有参与者在收到通知之后执行rollback操作, 参与者向协调者反应事务回滚结果。并释放占有的资源;回滚事务 程放资源执行事务 但是不提交段来将阶到者本收与在能参续仍在继但存后所时塞中三性系然致际虽一实以强在如果因为协调者或网络问题,导致参与者迟迟不 自协调者的 comm
13、it 或 rollback 请求,那么 不会如两阶段提交中那样陷入阻塞,而是等待超commit,相对于两阶段提交虽然降低了同步阻 然无法完全防止数据的不一致。两阶段提交协议 的长时间阻塞状态发生的几率还是非常低的,所 阶段提交协议相对于两阶段提交协议对于数据 更有保障,但是因为效率问题,两阶段提交协议 统中反而更加受宠。TCC模式TCC是Try、Confirm 和 Cancel三个单词首字母缩写, 它们分别的职责是:Try :负责预留资源(比方新建一条状态二PENDING的订 单);做业务检查,简单来说就是不能预留已经被占用的 资源;隔离预留资源。Confirm :负责落地所预留的资源 真正的
14、执行业务使用 try阶段预留的资源,毒等。Cancel :负责撤销所预留的资源需要用户根据自己的业务场景实现 Try、Confirm 和 Cancel三个操作;事务发起方在一阶段执行 T ry 方式, 在二阶段提交执行 Confirm 方法,二阶段回滚执行 Cancel 方法。关于预留资源要多说两句,资源都是有限的,因此预留资 源都是有时效的,如果当预留资源迟迟得不到Confirm我们将这种情况称为timeout参与方会自行将其Cancel。也就是说参与方对于资源具有自我管理 能力,这样可以防止因发起方的问题导致资源被长期占用。T C C增加了业务检查和撤销事务的功能。同时,T C C将 2P
15、C数据库层面的动作提升到了服务层面,不同的是TCC 的所有动作都是一个本地事务,每个本地事务都在动作完 成后commit到数据库: Try相当于2PC的Commit request phase,外加了业务检查逻辑Confirm 相当于 2PC 的 Commit phase 的 commit 动作 Cancel 相当于 2PC 的 Commit phase 的 rollback 动作流程步骤:1.2.3.4.5.6.发起方发送Try到所有参与方每个参与方执行Try,预留资源发起方收到所有参与方的Try结果发起方发送Confirm/Cancel到所有参与房每个参与方执行Confirm/Cancel
16、发起方收到所有参与方的Confirm/Cancel结果在分布式中,对于一个结果,多处同时查询,得出的结果应 该是一致的。隔离性(Isolation)一个事务在未完成时,另一个事务不会影响到它,也就是如果B还给C转账1 0 0 0,记为事务2:事务1 = (A账号扣除500,B账号增加500)事务2 = (B账号扣除1000,C账号增加1000)这两个事务之间不会产生影响,也就是不会发生A转出的 5 0 0块到达C账号这种情况。持久性(Durability)持久化,一般是意味着将数据写入磁盘,不会轻易改变的 意思,这儿是事务提交之后,会影响到数据库,不会丧失。这 也就意味着,随着系统越来越庞大,
17、我们为了提高可用性、 维护性、吞吐量等等技术指标,就算改善原有架构,业务 计算的问题解决后,数据库还是会成为整个系统中的瓶颈。一致性的讨论ACID本质而言都是为了保护数据的一致性,而数据数据持 久化时会触发数据库操作,造成效率低小,所以围绕一致 性(效率)产生了一些讨论,分别是强一致性、弱一致性、 最终一致性。强一致性任何一次读都能读到某个数据的最近一次写的数据。系统 中的所有进程,看到的操作顺序,都和全局时钟下的顺序 一致。简言之,在任意时刻,所有节点中的数据是一样的, 这就要求数据一有改变就写到数据库。弱一致性数据更新后,不要求及时写会数据库以及同步到所有节点, 也就是这时候数据与真实数据
18、可能有一些出入,对于架构 而言,如果能容忍后续的访问只能访问到局部或者全部访 问不到,那么是弱一致性。最终一致性不保证在任意时刻任意节点上的同一份数据都是相同的, 也就是有些节点数据可能是准确的,有的可能是不准确的, 但是随着时间的迁移,不同节点上的同一份数据总是在向 趋同的方向变化。简单说,就是在一段时间后,节点间的 数据会最终到达一致状态。三种一致性中,强一致性数据更加可靠,但是由于时时刻 刻要求所有数据库保持数据一致,所以效率低下,数据没 有统一完,请求就没法得到响应,高并发场景下,体验不太 好,所以在实际使用中,根据不同的业务选择是一致性也 不同,购物时账号付钱肯定是强一致性,但是商品
19、库存数 据就不一定非要强一致性,至于商品下面的评论啥的,甚 至可以选择弱一致性。分库分表前面讲过集群的AKF拆分原那么(Redis集群拆分原那么之 AKF),大概意思是硬件性能是由上限的,当硬件没法支撑 请求流量时,可以将流量分发到不同的服务器上,AKF拆分 之Y轴、Z轴拆分是业务拆分与数据拆分,那也就会涉及 到将数据库中的数据拆分存储在不同的地方,这就叫分库 分表,不同类型数据存储在不同数据库中做多机存储和负 载,这样一来,传统的事务机制ACID便无法正常运行。分库分表内容是数据切分(Sharding),以及切分后对数 据的定位、整合。具体来说,数据切分就是将数据分散存 储到多个数据库中,使
20、得单一数据库中的数据量变小,通 过扩充主机的数量缓解单一数据库性能问题,从而到达提 升数据库操作性能的目的。数据切分根据其切分类型,可以分为两种方式:垂直(纵 向)切分和水平(横向)切分。垂直拆分垂直切分常见有垂直分库和垂直分表两种,两种含义类似。垂直分库就是根据业务耦合性,将关联度低的不同表存储 在不同的数据库。做法与大系统拆分为多个小系统类似, 按业务分类进行独立划分。与“微服务治理”的做法相似,每个微服务使用单独的一个数据库。如图:数据库纵向切分前后示意垂直分表类似,例如将一张表包含一个人所有信息,例如 姓名、身份证、性别、身高、体重、省、市、区、村、专 业、G点等等,那么可以拆分成三个
21、表:第一个表只包含基本信息(姓名、身份证、性别、身高、 体重);第二个表包含籍贯信息(省、市、区、村);第三个表包含学习信息(专业、G点)。垂直拆分优缺点垂直切分的优点: 解决业务系统层面的耦合,业务清晰与微服务的治理类似,也能对不同业务的数据进行分级管理、维护、监控、扩展 等 高并发场景下,垂直切分一定程度的提升10、数据库连接数、单机硬件资源的 瓶颈垂直切分的缺点:.局部表无法join,只能通过接口聚合方式解决,提升了开发的复杂度分布式事务处理复杂 依然存在单表数据量过大的问题(需要水平切分)水平拆分上面对数据库垂直拆分之后,如果某个库还是好大,比方 存储的数据极其庞大,那么可以再对数据库
22、进行水平的拆 分:数据库横向切分前后示意图上面的水平拆分时按照I D区间来切分。例如:将u s e r I d 为110000的记录分到第一个库,1000120000的分至I 第二个库,以此类推。某种意义上,某些系统中使用的” 冷热数据别离”,将一些使用较少的历史数据迁移到其他 库中,业务功能上只提供热点数据的查询,也是类似的实 践。除了上面按照用户ID区间拆分,也可以做Hash运算拆分, 这儿就不详细展开了。水平拆分优缺点水平拆分优点在于: 单表大小可控天然便于水平扩展,后期如果想对整个分片集群扩容时,只需要添加节点即可, 无需对其他分片的数据进行迁移 使用分片字段进行范围查找时,连续分片可
23、快速定位分片进行快速查询,有效避 免跨分片查询的问题。水平拆分缺点: 热点数据成为性能瓶颈。连续分片可能存在数据热点,例如按时间字段分片,有 些分片存储最近时间段内的数据,可能会被频繁的读写,而有些分片存储的历史 数据,那么很少被查询分库分表带来的问题分库分表能有效的缓解单机和单库带来的性能瓶颈和压 力,突破网络10、硬件资源、连接数的瓶颈,同时也带 来了一些问题,前面说过,事务包含一组子操作,这些造作 要么全部执行,要么全部不执行,但是分库之后,一个事务 可能涉及多个数据库或者多个表扩库执行,而网络具有不 稳定性,也就是事务执行难度加大,分表分库后事务为了 与传统事务做出区另h叫做分布式事务
24、(跨分片事务)。跨分片事务也是分布式事务,没有简单的方案,一般可 使用XA协议”和“两阶段提交”处理。分布式事务能最大限度保证了数据库操作的原子性。但在 提交事务时需要协调多个节点,推后了提交事务的时间点, 延长了事务的执行时间。导致事务在访问共享资源时发生 冲突或死锁的概率增高。随着数据库节点的增多,这种趋 势会越来越严重,从而成为系统在数据库层面上水平扩展 的枷锁。最终一致性对于那些性能要求很高,但对一致性要求不高的系统,往 往不苛求系统的实时一致性,只要在允许的时间段内到达 最终一致性即可,可采用事务补偿的方式。与事务在执行 中发生错误后立即回滚的方式不同,事务补偿是一种事后 检查补救的
25、措施,一些常见的实现方法有:对数据进行对 账检查,基于日志进行比照,定期同标准数据来源进行同 步等等。事务补归还要结合业务系统来考虑。分布式事务解决思路讲这个之前需要先简单回顾CAP原那么和Base理论,因为分 布式事务不同于 ACID 的刚性事务,在分布式场景下基 于 BASE 理论,提出了柔性事务的概念。要想通过柔性 事务来到达最终的一致性,就需要依赖于一些特性,这些 特性在具体的方案中不一定都要满足,因为不同的方案要 求不一样;但是都不满足的话,是不可能做柔性事务的。CAP原那么CAP 一般人可能听了不下一百遍了,很多人都说CAP是“ 三选二”的关系,让人误以为有AC这种情况,但是实际C
26、AP 是二选一的关系,这个在2012年已经有一篇论文进行解 释:C A P Twelve Years Later: How the Rules Have Changed相当于是对之前三选二说法进行修正,CAP中P(分区容错 性)是必须具备的,在满足P的前提下,很难同时满足A(可 用性)和C(一致性),但是在之后,又有一篇文章:Harvest, yield, and scalable tolerant systems,这篇 论 文 是基于 上 面那篇“CAP 12年后的论文写的,它主要提出了 Harvest 和 Yield概念,并把上面那篇论文中所讨论的东西讲得 更为仔细了 一些。简单来说就是满
27、足P之后工和A在放 宽约束后可以得到兼顾,并不是非此即彼的关系,说远了。为什么P是必须的?为什么C A P原那么中 么是分区容错性,分 很多的服务器,某一 分成了不同的区,假 交易:对分区一发 出消息:A给B转账分区瞬须 必 是 性 错 容 区络挪 网定 是稳 的不 说络 儿网 这可, 、1区转 个B 两给 了 A 成息 分消 设出元 O O 2出么果对 如元 候O 时10那么对于两个分区而言,有两种情况:a)无可用性,即这两笔交易至少会有一笔交易不会被接 受;b )无一致性,一半看到的是 A给B转账1 0 0元而另一 半那么看到 A给B转账2 0 0元。所以,分区容忍性必须要满 足,解决策略
28、是一个数据项复制到多个节点上,那么出现 分区之后,这一数据项就可能分布到各个区里。容忍性就 提高了。Base理论在很多时候,我们并不需要强一致性的系统,所以后来, 人们争论关于数据一致性和可用性时,主要是集中在强一 致性的 ACID 或最终一致性的 BASE中,BASE是对CAP 中一致性和可用性权衡的结果,其来源于对大规模互联网 分布式系统实践的总结,是基于CAP定律逐步演化而来。 其核心思想是即使无法做到强一致性,但每个应用都可以 根据自身业务特点,才用适当的方式来使系统打到最终一 致性。BASE 理论是 Basically Available(基本可用),Soft State (软状态)
29、和 Eventually Consistent (最终一致性)三个 短语的缩写。基本可用假设系统,出现了不可预知的故障,但还是能用,相比拟 正常的系统而言:1 .响应时间上的损失:正常情况下的搜索引擎0.5秒即返回给用户结果,而基本可 用的搜索引擎可以在2秒作用返回结果。2 .功能上的损失:在一个电商网站上,正常情况下,用户可以顺利完成每一笔订 单。但是到了大促期间,为了保护购物系统的稳定性,局部消费者可能会被引导 到一个降级页面。这就叫基本可用软状态状态。软状态指的是:允许系统中的数据存并认为该状态不影响系统的整体可用性,在多个不同节点的数据副本存在数据延时。在即最”态统性状期 种状系致软在
30、 一间许一说。 是中允终面限相对于原子性而言,要求多个节点的数据副本都是一致的,态,然后不可能一直是软状态,必须有个时间 限过后,应当保证所有副本保持数据一致性,从而到达数据的最终一致性。这个时间期限取决于网络延时、系统负载、数据复制方案设计等等因素。Base其核心思想是:既然无法做到强一致性(Strong consistency),但每个 应用都可以根据自身的业务特点,采用适当的方式来使系 统达至 II 最终一致,性(Eventual consistency)。 有了 Base 理论就可以开始讲述分布式事务的处理思路了。二阶段提交协议议务议节节参协事协各个和二阶段提交(2PC: Two-Ph
31、ase Commit),顾名思义,该 将一个分布式的事务过程拆分成两个阶段:投票和 提交。为了让整个数据库集群能够正常的运行,该 指定了一个协调者单点,用于协调整个数据库集群 点的运行。为了简化描述,我们将数据库集群中的各 点称为参与者,三阶段提交协议中同样包含协调者 与者这两个角色定义,后面再说。第一阶段:投票该阶段的主要目的在于打探数据库集群中的各个参与者是否能够正常的执行事务,具体步骤如下:1 .协调者向所有的参与者发送事务执行请求,并等待参与者反应事务执行结果;.事务参与者收到请求之后,执行事务但不提交,并记录事务日志;2 .参与者将自己事务执行情况反应给协调者,同时阻塞等待协调者的后续指令。第二阶段:事务提交在经过第一阶段协调者的询盘之后,各个参与者会回复自 己事务的执行情况,这时候存在 3种可能性:1 .所有的参与者都回复能够正常执行事务。2 . 一个或多个参与者回复事务执行失败。3 .协调者等待超时。对于第 1种情况,协调者将向所有的参与者发出提交事 务的通知,具体步骤如下:1 .协调者向各个参与者发送commit通知,请求提交事务;.参与者收到事务提交通知之后执行commit操作,然后释放占有的资源;2 .参与者向协调者返回事务commit结果信息。