转载

探讨实际应用中的一致性:Uwe Friedrichsen为读者所推荐的学术论文

在不久前于德国柏林举办的 microXchg 2016大会上,Uwe Friedrichsen举办了一场名为“ 探讨实际应用中的一致性 ”(real-world consistency explained)的演讲,对该主题进行了深入的探究。Friedrichsen在演讲中引用了多篇学术论文中的内容,探讨了ACID与BASE的比较。他相信,众多开发者或许没有仍没有完全理解典型的SQL数据库在一致性方面的保证,也不了解一致性模型的实现应当扩展到分布式(微服务)系统的应用层代码中。

Friedrichsen 是来自codecentric AG的一位Technical Fellow,InfoQ与其进行了一次访谈,对他在演讲中所陈述的内容进行了更深入的探讨。这次访谈的主要收获包括通过怎样的学习路径才能够更好地理解一致性这一主题;实现一种贯穿整个系统(而不仅仅停留在数据存储的层面)的正确的一致性模型的重要性;以及存储级内存(Storage-Class Memory,SCM)及远程直接内存存取(Remote Direct Memory Access,RDMA)等新兴技术为我们对一致性的看法可能产生的影响。

InfoQ:你好Uwe,感谢你今天能够接受InfoQ的访问。你是否能为我们讲解一下你在microXchg的演讲中所表达的基本思想,以及你为听众分享这些知识的动力何在?

这个问题很难回答,促使我进行这次演讲的原因来自于一系列的见解,因此很难用两三句话回答你的问题。但我还是愿意尽力尝试一下,我的回答可能会很长,在此首先表示歉意。

当我们谈到一致性时,多数人脑海中只会想到两种模型(包括我本人在很长一段时间内也是如此):即强一致性与弱一致性,前者通常基于非分布式系统中的 ACID 事务,而后者通常基于分布式系统中的 BASE 事务。此外,人们可能也会想到 Paxos 或类似的产品,它将强一致性的概念扩展到了分布式系统的领域中。

对于开发者来说,这就意味着你的编程模型也许非常简单,却无法适应大规模的分布式系统;又或者你的编程模型能够适用于分布式系统,却因此变得极为复杂。根据我观察的结果,后一种模型在项目中往往会遇到许多问题,因为使用者往往没有充分地理解BASE事务及其本质。多数开发者在创建BASE事务时都会进行种种一致性方面的假设,而这些假设往往是错误的,一方面是开发者缺乏相应的知识,一方面则由于其底层编程模型对开发者的思维方式带来了很大的冲击。

在这种情况下,我偶然间看到了 Peter Bailis 所编写的几篇非常有趣的论文。这些论文的一个主体思想是:在不牺牲可伸缩性/可用性(这两者基本上是一个概念)的前提下,你能够获得多大程度上的一致性?这几篇论文中所表达的思想非常吸引人。在上文所描述的两种一致性模型之间,Peter Bailis与其他合作者还展现了大量其他的一致性模型,每种模型都展现了不同的一致性保证,其中许多模型同时也保证了高可用性(即可伸缩性)。

由于每一种额外的一致性保证都能够大大简化开发者的工作,并且其中的大多数还能够保证高可用,因此我决定进行深入的探索。我阅读了大量在分布式系统中实现一致性的其他论文,虽然这些论文中所展现的具体实现在商业性软件开发中还显得有些不够成熟,但某种趋势已经非常明显了:即为开发者提供更好的一致性保证,也就是说为他们提供一种更易于掌握的编程模型,并且无需牺牲高可用性或低延迟性。

除了我从这几篇论文中所收获的见解之外,还有另外两个原因促使我举办了这次演讲。在我深入研究一致性这一主题时所阅读的大量论文中,有部分论文对于ACID一致性模型进行了深入剖析,这使我想起了多年前我曾经学过,但在这些年逐渐忘却的知识:当我们谈到ACID事务时,我们通常所想到的其实是这一概念最为人熟知的变种,即串行化事务。串行化事务的一大优点在于它易于推理。在讨论事务时,这正是最完美的一致性模型,也是我们最容易想到的一种模型:首先启动一个事务,完成某些任务,最后进行提交。整个过程要么完全成功,要么完全失败,不可能出现任何不一致与异常,确实是一种强大的模型。

