前言
为什么选择Apache Cassandra?
Apache Cassandra 是一个免费、开源的分布式数据存储系统,与关系型数据库管理系统(relational database management systems,RDBMS)截然不同。
Cassandra 在2009 年1 月成为Apache 的一个孵化器项目。不久之后,Apache Cassandra 项目主席Jonathan Ellis 领导的提交者(committer)发布了Cassandra 0.3,并且此后一直稳步推进,不断发布新的小版本,直到里程碑版本3.0。从2017 年起,这个项目由Apache Cassandra 项目主席Nate McCall 领导,推出了3.1 版本,一直到最新的4.0 版本。Cassandra 已经被Web 领域的众多巨头用于生产环境,包括Facebook、Twitter 和Netflix。Cassandra 之所以越来越受到欢迎,很大程度上是因为它提供的出色的技术特性。它具有持久性、无缝可扩展性,以及可调一致性,可以非常快地执行写操作,存储数百TB 的数据,而且是去中心化的和对称的,所以不存在单点失效问题。此外,它还是高度可用的,提供了一个基于Cassandra 查询语言(Cassandra Query Language,CQL)的数据模型。
本书的读者对象
这本书适用各类人员,对以下读者都很有用。
• 大规模、高容量应用[ 比如Web 2.0 社交应用、电子商务网站、金融服务或基于传感器的物联网(IoT)系统] 的开发人员。
• 应用架构师或数据架构师,需要了解有哪些可用的高性能、去中心化、弹性数据库选择。
• 目前使用标准关系型数据库系统的数据库管理员或数据库开发人员,需要了解如何实现容错且最终一致的数据库。
• 希望了解Cassandra 的优势(和不足)的管理者,来帮助做出技术战略的有关决策。
• 正在设计Cassandra 或其他非关系型数据库相关项目的学生、分析师或研究人员。
这本书是一本技术指南。在很多方面,Cassandra 和其他NoSQL 数据库代表了一种考虑数据的新思路。很多在过去15~20 年间获得专业技能的开发人员十分精通以纯粹的关系或面向对象方式来考虑数据。Cassandra 的数据模型则完全不同,开始时可能很难理解,特别是有些人已经对数据库是什么(以及应该是什么)有了先入为主的想法,他们可能尤其难以接受。
使用Cassandra 并不意味着你必须是一个Java 开发人员。不过,Cassandra 是用Java写的,所以如果要深入分析源代码,扎实地理解Java 会非常重要。这本书中的很多例子都是用Java 写的。不过,已经提供了很多不同语言的Cassandra 驱动程序,包括Java、Node.js、Python、C#、PHP、Ruby 和Go。
最后,本书假设你已经了解Web 是如何工作的,能够使用集成开发环境(IDE),并对数据驱动应用的典型问题有所了解。你可能是一个经验丰富的开发人员或管理员,不过有时会遇到你不太熟悉的Cassandra 世界里使用的一些工具。比如使用Apache Ant 构建Cassandra,另外可以通过Git 获得Cassandra 源代码。有些时候我们认为你可能需要做自己的一些设置才能运行某些例子,这种情况下我们会特别说明。
本书的主要内容
这本书尽可能合理地把各章设计为独立的指南。对于一本关于Cassandra 的书,这一点很重要,因为读者可能有不同的工作角色,身处不同的行业。借用软件领域的一个说法,这本书设计为是“模块化”的。如果你刚接触Cassandra,可以按顺序阅读;如果你已经过了入门阶段,也可以在后面的章节中找到你需要的内容,每一章都可以作为一个独立的指南。
本书的结构如下:
第1 章,超越关系型数据库
这一章将回顾获得了极大成功的关系型数据库的历史,并介绍非关系型数据库
技术(如Cassandra)的蓬勃兴起。
第2 章,Cassandra 简介
这一章介绍Cassandra,并讨论它有哪些让人激动和不同寻常的地方,它来自哪里,另外有哪些优点。
第3 章,安装Cassandra
这一章会带着你安装和运行Cassandra,并尝试它的一些基本特性。
第4 章,Cassandra 查询语言
这一章介绍Cassandra 的数据模型,重点强调它与传统关系模型的区别。我们还会讨论如何用Cassandra 查询语言(CQL)表示这个数据模型。
第5 章,数据建模
这一章介绍Cassandra 中数据建模的原则和过程。我们会分析一个大家熟悉的领域,建立一个实际可用的模式。
第6 章,Cassandra 架构
这一章将帮助你了解读写操作时发生了什么,另外Cassandra 数据库如何实现它的一些突出特点,如持久性和高可用性。我们会深入地理解一些更复杂的内部工作,如gossip 协议、提示移交、读修复、Merkle 树等。
第7 章, 设计使用Cassandra 的应用
为了让Cassandra 架构概念更为具体,我们将研究在现代云应用的架构和设计中结合Cassandra 的一些常用方法。
第8 章,使用驱动程序开发应用
面向不同语言有很多驱动程序,包括Java、node.js、Python、Ruby、C# 和PHP,这些驱动程序对Cassandra 的底层API 提供了抽象。我们会帮助你了解如何利用常用驱动程序的特性用Cassandra 开发应用。
第9 章,读写数据
在前面各章的基础上,我们将学习Cassandra“在底层”是如何读写数据的,还会讨论批处理(batch)、轻量级事务和分页(paging)等概念。
第10 章,配置和部署Cassandra
这一章会介绍如何指定分区器、副本放置策略和snitch。我们会建立一个集群,并查看不同配置选择的影响。这一章会讨论规划集群部署的做法,包括使用Amazon、Microsoft 和Google 等提供商的混合云和多云部署,以及使用Docker和Kubernetes 部署和管理集群。
第11 章,监控
一旦建立和运行集群,可能需要监控集群的使用情况、内存模式和线程模式,了解它的一般活动。Cassandra 内置有一个功能丰富的Java 管理扩展(JMX)接口,可以用来监控所有这些方面以及其他一些方面。
第12 章,维护
利用服务器自带的一些工具可以让Cassandra 集群的持续维护变得更为容易。我们会介绍如何退服一个节点、实现集群的负载平衡、获得统计信息,以及完成其他日常的运维任务。
第13 章,性能调优
Cassandra 最突出的特性之一就是它的速度,Cassandra 非常快,不过还有很多方面可以优化来进一步提高性能,包括内存设置、数据存储、硬件选择、缓存,以及缓冲区大小。
第14 章,安全
NoSQL技术经常因为安全性方面的短板而遭到诟病。好在Cassandra 提供了认证、授权和加密特性,我们将在这一章学习如何配置这些特性。
第15 章,迁移和集成
在这本书的最后,将对你的企业采用Cassandra 所涉及的步骤做一个总结,我们将从关系数据库迁移到Cassandra 的角度来讨论,会介绍数据建模、应用开发和部署的有关问题,以及Cassandra 如何集成其他流行技术,包括:
• 流传输系统,如Apache Kafka。
• 搜索引擎,如Apache Lucene、Apache Solr 和ElasticSearch。
• 分析平台,如Apache Spark。
这本书中使用的Cassandra 版本
这本书使用了Apache Cassandra 4.0 和DataStax Java Driver 4.1。工具输出、日志文件、配置文件以及错误消息的格式和内容都采用4.0 版本中的形式,
将来的版本中可能会有改变。
讨论2.0 及以后版本增加的新特性时,我们会给出新增该特性的相应版本号,方便使用较早版本的读者考虑是否升级。
第三版新增内容
与第一版和第二版之间的时间跨度相比,第三版与上一个版本相隔没有那么远,不过还是有很多重要的变化需要指出:
成熟的数据库
软件工程社区的传统观点是一个新的数据库引擎需要5~10 年才能完全成熟。让人高兴的是,Cassandra 已经达到了这个成熟度里程碑,尽管4.0 版本肯定有一些稳定性和可用性方面的改进,不过大部分新特性都专注于如何让这个数据库更易于理解和维护。本书这一版涵盖的4.0 新特性包括:虚拟表(第11 章介绍)、审计日志(第14 章介绍)和变更数据捕获(第15 章介绍)。
云应用中结合Cassandra
使用Cassandra 的应用类型还在不断增长。为了帮助缩小概念与现实间的差距,我们为此专门增加了新的一章,即第7 章。我们还更新了第15 章,对结合使用Kafka 和Cassandra 的多种模式进行了讨论。
云部署中的变化
第二版出版时,尽管Docker 已经成为应用部署的一个流行选择,但在Docker上运行数据库还没有定论。在那之后,已经取得了足够多的进展,现在我们认为可以推荐在Docker 上部署Cassandra 了。Kubernetes 作为协调跨计算机集群的容器部署和维护的关键技术迅速崛起。在这一版中,我们更新了第10 章,增加了在Docker 上部署Cassandra 的指导说明,另外增加了Kubernetes 的内容以反映当前变化的格局。
排版约定
本书采用下述排版约定。
斜体(Italic)
表示新术语、URL、电子邮件地址、文件名和扩展名。
等宽字体(constant width)
表示程序清单,在段落中出现则表示程序元素,如变量、函数名、数据库、数据类型、环境变量、语句和关键字。
等宽粗体(constant width bold)
表示应该替换成用户提供的值,或者由上下文决定的值。
使用代码示例
本书中的代码示例可以从https://github.com/jeffreyscarpenter/cassandra-guide 和https://github.com/jeffreyscarpenter/reservation-service 下载。
本书的目的是要帮助你完成工作。一般来讲,你可以在你的程序和文档中使用这些代码,不需要联系我们来得到许可,除非你直接复制了大部分的代码。例如,如果你在编写一个程序,使用了本书中的多段代码,这并不需要得到许可。但是出售或发行O’Reilly 书示例代码则需要得到许可。回答问题时如果引用了这本书的文字和示例代码,不需要得到许可。但是如果你的产品的文档借用了本书中的大量示例代码,则需要得到许可。
我们希望但不严格要求标明引用出处。引用信息通常包括书名、作者、出版商和ISBN。例如“Cassandra: The Definitive Guide, Revised Edition, by Jeff Carpenter and Eben Hewitt(O’Reilly). Copyright2020 Jeff Carpenter, 978-1-492-09714-3”。
如果你认为你在使用代码示例时超出了合理使用范围或者上述许可范围,可以随时联系我们:permissions@oreilly.com。
O’Reilly 交互式Katacoda 场景
交互式Katacoda 场景模拟了真实世界生产环境,你可以一边学习一边在浏览器中编写和运行代码。本书作者开发了一组Katacoda 场景,使你能亲身实践这本书中所列的工具和做法。关于我们的交互式内容,更多信息可以访问http://oreilly.com,查看本书的电子版(ebook),并了解我们的学习平台提供的全部特性。
O’Reilly 在线学习平台(O’Reilly Online Learning)
近40 年来,O’Reilly Media 致力于提供技术和商业培训、知识和卓越见解,来帮助众多公司取得成功。
我们拥有独一无二的专家和革新者组成的庞大网络,他们通过图书、文章、会议和我们的在线学习平台分享他们的知识和经验。O’Reilly 的在线学习平台允许你按需访问现场培训课程、深入的学习路径、交互式编程环境,以及O’Reilly 和200 多家其他出版商提供的大量文本和视频资源。有关的更多信息,请访问http://oreilly.com。
联系我们
请把对本书的评价和问题发给出版社。
美国:
O’Reilly Media, Inc.
1005 Gravenstein Highway North
Sebastopol, CA 95472
中国:
北京市西城区西直门南大街2号成铭大厦C座807室(100035)
奥莱利技术咨询(北京)有限公司
针对本书我们还建有一个网页,列出了有关勘误、示例和其他信息。可以通过以下地址访问这个页面:https://oreil.ly/cassandra_revisedEd。
如果对这本书有什么意见, 或者询问技术上的问题, 请发送电子邮件至bookquestions@oreilly.com。
有关我们的图书、课程和新闻的更多信息,请访问我们的网站:http://www.oreilly.com。
我们的Facebook: http://facebook.com/oreilly。
我们的Twitter: http://twitter.com/oreillymedia。
我们的YouTube: http://www.youtube.com/oreillymedia。
致谢
我们要感谢很多非常优秀的人帮助这本书得以面世。
感谢我们的技术审校:Stu Hood、Robert Schneider 和Gary Dusbabek,你们为第一版贡献了很有见地的评论,另外感谢Andrew Baker、Ewan Elliot、Kirk Damron、Corey Cole、Jeff Jirsa、Chris Judson 和Patrick McFadin 审阅了第二版。第三版由Pankaj Gallar、Cedrick Lunven、Alex Ott 和Wei Deng 审校。
感谢Jonathan Ellis 和Patrick McFadin 分别为这本书的第一版和第二版作序,另外感谢Nate McCall 为第三版作序。
还要感谢Patrick 对第15 章“Spark 集成”一节的贡献。
感谢我们的编辑:Mike Loukides、Marie Beaugureau、Nicole Tache、Jess Haberman和Sarah Grey,感谢他们一直以来的支持,让这本书变得更好。
Jeff 还要感谢Eben 给予的信任,给他这个机会来更新这样一本享有盛誉的经典著作,另外感谢Eben 自始至终的鼓励。
最后,对Cassandra 做出贡献的很多了不起的开发人员也给了我们很大启发。向你们致敬,感谢你们建立了这样一个优秀而强大的数据库。