PGXC:单体数据库的自然演进
单体数据库的功能看似已经很完善了,但在面临高并发场景的时候,还是会碰到写入性能不足的问题,很难解决。因此,也就有了向分布式数据库演进的动力。要解决写入性能不足的问题,大家首先想到的,最简单直接的办法就是分库分表。分库分表方案就是在多个单体数据库之前增加代理节点,本质上是增加了 SQL 路由功能。这样,代理节点首先解析客户端请求,再根据数据的分布情况,将请求转发到对应的单体数据库。


NewSQL:革命性的新架构
相对于 PGXC,NewSQL 有着完全不同的发展路线。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。
总结
- 从架构上,数据库可以被拆分为 5 个部分,分别是客户端通讯管理器、进程管理器、查询处理器、事务存储管理器和共享组件与工具。分布式数据库在此基础上增加四个主要功能,包括分片信息管理、分布式事务管理、跨节点查询和全局时钟。
- PGXC 架构是从分库分表方案演进而来的。它设置了协调节点,在代理功能的基础上增加了分布式事务管理、跨节点查询功能;原有的单体数据继续作为数据节点;新增了全局时钟和分片信息管理两个功能,这两个功能又有两种实现情况,一是拆分为两个独立角色节点,例如 GoldenDB,二是合并为一个角色节点,例如 TBase。NewSQL 架构是原生分布式数据库,架构中的每个层次的设计都是以分布式为目标。
- NewSQL 是从分布式键值系统演进而来,主要的工作负载由计算节点和存储节点承担,另外由管理节点承担全局时钟和分片信息管理功能。不过,这三类节点是逻辑功能上划分,在设计实现层面是可分可合的。比如,TiDB 是分为独立节点,CockroachDB 则是对等的 P2P 架构。
- NewSQL 在架构上更加领先,而 PGXC 最大程度复用了单体数据库的工程实现,更加稳健。