一文教你迅速解决分布式事务 XA 一致性问题
作者:腾讯云数据库团队 2017-09-04 14:46:10众所周知,一个事务所做的更新,分布式数据库系统内部多个独立的数据节点完成(每个节点的本地事务是这个全局事务的一个事务分支),在这样一个全局事务提交期间,有可能某些事务分支无法成功提交。
近日,腾讯云发布了分布式数据库解决方案(DCDB),其最明显的特性之一就是提供了高于开源分布式事务XA的性能。大型业务系统有着用户多、并发高的特点,在这方面,集中式数据库(单机数据库)的性能很难支持,因此主流的互联网公司往往采用分布式(架构)数据库,物理上利用更多的低端设备,逻辑上对大表水平拆分支撑业务的需要。
虽然分布式数据库能解决性能难题,但事务一致性(Consistency)的问题,却很难在分布式数据库上得到解决。
分布式事务老大难题
数据一致难以实现
众所周知,一个事务所做的更新,分布式数据库系统内部多个独立的数据节点完成(每个节点的本地事务是这个全局事务的一个事务分支),在这样一个全局事务提交期间,有可能某些事务分支无法成功提交。
针对这一问题,虽然业内早已存在理论解决方案——二阶段提交协议(简称2PC),并延伸出分布式事务(简称XA)的解决方案。但业内却少有工程化实现且大规模应用的案例。而腾讯云分布式数据库DCDB,却已在内部业务中应用多年。
(图:二阶段提交算法)
目前DCDB已应用在腾讯内部90%以上的交易、计费业务,并且三一重工(树根互联)、汇通天下(G7)、阅文集团(起点/创世中文网等)、微众银行、和泰人寿、威富通等都在该产品。
腾讯云首发分布式数据库XA
支持MySQL 5.7
腾讯云分布式数据库DCDB,是基于腾讯金融级数据库(公司内部代号TDSQL)云化改造而来的兼容MySQL协议的分布式数据库。现如今,腾讯云DCDB已经正式在MySQL 5.7(percona分支)协议上支持分布式事务XA,并已在腾讯云公有云、金融云发布供开发者使用。开发者可以通过申请DCDB实例,并在初始化后,连接实例运行如下sql进行初始化:
为更好的支持分布式事务,DCDB还新增了SQL命令:
1)SELECT gtid(),获取当前分布式事务的gtid(事务的全局唯一性标识),如果该事务不是分布式事务则返回空;
2)SELECT gtid_state(“gtid”),获取“gtid”的状态,可能的结果有:
1) 一个小时之后查询,标识事务状态已经清除
2) 一个小时以内查询,标识事务最终会被回滚
3) 运维命令:
以Python为例,可以对转账业务进行如下编码:
分布式事务的好处在于会大大降低应用开发难度,因为在某些不支持XA的数据库中,需要业务系统通过特殊并且巧妙的设计,而非利用数据库来解决事务中数据不一致等问题。这种对应用开发者的技术水平要求很高,越是复杂的业务系统,越会增加开发成本和技术门槛,这是业内大多数开发者面对分布式数据库时,只能望而却步的主要原因。
腾讯云DCDB XA关键实现方案
1、DCDB架构介绍
腾讯云DCDB整个集群架构简图如下图,MySQL采用主从节点配置(也叫作主备)一套主从节点叫做SET,在每一个SET外配置网关(TProxy),形成一个物理分片(Shard)。
DCDB后端是MySQL(或其分支版本)数据库,目前腾讯云公有云发布支持XA的版本是基于MySQL 5.7.17(percona分支)。
2、网关(TProxy)与XA
网关是用于接收请求并与后端MySQL建立连接的网络模块。网关可以用两种模式工作,一种称为noshard,此模式下网关不处理/不解析SQL语句,透明转发请求和应答。另一种模式称为shard(分布式,即支持自动水平分表)模式下,TProxy会解析SQL并转发到不同的数据分片。
在实现XA之前,网关不允许在一个事务中向多个SET发送DML语句。因为未实现二阶段提交(2PC)时,事务采用一阶段提交,如果分布式中某一个SET提交失败了或回滚了,那么这个分布式事务就处于不一致的状态。
(网关的工作方式)
二阶段提交中需要的事务管理器(TM)。为了解决容灾、简化架构,腾讯云DCDB将TM实现在TProxy中,而DCDB的网关是一个无状态的模块,通过这一架构,DCDB XA可以支持:
(1)、分布式事务对业务透明,兼容单机事务语法(start transaction/commit/rollback/savepoint);
(2)、每个网关都可以独立接受和处理事务请求,且无需与其他网关进行协调节点故障不丢失事务;
(3)、允许显式事务中多条语句分别发给多个分片;
(4)、网关无需持久状态,无需容灾,可以随时经由调度集群退出或加入集群,且性能可以扩展;
(5)、支持autocommit下单条语句写访问多个分片等。
DCDB网关还允许以流式处理方式运行group by、order by,流式处理让这类操作变得非常方式非常高效;网关还支持两个Shard使用shardkey(分表键)做等值连接,以及使用shardkey的子查询。
未来,腾讯云还计划支持分布式JOIN、Sparksql、二级分区等高级功能,兼容更多MySQL高级语法。
3、强同步与XA
由于腾讯云DCDB默认采用强同步复制,即主从节点数据完全一致,因此XA事务也遵循强同步的逻辑,即需等待从机确认数据同步后,才给业务以应答(commit)。基于强同步,在以下两种异常情况下,DCDB XA可轻松应对。
(1)、主节点故障时,已确认事务数据不会丢失:主节点故障那么拥有***数据和binlog的从机就被选为主节点,这其中的数据也包括所有已经向用户确认完成提交的事务的数据。
(2)、原主节点恢复后重新加入集群,未确认事务自动闪回:原主节点恢复重新接入集群,它将作为从机运行,此时他可能存留多余的已提交事务(此时事务并未得到强同步同步确认,即原备机并没有相关数据),那么这些事务会被闪回。虽然这些事务可能已经在原主节点的MySQL内部完成提交,但由于强同步机制,他并不会向客户端返回commit语句,这意味着仍被视为一个未完成的事务。因此,这些事务的闪回了也并没有破坏数据库的ACID属性。这里值得说的是,闪回flashback是基于binlog生成做逆操作,它与数据库回滚并不同rollback,闪回可以做DDL操作。
腾讯云DCDB的强同步为腾讯金融级数据库自研的一项能力,性能比官方半同步大幅提高,几乎等于异步复制性能,腾讯云DCDB在腾讯内部应用多年,未发生过一起因为主从切换、故障带来的数据误差。而且,从性能上,也撑住了腾讯公司各类大型运营活动如红包、各类游戏大型推广等海量并发,其主要原因是强同步采用异步提交/等待方式,且不占用数据库工作线程。
4、并发控制与隔离级别
为了达到数据一致性和性能的平衡,分布式事务的关键是数据库隔离控制。XA的隔离级别***可以达到serializable(完全串行化),该级别将不存在幻读的问题,serializable级别可以通过设置SET global tx_isolation=’serializable’来对DCDB所有物理分片(和其上承载的mysql数据库)进行设置。当然,也可以通过调整隔离级别以调整数据库实例性能,理论上,Read Uncommitted性能***,但可能存在脏读、幻读的情况。
ANSI/ISO定义的SQL-92
标准定义的四种隔离级别
5、分布式事务处理算法
前面讲到,腾讯云DCDB的网关在shard模式下已经能够解析SQL语句,腾讯云在网关上实现TM以使得XA***效率。为此,我们在网关中实现TM中的协调器(coordinator),并在网关中维护每个XA的状态,记录好每个XA写入的SET,然后在提交阶段做两阶段提交即可,大致流程如下:
(1)、网关在执行一个事务的insert/update/delete语句时,会记录这个语句修改了哪个SET;
(2)、SET时会发送一个XA START在这个SET上面启动事务分支;(注:XA事务开始时,并不确认事务将以哪种提交方式执行,因此总是以xa start来开启一个事务);
(3)、检测是否影响SET个数≤1,若是,则直接做一阶段提交(xa commit one phase)。
(4)、影响SET个数≥2,则改为做两阶段提交:
1)网关首先发送xa prepare‘gtid’ 给参与的SET(大于等于2个SET);
2)SET接受到xa prepare应答ok(表示成功确认);
3)收到成功确认后,写入XA对应的commit log,再发送xa commit‘gtid’参与SET;
4)如果有SET返回了错误,或者写入commit log失败,那么网关发送 xa rollback‘gtid’给相关SET,这样这个全局事务就实现了回滚。
腾讯云DCDB的commit log是在SET中存储,这个步骤是批量完成的——网关后台线程会汇集正在提交的分布式事务然后在独立的连接和事务中完成对每个SET的写入,并且每个事务的commit log只写入一个SET中,因而这个开销并没有显著增加事务的提交耗时或者降低TPS。而且,依赖腾讯云DCDB已有的强同步和容灾特性,只要XA成功写入了commit log,就意味着数据已经写入从机。
虽然绝大多数的XA事务可以正常执行。但极少数的异常情况还是会影响整个集群稳定性,因此,腾讯云设计了agent(监控模块),在故障后继续协助完成本地MySQL上面prepared事务的提交,即agent会解析commit log,并根据异常处理本地仍然处于prepared的事务数据;如果commit log上面没有事务的提交决定的话,agent也会回滚超时未被提交的prepared本地事务。
虽然在MySQL 5.5、5.6等版本早已实现XA,但这两个版本相对于5.7仍然有性能不足,因此腾讯云目前只在公有云上基于5.7.17支持XA版本。如今,腾讯云在MySQL 、percona、MariaDB等分支中做了大量优化和相关bug修复(部分已经提交到社区修复patch或开源),未来腾讯云还将继续致力于新特性的开发和相关Bug的修复,为众多有需要的企业,提供更好的分布式数据库支持。
原文链接:
戳这里,看该作者更多好文
如何考察当前的创业项目
项目注意事项:1)做好充分的心理准备 首先,加盟者应该在思想上、精神上做好充分的准备。 选择创业,就意味着为自己打拼事业,身上的责任与替别人打工相比是不可同日而语的。 开店是比较累的,首先要作好吃苦的打算,世界上没有不付出就得到的好事。 开店前要认真的思考自己的性格是否适合创业,自己的兴趣爱好是否在此。 (2)谨慎选择行业和品牌 选择一个正确的加盟项目,无疑是加盟事业的一个好开端。 首先你要做的是,问问自己的优势是什么,劣势是什么。 就行业和品牌的选择,一般来说,可以采用以下几种方法: 一是注重市场调查、市场的分析预测。 要仔细考察下当地同行业的店铺生意状况如何,在一个好的行业市场背景下顺势而为将会比逆势而上更能轻松创业致富。 二是尽力选择自己熟悉的行业和掌握相关知识的行业,作为投资目标,要充分发挥自身所掌握的知识和技能,把其作为选择投资项目的一个有利条件。 三是如果不能选择一个自己熟悉的行业进行创业,那么选择一个好的适合自己,能给予自己开店强大持续支持的加盟连锁总部就变得非常重要。 好品牌与差品牌往往有很大的差距。 以在目前较为火爆流行的中档饰品加盟行业为例,来自英伦的乔伊丝饰品为什么会受到缺乏创业经验的加盟创业者的青睐呢?因为乔伊丝品牌很清楚自己与加盟商的唇齿相依的关系,把对加盟商的事业发展给予全面支持提到了战略层面的高度。 尤其是进入中国市场后,乔伊丝饰品知道只有做到与加盟商的形神合一,才能确保连锁体系的稳固与发展。 因此,在分析了中国加盟商的普遍弱点后,乔伊丝饰品专门调整了其对加盟商的管理体系,使其能更好的支持加盟商。 比如,针对大多数加盟商经验不足的情况,乔伊丝饰品大大加强了对加盟商的培训力度,扩展了培训范围,延长了培训时间。 就如何开店选址、如何进行店面装修、如何进行商品陈列、如何促销、如何处理顾客的关系、如何进行人员的招聘、以及如何进行店面的宣传推广等等问题一一向加盟商进行了全方位的培训。 之外,乔伊丝饰品提供的极其先进的物流供货系统,使加盟商可以及时的拿货、调货,真正解决了加盟商的后顾之忧。 而其他细节上的点点滴滴,也是不胜枚举。 (3)筹集资金 当你初步选定了加盟项目,接着要解决的问题就是筹集资金。 因为筹集资金不利,有很多人开店的念头成为泡影。 那么,如何合理的筹集资金呢?首先,个人存款是主要的资金来源。 因此,如果有开店的准备,平时就要注意节约,尽量多存一些开店启动资金。 其次是亲朋借款。 如果你有一些先富起来的朋友或亲戚,他们就是最理想的借钱对象了。 不过,跟他们借贷时,应该向他们详细的介绍你的开店计划,使他们对你今后的还款能力有信心。 最好明确说好偿还借款的期限和利息,写好借据,否则也会出现矛盾,损害感情。 如果开店所需资金比较多,也可以考虑银行贷款。 但是,一般来说,申请银行贷款不是很容易,需要你有房产、地产等作为抵押。 之外,选择一些前期投入较少,行业前景较为景气、开店之后能迅速得到资金回笼的项目也非常重要。 (4)店面选址 店址的选择,是加盟者的一项长期投资,关系着加盟店未来的经济效益和发展前景,两个同行业同规模的商店,即使商品构成、服务水平、管理水平、促销手段等方面大致相同,但仅仅由于所处的地址不同,经营效益就可能有很大的区别。 选址一定要注意因行制宜。 营业地点的选择与营业内容及潜在客户群息息相关,各行各业均有不同的特性和消费对象,据乔伊丝饰品市场选址部门介绍,黄金地段并不就是他们开店选址唯一的选择,他们通常为加盟商提供较多开创性的选址指导培训。 在加盟总部的指导下选择最合适本行业本品牌的店址才是最重要的。 有的店铺开在闹市区,生意还不如开在相对偏僻一些的特定区域。 例如卖油盐酱醋的小店,开在居民区内生意肯定要比开在闹市区好;又如文具用品店,开在黄金地段也显然不如开在文教区理想。 所以一定要根据不同的经营行业和项目来确定最佳的开店地点,要选择合适的店面,并不是越热闹的地方越好,关键是要因行制宜。 加盟者一定要知道自己的顾客是属于哪一类型,哪一地点能吸引哪些消费者,做到心中有数,才不会盲目选择。 (5)人员招募、培训 好的员工,对于一家加盟店来说有着如虎添翼的作用,因此人员的招募和培训都非常重要。 在人员招募时,最好能以最少的成本找到最合适的员工。 加盟者可以通过在加盟店旁张贴招聘启事,或者通过朋友熟人介绍。 要与候选人进行详谈,观察其言行举止,找出最适合的员工。 同时,加盟者应该利用总部的资源,对员工进行必要的培训,让他们了解连锁加盟的基本概念,熟悉产品的特点和功效,掌握基本的销售技巧。 一个训练有素的员工会是加盟者得力的助手,为加盟者减少很多的烦恼。 (6)前期宣传 宣传是现代商战中必不可少的手段,同时也是加盟店先声夺人的最有利武器。 开店的宣传活动是经营者根据营业方针的设定,并配合营业的具体策略,在开店前所展开的一系列活动。 宣传活动的内容包括宣传主题、宣传标语、媒体的运用、企划活动的配合等等,针对消费者进行诱导,以塑造新店铺的形象。 一般来说,加盟品牌自身会有一系列的宣传活动,以保持其品牌的知名度。 但是,每家加盟店开业前,仍然需要相应的前期宣传,使加盟店开业后达到最好的营业效果。 加盟者通常需要在开店前一段时间就展开加盟店的宣传,以便将整个开店信息告知消费者,使开店当日就能有一个很好的销售状况。
多媒体通信需要掌握哪些必备知识?
常用的典型应用程序有数据库查找,计算器或者估算工具等。 例如,邮政系统的呼叫中心经常要查找关于邮寄价格的信息,以前需要在十几页预先计算好的表中查找。 开发一个小的程序,这个过程就能被一个很简单的只需指明点击的邮寄价格计算器取代。 2.8集成CRM和知识管理系统客户关系管理是关于了解你的客户和他们的需求的系统,它是和知识管理系统的运作紧密结合在一起的:来自客户的统计资料可以帮你确认知识库中的信息都是正确的跟踪客户的问题是确定FAQ(常见问题)的最好方法在CRM系统中,FAQ应该很容易访问,以保证快速反馈知识管理系统中的信息应该根据CRM系统中的用户群组进行重新组织CRM系统中的升级处理应该和知识管理的流程结合在一起通过知识库收集的使用统计可以发现顾客关注的热点信息,这对组织CRM活动而言是很有价值的信息来源。 2.9集成Help Desk和知识管理系统多数Help Desk和二线支持团队都有呼叫记录系统,可以跟踪所报告问题的处理状态。 在这个基础上,可以开发一个常见问题及其解决方案库(一些呼叫记录软件可能已经有这样的功能)。 这样就避免了大量知识只存在于Help Desk员工的脑袋中,也可以保证提供给一线员工的信息的一致性。 这个库同样也是一线员工的重要信息来源,可以把最常见的问题进行整理,写出来以处理方法或过程的形式提供给一线员工。 同时,这样的处理有助于减少转到Help Desk的简单问题呼叫,减轻Help Desk员工的工作压力,能使他们把更多的精力集中到一些复杂问题上。 2.10集成IVR和知识管理系统很多呼叫中心装备有IVR(自动语音应答)系统,可以把呼入转到合适的队列中或者是一个复杂的电话事务处理系统上。 通过IVR和知识管理系统的集成可以:保证IVR中提供的信息和知识库信息的一致性收集IVR使用的详细信息,可以了解用户感兴趣的领域给呼叫中心的员工提供IVR的详细脚本,帮助他们顺利地接听电话IVR系统一般是用户和呼叫中心接触的第一步,必须给予足够的重视,和其他各种形式发布的信息保持一致。 2.11 面向客户的资源很多呼叫中心除了传统的电话呼入外也开始处理网上和email的询问。 面对增加的责任,呼叫中心也要加强这方面工作的管理。 可以通过以下一些方式利用呼叫中心的知识库:选择一些客户问题(FAQ)发布到网站上确保网站上发布的产品和销售信息是全面准确的,这可以减少针对这些问题的呼入针对一些通用问题和网上询问准备一份标准回复。 现在也已经有一些分析email内容自动选择回复的解决方案。 最重要的是提供个用户的信息是从呼叫中心员工使用的同一个知识库中提取的(也可以理解为单一信息源),这样就有效避免了重复和错误,同时降低了维护成本。 3 结论呼叫中心的主要任务是尽快地向用户提供他们需要的信息。 要实现这一目标,呼叫中心的知识资源应该统一集中管理。 知识管理已经有很多工具和方法可以满足这一要求,可以考查一下看看哪些可以在你的组织中使用。 采用所有必要的措施确保员工可以访问到准确、及时、易用、全面的信息。 这些工作的回报不仅仅是对呼叫中心的,也包括你的用户。
历史上将该皇帝统治时期的社会景象称为什么
“开元盛世”是指中国唐玄宗在位期间的一段盛世。 唐玄宗在位44年,玄宗治国之道以道家清静无为思想为宗提倡文教。 唐玄宗在位前期政治清明,励精图治,任用贤能,经济迅速发展,使得天下大治,唐朝进入全盛时期,因当时年号为“开元”,史称“开元盛世”。
发表评论