责编 | 唐小引

数据库激荡 40 年深入解析 PostgreSQL、NewSQL 演进进程_数据_数据库 云服务

头图 | CSDN 下载自东方 IC

出品 | CSDN(ID:CSDNnews)

近日,有传闻 PostgreSQL 会发布 13 版本,这是去年 9 月发布 12 版本之后,PG 社区紧锣密鼓的又一大动作,包括提升查询性能,特殊是对大数据集,总的空间利用率等方面。
同时,海内以华为 GaussDB 200 从 PostgreSQL 9 中继续而来,PostgreSQL 在中国的生态变得空前火热。

这与近两年来以 Google F1 理论为代表的 NewSQL 数据库一起,形成了数据库在这个时期的两支牛角,气势如虹地改变着 TI 数据中央架构的新天下。
我们本日就来“伙头解牛”一把,看看两种技能路线的不同之处。

PostgreSQL 的前世今生

PostgreSQL 是一个功能强大的开源工具关系型数据库系统,它利用和扩展了 SQL 措辞,并结合了许多安全存储和扩展最繁芜数据事情负载的功能。
PostgreSQL 的起源可以追溯到 1986 年,作为加州大学伯克利分校 POSTGRES 项目的一部分,并且在核心平台上进行了 30 多年的积极开拓。
直到 2019 年 9 月,已经正式发布到了 12 版本。

图片来源:维基百科

Michael Stonebraker,2014 图灵奖得到者,PostgreSQL 数据库创始人。
目前数据库领域一共有四位得到图灵奖:

1973 年 Bachman(数据库与网状数据库)

1981 年 Codd(关系数据库)

1998 年 Gray(数据库与事务处理)

伯克利分校是 Postgres 的摇篮

(图:伯克利分校著名地标萨瑟门,CSDN 下载自东方 IC)

PostgreSQL 的特点可以用以下这张图来概括,PostgreSQL 的架构最得当做企业级数据库。

基于 PostgreSQL 的开源项目分支

陈说完了 PostgreSQL 的历史,我们来聊聊 PostgreSQL 在开源社区天下的发展,我们知道,数据库近 40 年来的发展,基本上是从 RDBMS 到 OLTP/OLAP 分离,再到分布式数据库发展的这样一个进程。

PostgreSQL 的进程也是如此,从 PostgreSQL 内核开始,也经历了 OLTP 分支、OLAP 分支,再到大势所趋,两者重新领悟,往稠浊 OLA/TP 的分布式数据库方向演进。

分布式 PostgreSQL-X2 架构先容

既然 PostgreSQL 已经发展到了混布阶段,那么我们就直接从本文主旨开讲,看一看 X2 架构的特点。

首先,X2 是基于 PostgreSQL 源代码改造成的分布式数据库,以是险些拥有与单机数据库的所有功能:

支持繁芜的 SQL 和跨节点 JOIN;

全局事务的强同等性;

支持 Read commited 事务隔离级别;

险些支持所有单机数据库的 DDL 语句;

支持跨节点的视图;

支持跨节点的存储过程。

其次,X2 紧张目的实现数据是水平分片,也便是说须要基于分库分表来办理数据线性扩展的问题。

再次,X2 针对 OLAP 是 shared-nothing 架构,所以是一种 MPP 的技能事理,可以实现 ETL 的数仓加工。

末了,API 完备兼容,外部运用程序可以透明的访问 Postgres-X2,原来的 jdbc 平分歧编程措辞的驱动也基本不须要修正就可以访问 Postgres-X2。

从上图的 X2 架构我们可以看到,X2 紧张由三个部分组成:

GTM:全局事务管理,供应全局事务的做事;

Coordinator:存储全局的元数据,接管用户要求,卖力天生并实行全局查询操持(全局查询操持由多少局部查询操持组成,实行时将局部查询操持分发给 datanode);

Datanode:存储本地的元数据,接管并实行 coordinator 的局部查询操持(局部查询操持也是 SQL)。

分布式 PostgreSQL-X2 的 CAP 剖析

我们知道 CAP 事理是考量一个数据库标高的评价标准,在 RDBMS 时期,Oracle、MS SQLServer 都能较好地靠近 CAP。
在分布式数据库时期,CAP 理论依然是我们评价的紧张工具。
AP 原则又称 CAP 定理,指的是在一个分布式系统中,同等性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。
CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者兼顾。