但是,实际应用中的ACID实际上很少意味着串行化事务。ANSI SQL标准定义了多种隔离(即一致性)级别,而串行化则是其中最强的一种级别。串行化的问题在于它往往会带来很大的性能问题,因此很少有生产环境中的服务器会运行串行化隔离级别。这也意味着即使你应用了ACID事务,也一样会在生产环境中遇到异常情况,但大多数开发者并没有意识到这一点。多数开发者在脑海中构建的模型与实际情况的差异性会带来生产环境中的各种问题,其发生频率往往超出大多数人的想象。

最后一个动力是我经过长期观察后在数据存储这一领域(但不仅限于这一领域)发现的一种不好的趋势,也就是“适合所有情形的通用做法”这种思想。大约十年前,所有人都在尝试使用关系型数据库解决问题。如今,随着NoSQL的兴起,新的选择也出现在我们面前,它帮助我们弥补了关系型数据库的不足。但不幸的是,在关系型数据库大行其道时产生的“适合所有情形的通用做法”这种习惯也被继承了下来:最初,Hadoop成了万能药,随后变为MongoDB,而如今,每个人又转而投入Cassandra的怀抱。

虽然以上这些数据库在某些领域的确表现出了强大的功能,但他们并不属于通用目的、能适用于任何不同场景的解决方案。在选择合适的数据存储系统时,需要对诸多方面的因素进行考量,例如所需的一致性模型、数据模型的丰富程度、查询模型的丰富程度、可伸缩性以及其他多种因素。没有任何一种数据库能够满足所有方面的需求。因此,必须谨慎地选择最适合系统需求的数据库。而在存储需求方面的多样性也需要解决方案领域的多样性。

以上几点是促使我在microXchg上进行这次演讲的动力所在。正如我所担心的一样,这个回答确实太长了,但我实在无法用两三句话表达清楚……

InfoQ:你曾提到,演讲中的许多内容都是受Adrian Colyer的“ Morning Paper ”博客中的系列文章所影响而产生的。你是否是该博客的忠实读者呢?若是如此,你又是否建议开发者或架构师去阅读一些学术性的论文呢?

是的,我在news feed中订阅Adrian的“Morning paper”这个优秀的博客已有接近一年的时间了。在此之前,我只会偶尔去阅读这个博客。如果说他的博客有什么不足之处,那就是他会经常介绍一些非常有趣的论文,并且他的博客原文通常也是非常出色的,因此阅读他的博客是一大时间杀手……但你所付出的时间是绝对值得的。

如果开发者真心希望对某个主题进行深入钻研,那么我会推荐他去阅读学术论文。实际上,在很多情况下,这些论文是优秀的深度内容的唯一来源。如果你首次接触某个主题,那么你可以从相关书籍、在线教程或是网络课堂开始学习。而一旦你决定更进一步,你可能会参考某些博客文章或是“专家级”的讲座或文章。但对于真正深入的研究来说,你必须挖掘其基本概念,并逐步攀登高峰,而这些内容往往只在学术论文中才得以涵盖,至少对于分布式系统来说是如此。

InfoQ:在演讲中,你提到ACID或许是一种优秀的编程模型,但该模型的实际实现可能会有各种不同的变化。你能否为我们具体解释一下?

在我对你的第一个问题的回答中,我已经部分回答了这个问题。要点在于,传统上对于ACID事务的理解通常是指串行化事务(即“理想型事务”),但由于串行化隔离会对性能造成巨大的压力,因此多数数据库都选择实现某种较弱的隔离级别。也就是说,在设计与实现应用时,我们在脑海中所构想的是一种理想的事务模型,而忽略了事实往往并非如此理想,而是有可能出现各种异常情况。因此,所创建的应用程序可能会出现各种不知道如何处理的数据异常情况,这也造成了应用在生产环境中会出现各种“奇怪的”问题,并且由于无人知晓他们发生的原因,因此也无人能够处理这些问题。

