编者按:数据服务的高可用是全部企业都想拥有的,可是要想让数据有高可用性,就须要冗余数据写多份。写多份的问题会带来一致性的问题,而一致性的问题又会带来性能问题,这就会陷入一个无解的死循环!这里所谓数据一致性,就是当多个用户试图同时访问一个数据库时,若是它们的事务同时使用相同的数据,可能会发生如下四种状况:丢失更新、未肯定的相关性、不一致的分析和幻像读。阿里巴巴北京研发中心、商家业务部任资深专家陈皓的博客《分布式系统的事务处理》一文对此作了详细的描述,推荐给你们。如下是做者原文:数据库
在生产线上用一台服务器来提供数据服务的时候,常常会遇到以下的两个问题:安全
面对这些问题,咱们不得不对服务器进行扩展,加入更多的机器来分担性能问题,以及解决单点故障问题。一般,咱们会经过两种手段来扩展咱们的数据服务:服务器
使用第一种方案,没法解决数据丢失问题,单台服务器出问题时,必定会有部分数据丢失。因此,数据服务的高可用性只能经过第二种方法来完成——数据的冗余存储(通常工业界认为比较安全的备份数应该是3份,如:Hadoop和Dynamo)。 可是,加入的机器越多数据就会变得越复杂,尤为是跨服务器的事务处理,也就是跨服务器的数据一致性。这个是一个很难的问题!让咱们用最经典的Use Case:“A账号向B账号汇钱”来讲明一下,熟悉RDBMS事务的都知道从账号A到账号B须要6个操做:微信
为了数据的一致性,这6件事,要么都成功作完,要么都不成功,并且这个操做的过程当中,对A、B账号的其它访问必需锁死,所谓锁死就是要排除其它的读写操做,否则会有脏数据问题,这就是事务。可是,在加入了多个机器后,这个事情会变得复杂起来:网络
同时,咱们还要考虑性能因素,若是不考虑性能的话,事务完成并不困难,系统慢一点就好了。除了考虑性能外,咱们还要考虑可用性,也就是说,一台机器没了,数据不丢失,服务可由别的机器继续提供。 因而,咱们须要重点考虑下面的这么几个状况:并发
前面说过,要解决数据不丢,只能经过数据冗余的方法,就算是数据分区,每一个区也须要进行数据冗余处理。这就是数据副本:当出现某个节点的数据丢失时能够从副本读到,数据副本是分布式系统解决数据丢失异常的惟一手段。因此,在这篇文章中,咱们只讨论在数据冗余状况下考虑数据的一致性和性能的问题。简单说来:异步
这就是软件开发,按下了葫芦起了瓢。分布式
提及数据一致性来讲,简单说有三种类型(固然,若是细分的话,还有不少一致性模型,如:顺序一致性,FIFO一致性,会话一致性,单读一致性,单写一致性,但为了本文的简单易读,我只说下面三种):oop
从这三种一致型的模型上来讲,咱们能够看到,Weak和Eventually通常来讲是异步冗余的,而Strong通常来讲是同步冗余的,异步的一般意味着更好的性能,但也意味着更复杂的状态控制;同步意味着简单,但也意味着性能降低。性能
插入一条笔记:
以前看多阿里大神程立的一个关于分布式事务的文档,目前使用较多的分布式事务解决方案有几种: 1、结合MQ消息中间件实现的可靠消息最终一致性 2、TCC补偿性事务解决方案 3、最大努力通知型方案 第一种方案:可靠消息最终一致性,须要业务系统结合MQ消息中间件实现,在实现过程当中须要保证消息的成功发送及成功消费。即须要经过业务系统控制MQ的消息状态 第二种方案:TCC补偿性,分为三个阶段TRYING-CONFIRMING-CANCELING。每一个阶段作不一样的处理。 TRYING阶段主要是对业务系统进行检测及资源预留 CONFIRMING阶段是作业务提交,经过TRYING阶段执行成功后,再执行该阶段。默认若是TRYING阶段执行成功,CONFIRMING就必定能成功。 CANCELING阶段是回对业务作回滚,在TRYING阶段中,若是存在分支事务TRYING失败,则须要调用CANCELING将已预留的资源进行释放。 第三种方案:最大努力通知xing型,这种方案主要用在与第三方系统通信时,好比:调用微信或支付宝支付后的支付结果通知。这种方案也是结合MQ进行实现,例如:经过MQ发送http请求,设置最大通知次数。达到通知次数后即再也不通知。 具体的案例你也能够参考下这篇博客,它上面的这个案例就是结合电商支付作的系统分布式事务实现案例:http://www.roncoo.com/article/detail/124243