首先,在同等性上,PostgreSQL-X2 采取 GTM 来实现:

GTM 对事务强同等的保护是比肩传统 RDBMS 的,这一点上具备生产级。
与 2PC 和 MVCC 比较,有前辈之处。
然而,总体开销会比较大,如果是巨大的互联网运用处景,动作上亿的并发访问,性能难于优于 MySQL。

2PC 又称两阶段提交(two-phase commit protocol),2pc 是一个非常经典的强同等、中央化的原子提交协议。
这里所说的中央化是指协议中有两类节点:一个是中央化折衷者节点(coordinator)和 N 个参与者节点(partcipant)。

MVCC 英文全称为 Multi-Version Concurrency Control,翻译为中文即多版本并发掌握。
MVCC 的实现,通过保存数据在某个韶光点的快照来实现的。
这意味着一个事务无论运行多永劫光,在同一个事务里能够看到数据同等的视图。
根据事务开始的韶光不同,同时也意味着在同一个时候不同事务看到的相同表里的数据可能是不同的。

客不雅观上,我们认为它便是乐不雅观锁的一全体实现办法,便是每行都有版本号,保存时根据版本号决定是否成功。

在可扩展性方面,Postgres-X2 的扩容,可以在 Coordinator 和 Datanode 两个方面同时进行扩容。

Postgres-X2 符合分布式数据库线性扩展的标准,在 x86 横行的时期,通过横向对机器的办法扩展打算资源和存储资源是分布式的核心理念,在这一点上,Postgres-X2 也是这么做的。

但是,Postgres 本身的问题是数据量不能支持很大,数据量在 40 个 TB~200TB,做大型数仓仓库,性能随数据量增大,节点数增多,而涌现衰减,不能够完备跟随线性扩展做线性性能叠加。
这是随意马虎被诟病的一点。

再一个,不能够很好地支持在线热插拔,热添加。
如果新增节点,须要做停机重启,这样的话,实时 ODS 这一类的运用就不能够在 Postgres-X2 构建的 OLAP 上运用。

分区容错性不是 PostgresSQL 紧张考虑的问题。
由于多数分布式系统都分布在多个子网络。
每个子网络就叫做一个区(partition)。
分区容错的意思是,区间通信可能失落败。
比如,一台做事器放在中国,另一台做事器放在美国,这便是两个区,它们之间可能无法通信。

上图中,G1 和 G2 是两台跨区的做事器。
G1 向 G2 发送一条,G2 可能无法收到。
系统设计的时候,必须考虑到这种情形。
这种情形,目前紧张是大型云厂商如:Amazon QWS S3、Google Spanner 和阿里云的 OceanBase 去着重打造。
Postgres-X2 我们只从数据中央的高可用性上磋商:

高可用方面,GTM 不像 Greenplum 只有一个 master 节点,不适宜 OLTP 业务。
虽然 Postgres-X2 本身也没有自动的高可用性,但可以通过 SPOF(single point of failure)剖析,根据不同的业务情形进行高可用培植,例如上图是采取 Primary–Standby 的办法来构建高可用架构。
其余,原来的 Postgres-XC 的 D-Node 间不能传数据,数据须要汇聚到 C 节点进行处理 Postgres-X2 之后许可 D-Node 间进行数据传输。

以上,我们算是比较全面的理解了 PostgresSQL 和他的分布式项目 Postgres-X2,我们可以总结一下:

在“从数据库技能的 40 年景长进程看新征程”一文中,我们通过回顾数据库的发展史,重新理解了数据库的定义——数据库便是一个存放数据的仓库,这个仓库按照一定的数据构造(数据构造是指数据的组织形式或数据之间的联系)来组织存储的,我们可以通过数据库供应的多种方法来管理数据库里的数据。
我们的程序都是在内存中运行的,一旦程序运行结束或者打算机断电,程序运行中的数据都会丢失,以是我们就须要将一些程序运行的数据持久化到硬盘之中,以确保数据的安全性。
说白了,数据库便是存储数据的仓库。

我们已经提到数据库已经可以分为几类有:

数据库经由 40 年的发展,经由从 RDBMS 到 MPP 再到 NoSQL 数库,如今我们开始关注 NewSQL 数据库。
每个阶段的特点是若何的呢?