InfoQ:在谈到“当今”在实际应用中的一致性时,你提到云计算、微服务、NoSQL与BASE是这一课题中的重要条目。在你看来,在进行典型的项目开发中,例如在设计可伸缩性或数据存储访问的保证时,设计者对于一致性模型是否给予了足够的重视?

按照我的观察来看,答案是没有。

在我看来,这方面的缺失是由多种因素所造成的。首先是人们在这方面知识的匮乏。不过,我并不打算指责任何人。要充分地理解一致性需要克服很大的挑战,尤其是在分布式系统中更为明显。它往往需要人们进行观念上的转变,需要大量的时间才能够真正地掌握。另一方面,开发者与架构师每天的工作都排得很满:堆积如山的需求、项目干系人之间完全相反的观点、不可妥协的期限、不断涌现的新技术、以及各种无意义的工作报告。他们哪里还有时间去深入探索一致性的挑战呢?正因如此,人们对于一致性的理解往往是十分肤浅的。

此外,如果你不满足于Pat Helland在他那篇著名的论文“ 超越分布式事务的方法 ”[PDF](Life beyond distributed transactions)中所描述的最终一致性,而希望在分布式系统中获得更好的一致性保证,那么仅靠数据存储引擎是无法实现这一点的。为了在分布式系统中实现最大的可用性,应用程序本身与底层的系统,例如数据库等等需要进行密切配合。这就表示不能将一致性完全交给数据存储系统去实现,而必须在应用中进行明确的设计。Pat Helland在另一篇著名的论文“ 在流沙上打造你的应用 ”[PDF](Building on quicksand)中清晰地描述了这一观点。

这也意味着我们必须明确地设定一致性保证,让应用程序的操作符合业务的需求。为了找到正确的一致性级别,我们必须与项目干系人就这一主题进行讨论,而这一点往往意味着很大的挑战。最后(但并非最不重要),我们还必须在应用层面与数据存取层面实现这种一致性模型,而这对于大多数设计师与开发者来说同样充满了挑战。

如果考虑到上文所说的缺少时间的因素,我们就会发现多数开发者没有足够的时间去设想并设计一种能够提供更好一致性模型的系统,而更好一致性的模型意味着极大简化的编程模型、而后者又意味着能够节约开发者大量的时间……造成这种结果是不幸的,但我们对这种问题已经司空见惯了,并且不仅仅限于一致性方面而已。

InfoQ:你是否能够为我们介绍一下目前对于一致性模型方面的一些“前沿”技术的探索?内存与存储的发展趋势又将如何演变?

研究方向之一是“在不牺牲高可用性(包括可伸缩性)的前提下,分布式系统能够实现何种程度的一致性?”实际上,这方面的结论已经很清晰了。最好的结果是因果一致性(causal consistency),这需要你接受粘滞的高可用性(这也意味着客户需要将它的请求始终发送给数据存储系统的同一个节点)。目前的研究方向主要集中在如何找到更好的办法以实现纯粹的最终一致性与因果一致性之间的一致性模型,让它更易于理解、更易于使用、更高效并且更具通用性。目前这方面的解决方案还无法适用于商业软件的开发,但我很期待未来这方面的进步。

另一方面,人们对于在具有低延迟特性的分布式系统中实现强一致性模型也进行了大量研究工作。我们首先要接受这一点:强一致性的系统无法实现高可用性。因此,努力的方向主要在于让系统更高效与更快速。考虑到某些用例要求强一致性,并且强一致性编程模型比弱一致性编程要简单许多,因此这也是一个很有价值的研究方向。

除了这些研究趋势之外,新的内存与存储技术也在不断涌现。 存储级内存 (SCM)的出现填补了RAM与SSD之间的缺失,它为我们提供了持久性的内存,在最好的情况下,它能够具有与当今的RAM相同级别的速度。此外, RDMA (远程DMA)的各种实现也逐渐出现,它可以访问远程机器的RAM,而绕开CPU的限制。虽然它仍然无法达到访问本地RAM的速度,但它比起本地SSD的访问仍然快了两个数量级(约80-100倍)。

