You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

108 lines
14 KiB
Markdown

2 years ago
# 04 | 架构风格NewSQL和PGXC到底有啥不一样
你好我是王磊你也可以叫我Ivan。
分布式数据库已经是技术新潮流了,所以产品也越来越多,如果你要做技术选型或者想要学习,该如何下手呢?怎么能更高效地了解不同产品的特点呢?这就需要你把它们分分类,有些差不多的产品,熟悉了其中的一个,剩下的我们只要记下差异点就可以了。那下面的问题就是如何分类了,这个其实很简单,因为业界已经有共识,把产品按照架构风格划分到不同的阵营。
总的来说分布式数据库大多可以分为两种架构风格一种是NewSQL它的代表系统是Google Spanner另一种是从单体数据库中间件基础上演进出来的被称为Prxoy风格没有公认的代表系统。我觉得Prxoy这个名字太笼统没有反映架构的全貌还是要有一个具体的架构模板才能便于你理解所以我选了一个出现较早的产品来指代这种风格这就是PostgreSQL-XC下文简称PGXC
我在后面的课程中讲述分布式数据库的特性和原理的时候,也会沿着这两种架构风格的思路,帮助你去迅速抓住不同产品的要点。因此,我们今天就先用一讲来学习下这两种架构风格。
## 数据库的基本架构
要搞清楚分布式数据库的架构风格,就要先了解“数据库”的架构。当然,我们这里说的数据库仍然默认是关系型数据库。我们先通过一张架构图看看数据库的全貌。
![](https://static001.geekbang.org/resource/image/02/66/0224c515b201a42725a5ed3ce9a3c366.jpg)
这张图从约瑟夫 · 海勒斯坦(Joseph M. Hellerstein)等人的论文“[Architecture of a Database System](https://dsf.berkeley.edu/papers/fntdb07-architecture.pdf)”中翻译而来。文中将数据库从逻辑上拆分为5个部分分别是客户端通讯管理器(Client Communications Manager)、查询处理器Relational Query Processor、事务存储管理器Transactional Storage Manager、进程管理器Process Manager和共享组件与工具(Shared Components and Utilities),每个部分下面又可以拆分成一些组件。
你在各种数据库产品中都能找到这5个部分的对应实现比如Oracle、DB2、SQL Server和MySQL无一例外。下面我依次介绍下这5个部分的功能。
1. **客户端通讯管理器。**这是应用开发者能够直观感受到的模块通常我们使用JDBC或者ODBC协议访问数据库时连接的就是这个部分。
2. **进程管理器。**连接建好了数据库会为客户端分配一个进程客户端后续发送的所有操作都会通过对应的进程来执行。当然这里的进程只是大致的说法。事实上Oracle和PostgreSQL是进程的方式而MySQL使用的则是线程。还有进程与客户也不都是简单的一对一关系但这部分功能不会影响你对分布式数据库的理解可以略过。
3. **查询处理器。**它包括四个部分功能上是顺序执行的。首先是解析器它将接收到的SQL解析为内部的语法树。然后是查询重写Query Rewrite它也被称为逻辑优化主要是依据关系代数的等价变换达到简化和标准化的目的比如会消除重复条件或去掉一些无意义谓词 还有将视图替换为表等操作。再往后就是查询算法优化Query Optimizer它也被称为物理优化主要是根据表连接方式、连接顺序和排序等技术进行优化我们常说的基于规则优化RBO和基于代价优化CBO就在这部分。最后就是计划执行器Plan Executor最终执行查询计划访问存储系统。
4. **事务存储管理器。**它包括四个部分其中访问方式Access Methods是指数据在磁盘的具体存储形式。锁管理Lock Manager是指并发控制。日志管理Log Manager是确保数据的持久性。缓存管理Buffer Manager则是指I/O操作相关的缓存控制。
5. **共享组件和工具。**在整个过程中还会涉及到的一些辅助操作当然它们对于数据库的运行也是非常重要的。例如编目数据管理器Catalog Manager会记录数据库的表、字段、视图等元数据信息并根据这些信息来操作具体数据内容。复制机制Replication也很重要它是实现系统高可靠性的基础在单体数据库中通过主备节点复制的方式来实现数据的复制。
到这里你应该对数据库的运行过程有了一个大致的理解这样就能够串接起后续要讲到的PGXC和NewSQL两种架构风格的关键功能了。当然数据库本身的运行机制是比较复杂的就算只是其中的一个具体模块我们用整整一讲都不一定能够说清楚。如果你希望进一步了解的话可以仔细研读约瑟夫 · 海勒斯坦的这篇论文。
## PGXC单体数据库的自然演进
单体数据库的功能看似已经很完善了,但在面临高并发场景的时候,还是会碰到写入性能不足的问题,很难解决。因此,也就有了向分布式数据库演进的动力。要解决写入性能不足的问题,大家首先想到的,最简单直接的办法就是分库分表。
分库分表方案就是在多个单体数据库之前增加代理节点本质上是增加了SQL路由功能。这样代理节点首先解析客户端请求再根据数据的分布情况将请求转发到对应的单体数据库。
![](https://static001.geekbang.org/resource/image/1b/91/1b2f74aa08e35b6fa326065fc5527391.jpg)
代理节点需要实现三个主要功能,它们分别是客户端接入、简单的查询处理器和进程管理中的访问控制。
另外分库分表方案还有一个重要的功能那就是分片信息管理分片信息就是数据分布情况是区别于编目数据的一种元数据。不过考虑到分片信息也存在多副本的一致性的问题大多数情况下它会独立出来更详细的原因我在第7讲中展开说明。
显然,如果把每一次的事务写入都限制在一个单体数据库内,业务场景就会很受局限。因此,跨库事务成为必不可少的功能,但是单体数据库是不感知这个事情的,所以我们就要在代理节点增加分布式事务组件。
同时,简单的分库分表不能满足全局性的查询需求,因为每个数据节点只能看到一部分数据,有些查询运算是无法处理的,比如排序、多表关联等。所以,代理节点要增强查询计算能力,支持跨多个单体数据库的查询。
随着分布式事务和跨节点查询等功能的加入,代理节点已经不再只是简单的路由功能,更多时候会被称为协调节点。
![](https://static001.geekbang.org/resource/image/fa/2f/fa871c7ecb1b2f327e1261775a512f2f.jpg)
很多分库分表方案会演进到这个阶段比如MyCat。这时离分布式数据库还差重要的一步就是全局时钟。我们在[第2讲](https://time.geekbang.org/column/article/272104)已经介绍了全局时钟的意义,它是实现数据一致性的必要条件。
加上这最后一块拼图PGXC区别于单体数据库的功能也就介绍完整了它们是分片、分布式事务、跨节点查询和全局时钟。
![](https://static001.geekbang.org/resource/image/2a/4e/2a698e380e08621a2e3b7196ebdcf54e.jpg)
协调节点与数据节点实现了一定程度上的计算与存储分离这也是所有分布式数据库的一个架构基调。但是因为PGXC的数据节点本身就是完整的单体数据库所以也具备很强的计算能力。
说了这么多PGXC风格的分布式数据库到底包括哪些产品呢PGXCPostgreSQL-XC的本意是指一种以PostgreSQL为内核的开源分布式数据库。因为PostgreSQL的影响力和开放的软件版权协议类似BSD很多厂商在PGXC上二次开发推出自己的产品。不过这些改动都没有变更主体架构风格所以我把这类产品统称为PGXC风格其中包括TBase、GuassDB 300和AntDB等。当然这里所说的PGXC并不限于以PostgreSQL为内核那些以MySQL为内核的产品往往也会采用同样的架构例如GoldenDB所以我把它们也归入了PGXC风格。
## NewSQL革命性的新架构
相对于PGXCNewSQL有着完全不同的发展路线。NewSQL也叫原生分布式数据库我觉得这个名字能更准确地体现这类架构风格的特点就是说它的每个组件在设计之初都是基于分布式架构的不像PGXC那样带有明显的单体架构痕迹。
NewSQL的基础是NoSQL更具体地说是类似BigTable的分布式键值K/V系统。分布式键值系统选择做了一个减法完全放弃了数据库事务处理能力然后将重点放在对存储和写入能力的扩展上这个能力扩展的基础就是分片。引入分片的另一个好处是系统能够以更小的粒度调度数据实现各节点上的存储平衡和访问负载平衡。
分布式键值系统由于具备这些鲜明的特点所以在不少细分场景获得了成功比如电商网站对于商品信息的存储但在面对大量的事务处理场景时就无能为力了比如支付系统。这种状况直到Google Spanner横空出世才被改变因为Spanner基于BigTable构建了新的事务能力。
除了上述内容NewSQL还有两个重要的革新分别出现在高可靠机制和存储引擎的设计上。
高可靠机制的变化在于放弃了粒度更大的主从复制转而以分片为单位采用Paxos或Raft等共识算法。这样NewSQL就实现了更小粒度的高可靠单元获得了更高的系统整体可靠性。存储引擎层面则是使用LSM-Tree模型替换B+ Tree模型大幅提升了写入性能。
由于NewSQL在架构上的革新性产品实现的难度比PGXC要大所以产品就相对少一些。Spanner是NewSQL的开山鼻祖这个不用说了其他知名度比较高的产品有CockroachDB、TiDB和YugabyteDB这三款数据库都宣称设计灵感来自Spanner另外就是阿里自研的OceanBase因为它有一个代理层有时会被同行质疑但是从整体架构风格看我还是愿意把它归为NewSQL。
![](https://static001.geekbang.org/resource/image/67/87/67b03095173a1cf570cdeec485b7aa87.jpg)
从系统架构上看我个人认为NewSQL的设计思想更加领先具有里程碑意义而PGXC的架构偏于保守。但PGXC的优势则在于稳健直接采用单机数据库作为数据节点大幅降低了工程开发的工作量也减少了引入风险的机会。总的来说NewSQL的长处在架构设计PGXC的长处则在工程实现。
当然NewSQL的架构设计也不是完美无缺。比如作为一个计算与存储分离得更加彻底的架构NewSQL的计算节点需要借助网络才能与存储节点通讯这意味着要花费更大的代价来传输数据。随着NewSQL分布式数据库的应用实践越来越多很多产品为了获得更好的计算性能会尽量将更多计算下压到存储节点执行。这种架构上的修正似乎也可以理解为NewSQL朝PGXC的方向做了一点回拨。
## 小结
关于分布式数据库的两种架构风格,我们今天就先学到这里了。最后,我们再一起复习下今天的重点内容。
1. 从架构上数据库可以被拆分为5个部分分别是客户端通讯管理器、进程管理器、查询处理器、事务存储管理器和共享组件与工具。分布式数据库在此基础上增加四个主要功能包括分片信息管理、分布式事务管理、跨节点查询和全局时钟。
2. PGXC架构是从分库分表方案演进而来的。它设置了协调节点在代理功能的基础上增加了分布式事务管理、跨节点查询功能原有的单体数据继续作为数据节点新增了全局时钟和分片信息管理两个功能这两个功能又有两种实现情况一是拆分为两个独立角色节点例如GoldenDB二是合并为一个角色节点例如TBase。
3. NewSQL架构是原生分布式数据库架构中的每个层次的设计都是以分布式为目标。NewSQL是从分布式键值系统演进而来主要的工作负载由计算节点和存储节点承担另外由管理节点承担全局时钟和分片信息管理功能。不过这三类节点是逻辑功能上划分在设计实现层面是可分可合的。比如TiDB是分为独立节点CockroachDB则是对等的P2P架构。
4. NewSQL在架构上更加领先而PGXC最大程度复用了单体数据库的工程实现更加稳健。
今天我们从单体数据库架构出发简单介绍了PGXC和NewSQL两种架构。为了帮助你迅速地把握要点在内容上我专门挑选了那些最能体现与单体数据库差异的部分。不过这些内容尚不足以完全解释数据库的整体运作原理但对于你理解两种架构风格的分布式数据库产品的基本框架足够了。如果你想更彻底、更全面地了解数据库架构我建议你仔细研读“Architecture of a Database System”和另一本非常值得阅读的经典教材《数据库系统实现》。
![](https://static001.geekbang.org/resource/image/ba/77/bac0b877eb2dd6abf0f6921a28d76f77.jpg)
## 思考题
按照惯例最后是思考题时间。今天我们介绍了两种不同的架构风格你会将自己熟悉的分布式数据库归入哪一类呢或者如果你有熟悉的NoSQL产品可以和NewSQL比较一下谈谈它们架构上的差异。
欢迎你在评论区留言和我一起讨论,我会在答疑篇和你继续探讨这个问题。如果你身边的朋友也对分布式数据库的架构风格感兴趣,你也可以把今天这一讲分享给他,我们一起讨论。
## 学习资料
Joseph M. Hellerstein et al.[_Architecture of a Database System_](https://dsf.berkeley.edu/papers/fntdb07-architecture.pdf)
加西亚-莫利纳 等:[《数据库系统实现》](https://book.douban.com/subject/4838430/)