RDBMS——关系型数据库的优点是:事务、索引、关联、强同等性,其缺陷是:有限的扩展能力、有限的可用性、数据构造取决于表空间;

MPP——大规模并行打算数据库的优点为扩展性强、事务、索引、关联、可调同等性,缺陷:运用级切分、数据构造取决于表空间;

NoSQL——超越关系型数据库,数据库其优点在于扩展性强、可调同等性、灵巧的数据构造,而缺陷是事务支持差、索引支持差、SQL 支持差。

最经典的是传统关系型 OLTP 数据库,其紧张用于事务处理的构造化数据库,范例例子是企业的转账记账、订单以及商品库存管理等。
其面临的核心寻衅是高并发、高可用以及高性能下的数据精确性和同等性。

其次是 NoSQL 数据库及专用型数据库,其紧张用于存储和处理非构造化或半构造化数据(如文档,图,时序、时空,K-V),不逼迫数据的同等性,以此换来系统的水平拓展、吞吐能力的提升。

再者是剖析型数据库(On-Line Analytic Processing,OLAP),其运用处景便是海量的数据、数据类型繁芜以及剖析条件繁芜的情形,能够支持深度智能化剖析。
其面临的寻衅紧张是高性能、剖析深度、与 TP 数据库的联动,以及与 NoSQL 数据库的联动。

除了数据的核心引擎之外,还有数据库外围的做事和管理类工具,比如数据传输、数据备份以及数据管理等。

NoSQL 数据库办理了扩展性,高并发访问,但还有很多未尽如人意之处,比如:

索引,无法有效利用索引 —>Ad Hoc Query;

协处理器无法分散打算任务 —>大表的 Join 查询;

SQL 以外的剖析查询 —>Data Science / Machine Learning;

访问其他数据源 —>和现有 Hadoop 数据联合查询(多源异构);

交互式剖析—>繁芜 SQL 查询的性能问题。

于是 NewSQL 呼之欲出。

要说 NewSQL 数据库,我们要先从 Google 的 F1/Spanner 大规模分布式数据库提及。

一、Google F1/Spanner

和浩瀚互联网公司一样,在早期 Google 大量利用了 Mysql。
Mysql 是单机的,可以用 Master-Slave 来容错,分区来扩展。
但是须要大量的手工运维事情,有很多的限定。
因此 Google 开拓了一个可容错可扩展的 RDBMS——F1。
和一样平常的分布式数据库不同,F1 对应 RDMS 应有的功能,绝不当协。
起初 F1 是基于 MySQL 的,不过会逐渐迁移到 Spanner。

F1 有如下特点:

7×24 高可用。
哪怕某一个数据中央停滞运转,仍旧可用;

可以同时供应强同等性和弱同等;

可扩展;

支持 SQL;

事务提交延迟 50-100ms,读延迟 5-10ms,高吞吐。

Spanner 是 Google 的环球级的分布式数据库(Globally-Distributed Database)。
Spanner 的扩展性达到了令人咋舌的环球级,可以扩展到数百万的机器,数以百计的数据中央,上万亿的行。
更给力的是,除了夸年夜的扩展性之外,他还能同时通过同步复制和多版本来知足外部同等性,可用性也是很好的。
冲破 CAP 的枷锁,在三者之间完美平衡。

Spanner 是个可扩展、多版本、环球分布式还支持同步复制的数据库。
他是 Google 的第一个可以环球扩展并且支持外部同等的事务。
Spanner 能做到这些,离不开一个用 GPS 和原子钟实现的韶光 API。
这个 API 能将数据中央之间的韶光同步精确到 10ms 以内。
因此有几个核心的功能:无锁读事务,原子 schema 修正,读历史数据无 block。

由于 F1/Spanner 并不开源,通过现有公开资料仅仅只能窥得 F1/Spanner 的沧海一粟,以是我们紧张通过 Google 的公开资料的学习和发展自身,这比拿来主义的 PostgreSQL 要难能名贵的多。

二、F1 Query 对付 NewSQL 的奠基

2018 年,Google 揭橥了论文“F1 Query:Declarative Querying at Scale”,意味着对 F1/Spanner 架构的升级。
办理了如下几个核心问题:

一是,多种异构的存储平台(Bigtable,Spanner,Google Spreadsheets 等)共存;

