前言
如果你是一位软件行业从业者,尤其是从事服务器端或者后台系统软件开发,相信近年来一定被层出不穷的商业名词所包围:NoSQL、Big Data、Web-scale、Sharding、Eventual consistency、ACID、CAP理论、云服务、MapReduce和Real-time等,所有这些其实都围绕着如何构建高效存储与数据处理这一核心主题。
过去十年,在数据库领域与分布式系统方面涌现了许多引人瞩目的进展,由此深刻地影响了如何构建上层应用系统。分析这些激动人心的变化背后,你会发现有以下几个非常重要的驱动因素:
互联网公司,包括Google、Yahoo! 、Amazon、Facebook、LinkedIn、Microsoft,以及Twitter等,它们每天都在面对海量数据和负载,迫使其不断创新,并改进支撑系统以更有效地处理这种量级的数据。
商业方面因素,如敏捷开发、测试驱动和对市场机会做出快速反应等,都要求尽量缩短产品开发周期,因此系统中的数据模型也要足够灵活以方便调整。 免费及开源软件现在已经非常成功,在很多领域足以取代商业或者定制软件。
硬件方面,CPU主频增长日趋缓慢,而多核系统成为新常态,网络速度则依旧保持快速发展,这就意味着并行分布式系统将会成为业界主流。 如今一个不起眼的小公司,也完全有能力构建起大型分布式系统:跨机器甚至跨地域的数据中心,因为现在有了逐渐普及的IaaS云服务(例如AWS)。
很多服务现在都要求高可用。道理很简单,系统失效或者维护时间越长,其损失代价越大,甚至大到无法承受。正是由于这些技术,“数据密集型应用”(Data-Intensive Applications)把很多不可能变成了可能。那么什么算是“数据密集型”(data-intensive)呢?对于一个应用系统,如果“数据”是其成败决定性因素,包括数据的规模、数据的复杂度或者数据产生与变化的速率等,我们就可以称为“数据密集型应用系统”;与之对应的是计算密集型(Compute-Intensive),CPU主频往往是后者的制约瓶颈。目前已经有足够丰富的技术或者工具来辅助、帮助我们开发自己的数据密集型应用,包括存储、处理等方面,而这些技术本身也在快速演进之中。例如很多人在关注新的NoSQL系统,但实际上消息队列、缓存、搜索引擎、批处理与流处理框架等相关技术也非常重要,事实上,很多应用系统总是会集成组合上述多种技术。开篇所罗列的那一堆商业味颇浓的名词,某种程度上也彰显了当前大时代氛围,机会多自是好事。
然而,作为一名软件工程师或者架构师,仍需秉持严谨的态度,深入理解繁杂词汇背后系统设计所面临的优劣权衡,只有这样才能为我所用,构建好自己的系统。所以,抛开那些商业名词,我们要的是深入的探索。幸好,软件千变万化,终有若干理念贯穿其中。无论你用的什么数据系统,如果可以掌握背后的设计理念,何种工具适用于何种场景,如何使用,又有哪些陷阱(坑),诸如此类,自然会胸有成竹,而这也是本书写作的初衷。所以,本书旨在帮助大家更好地驾驭处理数据和存储数据相关技术。它不是针对某个特定软件的介绍手册,也不是纯理论的习题。我们会深入探讨一些成功的数据系统案例,剖析其中的技术要点;或许在很多流行的分布式系统里都有它们的身影,正是这些关键技术有效应对了许多生产环境对扩展性、性能和可靠性的苛刻要求。我们将对这些典型系统深入展开讨论,梳理其核心算法,探讨其设计理念和背后的权衡之道。在此过程中,尝试总结某些经验法则来重新审视系统架构。了解怎么工作自然重要,但更重要的是要思考它为什么这样工作,正所谓“知其然,知其所以然”。读完本书之后,你应该会对哪些技术适用于哪些场景,常见工具如何搭配来构建应用系统等有所得。或许你不会马上就决定动手开发一个全新的数据库引擎(这几乎完全不需要),但是,关于系统的本质,相信你一定有新的认识与判断力:系统行为是否合理,架构设计如果权衡,个中症状如何处理等,将会更加游刃有余。
本书适合哪些读者?首先你的应用如果包含服务器端、后台逻辑来存储、处理数据,或者你的应用需要联网,例如Web程序、移动程序以及联网的传感器等,这本书将非常适合。本书主要针对软件工程师、软件架构师以及技术经理等,特别是那些需要对系统架构做出权衡决定的人,例如需要选择一些工具和软件来解决特定问题,或者如何适用这些现有工具。退一步,如果不需要做这些决定,本书也可以帮助你更好地理解这些技术的优缺点。当然你好有一些Web程序或者网络程序的经验,了解一些基本的关系型数据和SQL;虽然不是必须,但如果通晓NoSQL或相关系统,那再好不过。如果有常见网络协议如TCP、HTTP等基本知识也会帮助很大。选择何种编程语言或者框架对于阅读本书没有太大影响。
如果以下若干条适用于你,可能会从本书中有所获益:
需要学习了解系统扩展性方面技术,例如支撑百万用户级的Web和移动程序。? 需要构建高可用(减少宕机影响)和健壮运行的系统 。
需要有效方法来提高长时间运行系统的可维护性,应对规模增长、技术和需求不断发生变化等。
对系统如何工作有种天然的兴趣或者探索精神,特别是大型Web和在线系统。
本书会例举若干典型数据库和数据处理、分析系统,对其设计亮点逐一展开分析,也是乐事一件。当我在介绍可扩展的系统时,有人会问:“我又不是Google或者Amazon,这些高大上的扩展性太遥远,老老实实用关系数据库就得了。”在特定语境下这的确有道理,打造一个根本不需要的扩展性系统是在浪费精力,而且会丧失其他方面的灵活性,这其实是种过早的优化。然而我要说,选择何种工具也很有讲究或者说极其重要,不同的技术各有优劣,事实上正如本书将要揭示的,关系数据库很重要,但它并非解决数据问题的终极方案。本书涵盖范围本书不会就如何安装、配置特定软件包或者API等做太多细节介绍,这方面已有足够多的文档。我们会着重探讨不同的设计理念以及如何权衡,这些通常才是系统的核心,也会例举实践中不同的系统产品终采用了哪些不同的理念。本书的电子版已包含所有在线资源的链接,这些链接在书稿付梓之时都做了验证,然而大家都能理解,这些网络链接可能在一段时间之后会失效。如果不巧碰到了失效的链接,或者阅读的是纸质版本,可以随时用搜索引擎来查询相关资料。对于学术论文,推荐用Google Scholar搜索文献标题来下载PDF版本,或者随时访问https://github.com/ept/ddia-references,我们维护了所有的链接。
本书主要关注数据处理系统架构方面以及如何集成到数据密集型应用系统中。而关于部署、运营、安全、管理等相关方面,当然也非常重要和足够复杂,不过它们并非本书的重点,也无意做些肤浅的、聊胜于无的介绍,我们认为它们值得单独成书。书中所涵盖的诸多技术总体都可以纳入到“大数据”的范畴。然而,大数据这个商业词汇有些过于滥用或者太模糊,不太适合在严谨的工程领域展开讨论。本书倾向于使用更加明确的用语,例如单节点、分布式系统,或者在线/交互式分析以及离线/批处理系统等。本书更偏爱免费及开源软件(Free and Open Source Software,FOSS),主要是通过源码阅读、必要的修改,然后实地执行可以帮助理解系统究竟是如何工作的,此外开放系统也能减少对特定供应商的锁定问题。当然,我们并非局限于此,也会讨论相关商业软件,这包括闭源、软件即服务(Software as a Service)或者一些只出现在文献里但并未公开发行的一些公司内部软件等。
本书内容安排全书分为三大部分:
部分,主要讨论有关增强数据密集型应用系统所需的若干基本原则。首先开篇第1章即瞄准目标:可靠性、可扩展性与可维护性,如何认识这些问题以及如何达成目标。第2章我们比较了多种不同的数据模型和查询语言,讨论各自的适用场景。接下来第3章主要针对存储引擎,即数据库是如何安排磁盘结构从而提高检索效率。第4章转向数据编码(序列化)方面,包括常见模式的演化历程。
第二部分,我们将从单机的数据存储转向跨机器的分布式系统,这是扩展性的重要一步,但随之而来的是各种挑战。所以将依次讨论数据远程复制(第5章)、数据分区(第6章)以及事务(第7章)。接下来的第8章包括分布式系统的更多细节,以及分布式环境如何达成一致性与共识(第9章)。
第三部分,主要针对产生派生数据的系统,所谓派生数据主要指在异构系统中,如果无法用一个数据源来解决所有问题,那么一种自然的方式就是集成多个不同的数据库、缓存模块以及索引模块等。首先第10章以批处理开始来处理派生数据,紧接着第11章采用流式处理。第12章总结之前介绍的多种技术,并分析讨论未来构建可靠、可扩展和可维护应用系统可能的新方向或方法。参考资料与进一步阅读书中所讨论的很多内容可能在其他地方以某种方式有所呈现,包括会议演讲、学术论文、博客、源代码、Bug追踪系统、邮件列表,或是工程师间的交流。本书试图汇集其中重要的精华呈现给读者,同时也附上相关原始出处的链接。每章后列出的参考索引是一个很好的资源,可以帮助更深入地去了解某一方面,而且这些内容绝大多数都可以在线访问。O’Reilly SafariSafari(之前的Safari Books Online)是一个针对企业、政府、教育工作者以及个人的会员制培训和参考平台。订阅者可以访问来自超过250个出版社的大量书籍、培训视频、学习路径、交互式教程,以及精选的播放列表,这些出版社包括 O’Reilly Media、Harvard Business Review、Prentice Hall Professional、Addison-Wesley Professional、Microsoft Press、Sams、Que、Peachpit Press、Adobe、Focal Press、Cisco Press、John Wiley & Sons、Syngress、Morgan Kaufmann、IBM Redbooks、Packt、AdobePress、FT Press、Apress、Manning、New Riders、McGraw-Hill、Jones & Bartlett等。更多信息请访问http://orieilly.com/safari。
联系我们请将关于本书的意见和问题通过以下地址提供给出版商:美国:O’Reilly Media, Inc.1005 Gravenstein Highway NorthSebastopol, CA 95472中国:北京市西城区西直门南大街2号成铭大厦C座807室(100035)奥莱利技术咨询(北京)有限公司针对这本书,我们还建有一个网页,列出了有关勘误、示例和其他信息。可以通过以下地址访问这个页面: http://bit.ly/designing-data-intensive-apps。有关本书技术方面的问题和评论,请联系bookquestions@oreilly.com。若想了解O’Reilly图书、培训课程、会议和新闻的更多信息,请访问我们的网站,地址是:http://www.oreilly.com,http://www.oreilly.com.cn。我们的Facebook: http://facebook.com/oreilly。我们的Twitter: http://twitter.com/oreillymedia。我们的YouTube: http://www.youtube.com/oreillymedia。致谢本书融合了学术研究和工程实践的很多经验,是大量他人思想、知识的融合与系统化。在计算机领域,人们往往会被新的东西所吸引,但我认为前人有很多优秀的工作和积累依然值得深入学习。
本书有超过800篇参考文献,包括论文、博客文章、演讲、产品文档等,对我来说他们都是本书非常宝贵的学习资源。 在此,我衷心感谢原作者们无私的知识分享。我也从很多交流对话中领悟颇多,感谢这些花费了大量时间与我讨论想法、耐心解释的朋友们。特别是要感谢Joe Adler、Ross Anderson、Peter Bailis、Márton、Balassi、Alastair Beresford、Mark Callaghan、Mat Clayton、Patrick Collison、Sean Cribbs、Shirshanka Das、Niklas Ekstr?m、Stephan Ewen、Alan Fekete、Gyula Fóra、Camille Fournier、Andres Freund、John Garbutt、Seth Gilbert、Tom Haggett、Pat Helland、Joe Hellerstein、Jakob Homan、Heidi Howard、John Hugg、Julian Hyde、Conrad Irwin、Evan Jones、Flavio Junqueira、Jessica Kerr、Kyle Kingsbury、Jay Kreps、Carl Lerche、Nicolas Liochon、Steve Loughran、Lee Mallabone、Nathan Marz、 Caitie McCaffrey、Josie McLellan、Christopher Meiklejohn、Ian Meyers、Neha Narkhede、Neha Narula、Cathy O’Neil、Onora O’Neil、Ludovic Orban、Zoran Perkov、Julia Powles、Chris Riccomini、Henry Robinson、David Rosenthal、Jennifer Rullmann、Matthew Sackman、Martin Scholl、Amit Sela、Gwen Shapira、Greg Spurrier、Sam Stokes、Ben Stopford、Tom Stuart、Diana Vasile、Rahul Vohra、Pete Warden和Brett Wooldridge。还有些朋友认真阅读了本书草稿并提供了反馈,这对本书的终成形帮助很大,在此也衷心感谢,他们是Raul Agepati、Tyler Akidau、Mattias Andersson、Sasha Baranov、Veena Basavaraj、David Beyer、Jim Brikman、Paul Carey、Raul Castro Fernandez、Joseph Chow、Derek Elkins、Sam Elliott、Alexander Gallego、Mark Grover、Stu Halloway、Heidi Howard、Nicola Kleppmann、Stefan Kruppa、Bjorn Madsen、Sander Mak、Stefan Podkowinski、Phil Potter、Hamid Ramazani、Sam Stokes和Ben Summers。
当然,对于本书的任何错误或者问题,由我本人承担全部责任。非常感谢编辑Marie Beaugureau、Mike Loukides、Ann Spencer和O’Reilly的所有团队,他们忍耐着我缓慢的写作进度以及各种要求,为这本书付出了很多心血。同时感谢Rachel Head,为本书润色不少。我要感谢Alastair Beresford、Susan Goodhue、Neha Narkhede和Kevin Scott,尽管我还有其他的工作安排,但他们给了我非常大的写作时间和自由。特别感谢Shabbir Diwan和Edie Freedman,他们为每章配上了细致的前导地图。这个想法非常棒,用创造性的地图方式来展示内容脉络,终效果非常漂亮和酷炫!
后,感谢我的家人与朋友,没有他们的支持,我肯定无法熬过这漫长的四年写作过程。你们是我的挚爱!
导语摘要
全书分为三大部分:
- 主要讨论有关增强数据密集型应用系统所需的若干基本原则。首先开篇第1章即瞄准目标:可靠性、可扩展性与可维护性,如何认识这些问题以及如何达成目标。第2章我们比较了多种不同的数据模型和查询语言,讨论各自的适用场景。接下来第3章主要针对存储引擎,即数据库是如何安排磁盘结构从而提高检索效率。第4章转向数据编码(序列化)方面,包括常见模式的演化历程。
- 我们将从单机的数据存储转向跨机器的分布式系统,这是扩展性的重要一步,但随之而来的是各种挑战。所以将依次讨论数据远程复制(第5章)、数据分区(第6章)以及事务(第7章)。接下来的第8章包括分布式系统的更多细节,以及分布式环境如何达成一致性与共识(第9章)。
- 主要针对产生派生数据的系统,所谓派生数据主要指在异构系统中,如果无法用一个数据源来解决所有问题,那么一种自然的方式就是集成多个不同的数据库、缓存模块以及索引模块等。首先第10章以批处理开始来处理派生数据,紧接着第11章采用流式处理。第12章总结之前介绍的多种技术,并分析讨论未来构建可靠、可扩展和可维护应用系统可能的新方向或方法。
作者简介
Martin Kleppmann是英国剑桥大学分布式系统方向的研究员。此前,他曾是LinkedIn和Rapportive等互联网公司的软件工程师,负责大规模数据基础设施建设。在此过程中他遇到过一些困难,因此他希望这本书能够帮助读者避免重蹈覆辙。Martin还是一位活跃的会议演讲者、博主和开源贡献者。他认为,每个人都应该学习深刻的技术理念,对技术的深入理解能帮助我们开发出更好的软件。
赵军平, 大数据存储与分析资深开发者与推广者(EMC 10余年),GPU异构计算的亲历者。中国计算机协会专家委员,DELL EMC资深架构师。12年系统研发、创新与团队管理经验,擅长数据存储与保护, 云计算与大数据实时分析,GPU异构加速优化等。相关领域已申请中、美技术专利100余项,并多次在SNIA,LinuxConf,Hadoop Summit, Nvidia GPU Tech Conf等做技术分享,持续关注数据密集和计算密集相关技术的演进、融合与赋能推广。
吕云松,北京大学计算机硕士,硕士及DELL EMC中国研究院实习期间专注于大数据实时流式处理相关的研究。现就职于华为2012中软院黎曼实验室,主要从事深度学习的研发。耿煜,DELL EMC架构师兼GTM负责人,致力于推广企业级数字化转型方案。深耕分布式架构以及云计算12年,先后任职于ChinaCache,Sun Microsystems以及EMC等公司。
李三平,美国麻省大学计算机工程专业博士,DELL EMC中国研究院首席科学家,研究方向为机器学习、深度学习、智能运维、遥感影像等。已在IEEE Transactions期刊和会议上发表论文数十篇,申请美国专利20余项。推崇简约,热衷机器学习。《机械制图(附习题集)》,中国电力出版社,2012.8 《机械制图课程设计指导书(第二版)》,中国电力出版社,2012.8
目录
前言
1部分 数据系统基础
第1章 可靠、可扩展与可维护的应用系统
认识数据系统
可靠性
可扩展性
可维护性
小结
第2章 数据模型与查询语言
关系模型与文档模型
数据查询语言
图状数据模型
小结
第3章 数据存储与检索
数据库核心:数据结构
事务处理与分析处理
列式存储
小结
第4章 数据编码与演化
数据编码格式
数据流模式
小结
第二部分 分布式数据系统
第5章 数据复制
主节点与从节点
复制滞后问题
多主节点复制
无主节点复制
小结
第6章 数据分区
189数据分区与数据复制
键-值数据的分区
分区与二级索引
分区再平衡
请求路由
小结
第7章 事务
深入理解事务
弱隔离级别
串行化
小结
第8章 分布式系统的挑战
故障与部分失效
不可靠的网络
不可靠的时钟
知识,真相与谎言
小结
第9章 一致性与共识
一致性保证
可线性化
顺序保证
分布式事务与共识
小结
第三部分 派生数据第
10章 批处理系统
使用UNIX工具进行批处理
MapReduce与分布式文件系统
超越MapReduce
小结
第11章 流处理系统<
— 没有更多了 —
以下为对购买帮助不大的评价