这两个存储方面的新趋势为系统的架构以及应用的架构带来了许多新的选项,这有可能带来一些革命性的突破。自从计算机系统出现以来,我们就接受了以下关系:CPU速度远大于易失性(volatile)内存的速度,后者又远大于持久性内存的速度。因此,我们为了保证CPU始终处于工作状态付出了极大的努力,在CPU与持久性内存之间进行了大量的缓存(归根结底,RAM就是另一层缓存而已),并且在架构中通过各种手段确保CPU的最大化利用。随着新型存储趋势的发展,旧的关系不再是颠扑不破的真理:我们现在需要大量的CPU以使我们的存储设备达到饱和,这将使大量“已证实的知识”成为过时的内容。

实际上,我也不清楚这种发展趋势会带来怎样的变化,但我确信的是,与现有的存储限制相比,新的系统架构与应用架构对于新的存储限制将有更好的适应性。它对于分布式系统中的一致性模型也将产生重大的意义,但实际上我认为它所产生的影响将远不止新的一致性选择这么简单。我们很可能最终会以全新的方式设计并实现新的应用。

InfoQ:如果读者对于学习当前与未来的一致性模型的更多知识有着强烈的意愿,尤其是了解应用层的需求与创建编程模型所付出的精力之间的关系,你是否能够为读者推荐一些文章,或是某种形式的“速成课程”或指南?

当然了,请欣赏我在 microXchg上的演讲 ……开个玩笑。目前为止,我还没有找到能够以简洁的方式介绍这一主题的材料。为了准备这些演讲,我参考了大约40篇论文,并且在 幻灯片 中列举了大约20篇引用材料(在幻灯片的第55-57页)。

因此,很遗憾,我无法为你提供一份简洁的速成课程或是类似的材料。我只能为你提供关于这些引用材料的一份简短的指南,你也可以在我的幻灯片中找到它。以下是该指南的内容:

我会首先阅读由Pat Helland和Dave Campell撰写的“在流沙上打造你的应用”这篇论文。它为你指出了为什么需要在应用操作层面处理一致性的基础原理。如果读者不理解基本的原因所在,也就无法理解进一步的原理,这也是我推荐读者首先阅读本文的原因。

接下来我会选择阅读Adrian Colyer的“ Out of the Fire Swamp ”博客系列文章,其中很好地总结了目前正在进行的一些研究方向。

接下来,我会阅读由Peter Bailis等人所撰写的“ 高可用事务的优点与制约 ”(Highly Available Transactions: Virtues and Limitations)这篇论文,其中定义了一致性树的模型。以及由Hal Berenson所编写的“ 对于ANSI SQL隔离级别的批判 ”(A Critique of ANSI SQL Isolation Levels),其中对于ACID事务的限制进行了详细的描述。Adrian Colyer在最新推出的“Morning paper”系列文章中对于这些论文中的概念也进行了很好的总结。

通过阅读这些论文与博客文章,读者应了解了核心的基础。在此之后,读者可以自行进行深入研究,可以参考我在幻灯片中列举的其余参考资料,或是在以上论文或博客文章中所引用的参考资料。

InfoQ:再次感谢你今天能够接受我们的采访!你还有哪些内容想与InfoQ的读者分享吗?

非常感谢!虽然我们仅仅触及了这一主题的表面,还有许多内容来不及与读者进行分享,但我想这些内容已经很多了!

我希望今天的对话能够激起读者的好奇心,并在这一主题中进行更深入的钻研。

读者可以在microXchg大会的YouTube专属频道上欣赏Uwe Friedrichsen在本次大会上所做的演讲“ 探讨实际应用中的一致性 ”的视频。

查看英文原文: Real-World Consistency Explained: Uwe Friedrichsen Discusses His Favourite Academic Papers

原文  http://www.infoq.com/cn/news/2016/03/real-world-consistency
正文到此结束
Loading...