二是,不同存储平台上的打算分歧一;

三是,繁芜的商业逻辑开始须要实时的剖析和数据处理(HTAP)。

于是 F1 数据库延伸成了这样一种数据库:

第一,它是独立打算层,底层对接了不同的数据源;

第二,它试图统一 OLTP、OLAP 和 ETL 的 Workload;

第三,它也是一个完全的 ETL 平台;

第四,它推出了几种访问数据的新形式,UDF、UDA 和 TVF SQL;

第五,Shading-nothing,这个之后会详细先容。

一种数据,在完美领悟 CAP 事理之后,又破天荒的办理了同时支持 OLTP、OLAP、ETL 三种场景的数据库利用。
可以说给我们带来了一片“新”天地,由于首创了数据库的“新”纪元。
这个“新”,被 451 Group 的剖析师 Matthew Aslett 命名为“NewSQL”。

三、NoSQL 谢幕,NewSQL 登场

NewSQL 一词是由 451 Group 的剖析师 Matthew Aslett 在研究论文中提出的。
它代指对老牌数据库厂商做出寻衅的一类新型数据库系统。
NewSQL 是对各种新的可扩展/高性能数据库的简称,这类数据库不仅具有 NoSQL 对海量数据的存储管理能力,还保持了传统数据库支持 ACID 和 SQL 等特性。

NewSQL 是指这样一类新式的关系型数据库管理系统,针对 OLTP(读-写)事情负载,追求供应和 NoSQL 系统相同的扩展性能,且仍旧保持 ACID 和 SQL 等特性(scalable and ACID and (relational and/or sql -access))。

NewSQL 一经问世,发展至今,已经形成一个弘大的技能 family 了:

通过上文我们可以知道,NewSQL 的上风在于 SQL 的支持能力、扩展性、实时性和事务的处理能力。
在 NewSQL 发达发展的条件下,许多新兴技能公司开始打造自己的新一代分布式数据库,其设计理念:

一、分布式架构

通过主节点下发任务的模式,每个节点都可以供应做事,在扩展性上,Master 不会是瓶颈。

客户端通过不同的接口访问形式,直接访问主理事节点做事;

主理事节点收到做事要求进行剖析处理,分配到不同的分配做事节点实行;

分片做事节点收到实行要求,进行 SQL 解析处理并实行 SQL 操持;

SQL 实行做事底层存储数据进行处理访问,并反回处理结果;

通过 Raft 协议确保做事之间数据同步;

存储根据 AP、TP 分为共享存储和非共享存储。

而与之比较较,PostgreSQL 现在的分布式都是 MPP 的架构,share nothing,存在增加、减少节点数据重新分配的问题。

二、从分库分表走向 Sharding 与 Partition(分片与分区)

通过我们前面对 PostgreSQL 的解读,数据分库分表是一种被迫的选择,无奈之举,如果能够不做分库分表,就只管即便不要做这方面的设计,由于会对业务提出哀求,或者改动业务。
以是,我们在 NewSQL 的设计上,要多做 Sharding 与 Partition(分片与分区)的设计。

数据分区

分区便是把一张表的数据分成 N 个区块,在逻辑上看终极只是一张表,但底层是由 N 个物理区块组成的。

什么时候考虑利用分区呢?当一张表的查询速率已经慢到影相应用的时候,数据量大,SQL 经由优化,表中的数据是分段的,或者对数据的操作每每只涉及一部分数据,而不是所有的数据。

分区办理的问题紧张是可以提升查询效率。

数据分片

在分布式存储系统中,数据须要分散存储在多台设备上,数据分片(Sharding)便是用来确定数据在多台存储设备上分布的技能。
数据分片要达到三个目的:

分布均匀,即每台设备上的数据量要尽可能附近;

负载均衡,即每台设备上的要求量要尽可能附近;

扩缩容时产生的数据迁移尽可能少。

三、数据同步与同等性 —— Raft/Paxos

目前主流的 NewSQL 数据库的数据同步是基于 Raft 协议的。

在 Raft 中三种角色:

Leader:卖力吸收客户真个要求,将日志复制到其他节点并奉告其他节点何时运用这些日志是安全的;

Candidate:用于选举 Leader 的一种角色;

Follower:卖力相应来自 Leader 或者 Candidate 的要求。

