数据库激荡 40 年,深入剖析 PostgreSQL、NewSQL 演进进程
https://p1.pstatp.com/large/pgc-image/RwrGMwT995bBoh作者 | 张秋剑,天云数据上海副总经理责编 | 唐小引
头图 | CSDN 下载自东方 IC
出品 | CSDN(ID:CSDNnews)
克日,有传闻 PostgreSQL 会发布 13 版本,这是客岁 9 月发布 12 版本之后,PG 社区紧锣密鼓的又一大动作,包括提升查询性能,特别是对大数据集,总的空间使用率等方面。同时,国内以华为 GaussDB 200 从 PostgreSQL 9 中继承而来,PostgreSQL 在中国的生态变得空前火热。
这与近两年来以 Google F1 理论为代表的 NewSQL 数据库一起,形成了数据库在这个期间的两支牛角,气势如虹地改变着 TI 数据中心架构的新世界。我们本日就来“庖丁解牛”一把,看看两种技术路线的差别之处。
https://p3.pstatp.com/large/pgc-image/RwrGMxFHU9yVZqhttps://p1.pstatp.com/large/pgc-image/RT4Gwk56bt5iOJPostgreSQL 的前世此生
PostgreSQL 是一个功能强大的开源对象关系型数据库体系,它使用和扩展了 SQL 语言,并结合了很多安全存储和扩展最复杂数据工作负载的功能。PostgreSQL 的劈头可以追溯到 1986 年,作为加州大学伯克利分校 POSTGRES 项目的一部分,并且在核心平台上进行了 30 多年的积极开发。直到 2019 年 9 月,已经正式发布到了 12 版本。
https://p3.pstatp.com/large/pgc-image/RwrGMxoHHj09fw图片来源:维基百科
Michael Stonebraker,2014 图灵奖获得者,PostgreSQL 数据库创始人。目前数据库领域一共有四位获得图灵奖:
[*]1973 年 Bachman(数据库与网状数据库)
[*]1981 年 Codd(关系数据库)
[*]1998 年 Gray(数据库与变乱处置惩罚)
https://p3.pstatp.com/large/pgc-image/RwrGMymDTkbCqS伯克利分校是 Postgres 的摇篮
(图:伯克利分校著名地标萨瑟门,CSDN 下载自东方 IC)
PostgreSQL 的特点可以用以下这张图来概括,PostgreSQL 的架构最合适做企业级数据库。
https://p1.pstatp.com/large/pgc-image/RwrGN1c85wf4aPhttps://p1.pstatp.com/large/pgc-image/RT7S2kzFTfre26基于 PostgreSQL 的开源项目分支
述说完了 PostgreSQL 的汗青,我们来聊聊 PostgreSQL 在开源社区世界的发展,我们知道,数据库近 40 年来的发展,根本上是从 RDBMS 到 OLTP/OLAP 分离,再到分布式数据库发展的这样一个历程。
PostgreSQL 的历程也是如此,从 PostgreSQL 内核开始,也履历了 OLTP 分支、OLAP 分支,再到大势所趋,两者重新融合,往混合 OLA/TP 的分布式数据库方向演进。
https://p9.pstatp.com/large/pgc-image/RwrGNyqHfbdHnlhttps://p3.pstatp.com/large/pgc-image/RTJXJ1kBqzfCnu分布式 PostgreSQL-X2 架构先容
既然 PostgreSQL 已经发展到了混布阶段,那么我们就直接从本文主旨开讲,看一看 X2 架构的特点。
起首,X2 是基于 PostgreSQL 源代码改造成的分布式数据库,以是险些拥有与单机数据库的所有功能:
[*]支持复杂的 SQL 和跨节点 JOIN;
[*]全局变乱的强一致性;
[*]支持 Read commited 变乱隔离级别;
[*]险些支持所有单机数据库的 DDL 语句;
[*]支持跨节点的视图;
[*]支持跨节点的存储过程。
其次,X2 主要目的实现数据是程度分片,也就是说需要基于分库分表来解决数据线性扩展的问题。
再次,X2 针对 OLAP 是 shared-nothing 架构,以是是一种 MPP 的技术原理,可以实现 ETL 的数仓加工。
末了,API 完全兼容,外部应用程序可以透明的访问 Postgres-X2,原先的 jdbc 等差别编程语言的驱动也根本不需要修改就可以访问 Postgres-X2。
https://p1.pstatp.com/large/pgc-image/RwrGNzNJ8tA1FV从上图的 X2 架构我们可以看到,X2 主要由三个部分构成:
[*]GTM:全局变乱管理,提供全局变乱的服务;
[*]Coordinator:存储全局的元数据,接受用户请求,负责生成并执行全局查询计划(全局查询计划由多少局部查询计划构成,执行时将局部查询计划分发给 datanode);
[*]Datanode:存储本地的元数据,接受并执行 coordinator 的局部查询计划(局部查询计划也是 SQL)。
https://p1.pstatp.com/large/pgc-image/RTJXJ7YR5xGDl分布式 PostgreSQL-X2 的 CAP 分析
https://p1.pstatp.com/large/pgc-image/RwrGNziDQPipXE我们知道 CAP 原理是考量一个数据库标高的评价标准,在 RDBMS 期间,Oracle、MS SQLServer 都能较好地靠近 CAP。在分布式数据库期间,CAP 理论依然是我们评价的主要工具。AP 原则又称 CAP 定理,指的是在一个分布式体系中,一致性(Consistency)、可用性(Availability)、分区容错性(Partition tolerance)。CAP 原则指的是,这三个要素最多只能同时实现两点,不可能三者分身。
起首,在一致性上,PostgreSQL-X2 接纳 GTM 来实现:
https://p3.pstatp.com/large/pgc-image/RwrGNzy3YBnaQGGTM 对变乱强一致的掩护是比肩传统 RDBMS 的,这一点上具备生产级。与 2PC 和 MVCC 相比,有先进之处。然而,总体开销会比较大,如果是巨大的互联网应用场景,动作上亿的并发访问,性能难于优于 MySQL。
2PC 又称两阶段提交(two-phase commit protocol),2pc 是一个非常经典的强一致、中心化的原子提交协议。这里所说的中心化是指协议中有两类节点:一个是中心化协调者节点(coordinator)和 N 个参与者节点(partcipant)。
https://p3.pstatp.com/large/pgc-image/RwrGO0B6VvSa51MVCC 英文全称为 Multi-Version Concurrency Control,翻译为中文即多版本并发控制。MVCC 的实现,通过保存数据在某个时间点的快照来实现的。这意味着一个变乱无论运行多长时间,在同一个变乱里能够看到数据一致的视图。根据变乱开始的时间差别,同时也意味着在同一个时刻差别变乱看到的相同表里的数据可能是差别的。
https://p3.pstatp.com/large/pgc-image/RwrGOii9yyUZ9R客观上,我们以为它就是乐观锁的一整个实现方式,就是每行都有版本号,保存时根据版本号决定是否成功。
在可扩展性方面,Postgres-X2 的扩容,可以在 Coordinator 和 Datanode 两个方面同时进行扩容。
https://p9.pstatp.com/large/pgc-image/RwrGOkIJHsgmpXPostgres-X2 符合分布式数据库线性扩展的标准,在 x86 横行的期间,通过横向对机器的方式扩展盘算资源和存储资源是分布式的核生理念,在这一点上,Postgres-X2 也是这么做的。
但是,Postgres 本身的问题是数据量不能支持很大,数据量在 40 个 TB~200TB,做大型数仓堆栈,性能随数据量增大,节点数增多,而出现衰减,不能够完全跟随线性扩展做线性性能叠加。这是容易被诟病的一点。
再一个,不能够很好地支持在线热插拔,热添加。如果新增节点,需要做停机重启,这样的话,及时 ODS 这一类的应用就不能够在 Postgres-X2 构建的 OLAP 上应用。
分区容错性不是 PostgresSQL 主要考虑的问题。由于多数分布式体系都分布在多个子网络。每个子网络就叫做一个区(partition)。分区容错的意思是,区间通讯可能失败。比如,一台服务器放在中国,另一台服务器放在美国,这就是两个区,它们之间可能无法通讯。
https://p1.pstatp.com/large/pgc-image/RwrGOl11kyQYrQ上图中,G1 和 G2 是两台跨区的服务器。G1 向 G2 发送一条消息,G2 可能无法收到。体系设计的时间,必须考虑到这种情况。这种情况,目前主要是大型云厂商如:Amazon QWS S3、Google Spanner 和阿里云的 OceanBase 去偏重打造。Postgres-X2 我们只从数据中心的高可用性上探究:
https://p1.pstatp.com/large/pgc-image/RwrGOlN4SVySki高可用方面,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,我们可以总结一下:
https://p9.pstatp.com/large/pgc-image/RwrGOlf5m2Up6Hhttps://p1.pstatp.com/large/pgc-image/RTJXJ7uHXU5GZc在“从数据库技术的 40 年发展历程看新征程”一文中,我们通过回顾数据库的发展史,重新明白了数据库的界说——数据库就是一个存放数据的堆栈,这个堆栈按照肯定的数据结构(数据结构是指数据的组织形式或数据之间的联系)来组织存储的,我们可以通过数据库提供的多种方法来管理数据库里的数据。我们的程序都是在内存中运行的,一旦程序运行竣事大概盘算机断电,程序运行中的数据都会丢失,以是我们就需要将一些程序运行的数据持久化到硬盘之中,以确保数据的安全性。说白了,数据库就是存储数据的堆栈。
我们已经提到数据库已经可以分为几类有:
https://p3.pstatp.com/large/pgc-image/RwrGPPs3b4oz6C数据库颠末 40 年的发展,颠末从 RDBMS 到 MPP 再到 NoSQL 数库,如今我们开始关注 NewSQL 数据库。每个阶段的特点是怎样的呢?
[*]RDBMS——关系型数据库的优点是:变乱、索引、关联、强一致性,其缺点是:有限的扩展能力、有限的可用性、数据结构取决于表空间;
[*]MPP——大规模并行盘算数据库的优点为扩展性强、变乱、索引、关联、可调一致性,缺点:应用级切分、数据结构取决于表空间;
[*]NoSQL——超越关系型数据库,数据库其优点在于扩展性强、可调一致性、灵活的数据结构,而缺点是变乱支持差、索引支持差、SQL 支持差。
https://p1.pstatp.com/large/pgc-image/RwrGPQF1Tnz9HG最经典的是传统关系型 OLTP 数据库,其主要用于变乱处置惩罚的结构化数据库,典型例子是企业的转账记账、订单以及商品库存管理等。其面对的核心挑战是高并发、高可用以及高性能下的数据精确性和一致性。
其次是 NoSQL 数据库及专用型数据库,其主要用于存储和处置惩罚非结构化或半结构化数据(如文档,图,时序、时空,K-V),不强制数据的一致性,以此换来体系的程度拓展、吞吐能力的提升。
再者是分析型数据库(On-Line Analytic Processing,OLAP),其应用场景就是海量的数据、数据类型复杂以及分析条件复杂的情况,能够支持深度智能化分析。其面对的挑战主要是高性能、分析深度、与 TP 数据库的联动,以及与 NoSQL 数据库的联动。
除了数据的核心引擎之外,还有数据库外围的服务和管理类工具,比如数据传输、数据备份以及数据管理等。
NoSQL 数据库解决了扩展性,高并发访问,但还有很多未尽如人意之处,比如:
[*]索引,无法有用使用索引 —>Ad Hoc Query;
[*]协处置惩罚器无法分散盘算任务 —>大表的 Join 查询;
[*]SQL 以外的分析查询 —>Data Science / Machine Learning;
[*]访问其他数据源 —>和现有 Hadoop 数据联合查询(多源异构);
[*]交互式分析—>复杂 SQL 查询的性能问题。
于是 NewSQL 呼之欲出。
https://p1.pstatp.com/large/pgc-image/RTLSNam5ZxLDlM要说 NewSQL 数据库,我们要先从 Google 的 F1/Spanner 大规模分布式数据库说起。
一、Google F1/Spanner
和众多互联网公司一样,在早期 Google 大量使用了 Mysql。Mysql 是单机的,可以用 Master-Slave 来容错,分区来扩展。但是需要大量的手工运维工作,有很多的限制。因此 Google 开发了一个可容错可扩展的 RDBMS——F1。和一般的分布式数据库差别,F1 对应 RDMS 应有的功能,毫不妥协。早先 F1 是基于 MySQL 的,不过会渐渐迁移到 Spanner。
https://p3.pstatp.com/large/pgc-image/RwrGPQkIFf1x2sF1 有如下特点:
[*]7×24 高可用。哪怕某一个数据中心停止运转,仍然可用;
[*]可以同时提供强一致性和弱一致;
[*]可扩展;
[*]支持 SQL;
[*]变乱提交延长 50-100ms,读延长 5-10ms,高吞吐。
https://p3.pstatp.com/large/pgc-image/RwrGQ5VAW8wyY2Spanner 是 Google 的全球级的分布式数据库(Globally-Distributed Database)。Spanner 的扩展性达到了令人咋舌的全球级,可以扩展到数百万的机器,数以百计的数据中心,上万亿的行。更给力的是,除了夸张的扩展性之外,他还能同时通过同步复制和多版本来满足外部一致性,可用性也是很好的。突破 CAP 的枷锁,在三者之间完美平衡。
https://p1.pstatp.com/large/pgc-image/RwrGQ6G5r1t9zRSpanner 是个可扩展、多版本、全球分布式还支持同步复制的数据库。他是 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)。
https://p1.pstatp.com/large/pgc-image/RwrGQ70CeuxPrY于是 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 了:
https://p1.pstatp.com/large/pgc-image/RwrGQ7L73fMBqOhttps://p3.pstatp.com/large/pgc-image/RTRIuPNI7JPB03通过上文我们可以知道,NewSQL 的优势在于 SQL 的支持能力、扩展性、及时性和变乱的处置惩罚能力。在 NewSQL 蓬勃发展的前提下,很多新兴技术公司开始打造自己的新一代分布式数据库,其设计理念:
一、分布式架构
通过主节点下发任务的模式,每个节点都可以提供服务,在扩展性上,Master 不会是瓶颈。
https://p1.pstatp.com/large/pgc-image/RwrGQoR33bugtw
[*]客户端通过差别的接口访问形式,直接访问主服务节点服务;
[*]主服务节点收到服务请求进行分析处置惩罚,分配到差别的分配服务节点执行;
[*]分片服务节点收到执行请求,进行 SQL 解析处置惩罚并执行 SQL 计划;
[*]SQL 执行服务底层存储数据进行处置惩罚访问,并反回处置惩罚结果;
[*]通过 Raft 协议确保服务之间数据同步;
[*]存储根据 AP、TP 分为共享存储和非共享存储。
而与之相比较,PostgreSQL 如今的分布式都是 MPP 的架构,share nothing,存在增加、减少节点数据重新分配的问题。
二、从分库分表走向 Sharding 与 Partition(分片与分区)
通过我们前面对 PostgreSQL 的解读,数据分库分表是一种被迫的选择,无奈之举,如果能够不做分库分表,就尽量不要做这方面的设计,由于会对业务提出要求,大概改动业务。以是,我们在 NewSQL 的设计上,要多做 Sharding 与 Partition(分片与分区)的设计。
数据分区
分区就是把一张表的数据分成 N 个区块,在逻辑上看终极只是一张表,但底层是由 N 个物理区块构成的。
什么时间考虑使用分区呢?当一张表的查询速度已经慢到影响使用的时间,数据量大,SQL 颠末优化,表中的数据是分段的,大概对数据的操纵往往只涉及一部分数据,而不是所有的数据。
分区解决的问题主要是可以提升查询效率。
https://p3.pstatp.com/large/pgc-image/RwrGQosGgu9Kmm数据分片
在分布式存储体系中,数据需要分散存储在多台设备上,数据分片(Sharding)就是用来确定数据在多台存储设备上分布的技术。数据分片要达到三个目的:
[*]分布匀称,即每台设备上的数据量要尽可能相近;
[*]负载均衡,即每台设备上的请求量要尽可能相近;
[*]扩缩容时产生的数据迁移尽可能少。
https://p9.pstatp.com/large/pgc-image/RwrGQrbICFXqXW三、数据同步与一致性 —— Raft/Paxos
目前主流的 NewSQL 数据库的数据同步是基于 Raft 协议的。
https://p1.pstatp.com/large/pgc-image/RwrGQsUEALbNQ6在 Raft 中三种角色:
Leader:负责接收客户端的请求,将日志复制到其他节点并告知其他节点何时应用这些日志是安全的;
Candidate:用于推选 Leader 的一种角色;
Follower:负责响应来自 Leader 大概 Candidate 的请求。
https://p1.pstatp.com/large/pgc-image/RwrGQsw2Z8oqm6
[*]所有节点初始状态都是 Follower 角色;
[*]超时时间内没有收到 Leader 的请求则转换为 Candidate 进行推选;
[*]Candidate 收到大多数节点的选票则转换为 Leader;发现 Leader 大概收到更高任期的请求则转换为 Follower;
[*]Leader 在收到更高任期的请求后转换为 Follower。
Raft 状态机:
[*]所有一致性算法都会涉及到状态机,而状态机保证体系从一个一致的状态开始,以相同的顺序执行一些列指令终极会达到另一个一致的状态。
[*]所有的节点以相同的顺序处置惩罚日志,那么终极 x、y、z 的值在多个节点中都是一致的。
https://p3.pstatp.com/large/pgc-image/RwrGRbpMUwDna在这一点上,PostgreSQL-X2 的架构是以主备的模式来确定的。
四、分布式变乱
https://p3.pstatp.com/large/pgc-image/RwrGRcO2tuqRvR
[*]变乱开始,记录变乱唯一 ID,执行操纵,记录修改的 shard,执行预提交动作,提交或回滚;
[*]写入时当前接纳锁机制;
[*]读取使用快照读取,存储层每次写入都是追加写入,通过覆盖机制进行数据变更。
这样的好处是,数据的鲜活性可以及时保证,数据更新插入和分析可以一起完成,像及时数仓、及时统计汇总盘算就能够实现了。而在 PostgreSQL 的 OLAP 虽然可以通过批量大概插入的方式实现更新,但要人工做优化,连续投入人力干预,性能被动式保证。
https://p1.pstatp.com/large/pgc-image/RwrGRck7Fj7eTR五、存储层——KV 存储
在存储方面,我们有两种选择:
[*]堆存:数据可以通过 key 获取,同时可以直接读取数据;
[*]非堆存:数据只能通过 key 来获取,无法直接读取到数据。
非堆存储只能通过 key 来获取数据,会导致不断的离散的读取,以是不能顺应于 AP 的场景。
https://p3.pstatp.com/large/pgc-image/RwrGRdF8N3zIHf
[*]客户端通过差别的接口访问形式,直接访问主服务节点服务;
[*]主服务节点收到服务请求进行分析处置惩罚,分配到差别的分配服务节点执行;
[*]分片服务节点收到执行请求,进行 sql 解析处置惩罚并执行 SQL 计划;
[*]SQL 执行服务底层存储数据进行处置惩罚访问,并反回处置惩罚结果;
[*]Zookeeper 保证相干服务应用的高可用;
[*]HDFS 持久化底层存储数据,并使用三副本技术保证数据不丢失。
与之相比较,PostgreSQL 是本地化存储,存储也可以分为列存和行存等。
六、多源异构与数据邦联
NewSQL 的数据多源异构,要分身考虑对过去数据库的全面支持,尤其是 NoSQL 和 Hadoop 生态体系,由于毕竟这两者已经非常遍及。
https://p1.pstatp.com/large/pgc-image/RwrGRdV6wODe4J在多源异构方面,PostgreSQL 是通过 FDW 支持多源异构,可访问 Oracle、PG、MySQL、MongoDB 等,对 Hadoop 体系和 NoSQL 支持力度低,效率和性能也较难做到极致。
七、基于 NewSQL 的分布式数据库实践
综合以上六点,通过对 NewSQL 的:
[*]分布式架构;
[*]数据的分区分片;
[*]数据同步与一致性;
[*]分布式变乱;
[*]存储层,KV 存储设计;
[*]数据库多源异构。
我们综合设计研发,推出了一款自主可控的国产分布式数据库 —— Hubble。Hubble 同时支持 OLTP 和 OLAP 场景,即在同一份数据上,实现变乱型处置惩罚的同时支持及时分析,省去了费时的 ETL 过程。
末了,将 Hubble 作为代表与 PsostgreSQL-X2 做一个横向分析,能够资助我们更好地明白本文开篇所言 —— 分布式数据库的两支牛角各自的技术路线。
https://p3.pstatp.com/large/pgc-image/RwrGSKkIeivt98作者简介:张秋剑,天云数据上海分公司副总经理,资深金融行业大数据技术架构专家。盘算机科学技术硕士学位后,曾就职于 IBM 等公司,九三学社金融委员会委员。目前主要为银行、证券和保险等金融行业客户提供大数据平台及人工智能平台的规划和方案设计工作。曾在 IEEE 等期刊发表多篇论文。
https://p1.pstatp.com/large/pgc-image/Rwhl0Gy16DYLse开源荡漾 30 年:从免费社区到价值数十亿美元公司
明白 AI 最巨大的成绩之一:卷积神经网络的局限性
GitHub 标星 10,000+,Apache 顶级项目 ShardingSphere 的开源之路
港科大郑光廷院士问诊未来,揭破 AI 最新应用与实践
大促下的智能运维挑战:阿里如何抗住“双11猫晚”?
以太坊2.0中的Custody Game及MPC实现
很专心的为你写了9道MySQL面试题,建议收藏!
页:
[1]