所有节点初始状态都是 Follower 角色;

超时时间内没有收到 Leader 的要求则转换为 Candidate 进行选举;

Candidate 收到大多数节点的选票则转换为 Leader;创造 Leader 或者收到更高任期的要求则转换为 Follower;

Leader 在收到更高任期的要求后转换为 Follower。

Raft 状态机:

所有同等性算法都会涉及到状态机,而状态机担保系统从一个同等的状态开始,以相同的顺序实行一些列指令终极会达到另一个同等的状态。

所有的节点以相同的顺序处理日志,那么终极 x、y、z 的值在多个节点中都是同等的。

在这一点上,PostgreSQL-X2 的架构因此主备的模式来确定的。

四、分布式事务

事务开始,记录事务唯一 ID,实行操作,记录修正的 shard,实行预提交动作,提交或回滚;

写入时当前采取锁机制;

读取利用快照读取,存储层每次写入都是追加写入,通过覆盖机制进行数据变更。

这样的好处是,数据的鲜活性可以实时担保,数据更新插入和剖析可以一起完成,像实时数仓、实时统计汇总打算就能够实现了。
而在 PostgreSQL 的 OLAP 虽然可以通过批量或者插入的办法实现更新,但要人工做优化,持续投入人力干预,性能被动式担保。

五、存储层——KV 存储

在存储方面,我们有两种选择:

堆存:数据可以通过 key 获取,同时可以直接读取数据;

非堆存:数据只能通过 key 来获取,无法直接读取到数据。

非堆存储只能通过 key 来获取数据,会导致不断的离散的读取,以是不能适应于 AP 的场景。

客户端通过不同的接口访问形式,直接访问主理事节点做事;

主理事节点收到做事要求进行剖析处理,分配到不同的分配做事节点实行;

分片做事节点收到实行要求,进行 sql 解析处理并实行 SQL 操持;

SQL 实行做事底层存储数据进行处理访问,并反回处理结果;

Zookeeper 担保干系做事运用的高可用;

HDFS 持久化底层存储数据,并利用三副本技能担保数据不丢失。

与之比较较,PostgreSQL 是本地化存储,存储也可以分为列存和行存等。

六、多源异构与数据邦联

NewSQL 的数据多源异构,要兼顾考虑对过去数据库的全面支持,尤其是 NoSQL 和 Hadoop 生态体系,由于毕竟这两者已经非常遍及。

在多源异构方面,PostgreSQL 是通过 FDW 支持多源异构,可访问 Oracle、PG、MySQL、MongoDB 等,对 Hadoop 体系和 NoSQL 支持力度低,效率和性能也较难做到极致。

七、基于 NewSQL 的分布式数据库实践

综合以上六点,通过对 NewSQL 的:

分布式架构;

数据的分区分片;

数据同步与同等性;

分布式事务;

存储层,KV 存储设计;

数据库多源异构。

我们综合设计研发,推出了一款自主可控的国产分布式数据库 —— Hubble。
Hubble 同时支持 OLTP 和 OLAP 场景,即在同一份数据上,实现事务型处理的同时支持实时剖析,省去了费时的 ETL 过程。

末了,将 Hubble 作为代表与 PsostgreSQL-X2 做一个横向剖析,能够帮助我们更好地理解本文开篇所言 —— 分布式数据库的两支牛角各自的技能路线。

作者简介:张秋剑,天云数据上海分公司副总经理,资深金融行业大数据技能架构专家。
打算机科学技能硕士学位后,曾就职于 IBM 等公司,九三学社金融委员会委员。
目前紧张为银行、证券和保险等金融行业客户供应大数据平台及人工智能平台的方案和方案设计事情。
曾在 IEEE 等期刊揭橥多篇论文。

☞开源激荡 30 年:从免费社区到代价数十亿美元公司

☞理解 AI 最伟大的造诣之一:卷积神经网络的局限性

☞GitHub 标星 10,000+,Apache 顶级项目 ShardingSphere 的开源之路

☞港科大郑光廷院士问诊未来,戳穿 AI 最新运用与实践

☞大匆匆下的智能运维寻衅:阿里如何抗住“双11猫晚”?

☞以太坊2.0中的Custody Game及MPC实现

☞很存心的为你写了9道MySQL口试题,建议收藏!