赞
踩
国产数据库在技术架构上主要分为集中式、基于中间件分布式和原生分布式架构,衍生出集中式架构和分布式架构。那么在这些部署架构中,从数据分布的视角来看,在数据库中数据分布的形态是怎样的。本文将简要分析OceanBase、PolarDB、OpenGauss、GaussDB、GoldenDB、TiDB和TDSQL这几个主流的国产数据库的存储类型及存储引擎。
国产数据库在技术架构上主要分为集中式、基于中间件分布式和原生分布式架构,衍生出集中式架构和分布式架构。那么在这些部署架构中,从数据分布的视角来看,在数据库中数据分布的形态是怎样的,主要分为本地存储、集中式存储和分布式存储:
以上定义是从应用表数据的分布形态出发,非传统意义上数据最终存储载体的定义。文中将简要分析OceanBase、PolarDB、OpenGauss、GaussDB、GoldenDB、TiDB和TDSQL这几个主流的国产数据库的存储类型及存储引擎。
OceanBase是云原生分布式数据库,具备高可用、可扩展、高度兼容Oracle和MySQL协议等特性。OceanBase数据库采用Shared-Nothing架构(如下图所示),各个节点之间完全对等,每个节点都有自己的SQL引擎、存储引擎和事务引擎。
在OB数据库中,一个表的数据可以按照某种划分规则水平拆分为多个分片,每个分片叫做一个表分区,简称分区(Partition),其中某行数据属于且只属于一个分区。分区的规则由用户在建表的时候指定,包括hash、range、list等类型的分区,还支持二级分区。一个表的若干个分区可以分布在一个可用区内的多个节点上。每个物理分区有一个用于存储数据的存储层对象,叫做Tablet,用于存储有序的数据记录。
OceanBase数据库的存储引擎基于LSM-Tree架构,将数据分为静态基线数据(SSTable中)和动态增量数据(MemTable中)两部分,其中SSTable是只读的,一旦生成就不再被修改,存储于磁盘;MemTable支持读写,存储于内存。数据库DML操作插入、更新、删除等首先写入MemTable,等到MemTable达到一定大小时转储到磁盘成为SSTable。在进行查询时,需要分别对SSTable和MemTable进行查询,并将查询结果进行归并,返回给SQL层归并后的查询结果。同时在内存实现了Block Cache和Row cache,来避免对基线数据的随机读。当内存的增量数据达到一定规模的时候,会触发增量数据和基线数据的合并,把增量数据落盘。同时每天晚上的空闲时刻,系统也会自动每日合并。
在OB中,每个分区的基本存储单元是一个个SSTable,而所有存储的基本粒度是宏块,数据文件按照2MB定长切分为一个个宏块,SSTable实际是多个宏块的集合。
当用户对Tablet中记录进行修改的时候,为了保证数据持久化,需要记录重做日志(REDO)到Tablet对应的日志流(Log Stream)里。日志流代表一些数据的集合,包括若干Tablets和有序的Redo日志流。在分布式环境下,OB会将同一个日志流数据拷贝到多个机器称之为副本,同一日志流的多个副本使用Multi-Paxos一致性协议保证副本的强一致,每个日志流和它的副本构成一个独立的 Paxos 组,其中一个日志流为主副本(Leader),其它日志流为从副本(Follower)。主副本具备强一致性读和写能力,从副本具备弱一致性读能力。
PolarDB数据库是云原生的数据库产品,共有三个引擎,分别为PolarDB MySQL版、PolarDB PostgreSQL版、PolarDB分布式版。
PolarDB集中式架构采用计算存储分离的共享存储架构,主节点和只读节点使用物理复制、RDMA网络低时延,能够快速同步数据。基于存储级别的复制解决了主从异步复制带来的备库数据一致性问题,保证数据库集群故障时候的数据零丢失。
PolarDB数据库采用存算分离的架构,计算节点仅存储元数据,而将数据文件、Redo Log等存储于远端的存储节点。各计算节点之间仅需同步Redo Log相关的元数据信息,极大地降低了主节点和只读节点间的复制延迟,而且在主节点故障时,只读节点可以快速切换为主节点。
PolarDB分布式版(PolarDB-X)采用了基于计算存储分离的Share Nothing系统架构,具备高可用、高吞吐、大存储、低时延和易扩展特性。
OpenGauss是华为基于PostgreSQL内核开发的国产集中式数据库系统,采用木兰宽松许可证v2发行,具备高可靠、高性能、高安全、易运维和全开放等特性。和PostgreSQL数据库相比,二者在底层架构和数据存储方面类似,但OpenGauss在性能和扩展性方面进行了优化。
OpenGauss在部署架构上采用主备部署的模式,主备之间通过日志同步方式实现数据同步。在逻辑架构上分为管理模块OM和CM、数据库实例OpenGauss以及存储节点:
其中CM支持两种DN选主仲裁协议,两种都适用于1主多备的集群,1主1备的不适用
OpenGauss支持可插拔的存储引擎架构,在原生的存储引擎基础上新增了in-place update存储引擎、索引多版本管理增加事务信息、内存表管理MOT。
1)In-place update存储引擎(Ustore)
In-place Update存储引擎(原地更新),是openGauss内核新增的一种存储模式,在此前的版本使用的行存储引擎是Append Update(追加更新Astore)模式。追加更新对于业务中的增、删以及HOT(HeapOnly Tuple)Update(即同一页面内更新)有很好的表现,但对于跨数据页面的非HOT UPDATE场景,垃圾回收不够高效。新增的In-place update存储引擎旨在解决Append update存储引擎空间膨胀和元组较大的问题,高效回滚段的设计是In-place update存储引擎的基础。
2)MOT内存优化存储引擎
MOT存储引擎是基于多核和大内存的服务器进行的优化,通过完全存储在内存中的数据和索引、非统一内存访问感知(NUMA-aware)设计、消除锁和锁存争用的算法以及查询原生编译,MOT可提供更快的数据访问和更高效的事务执行。
GaussDB数据库(for openGauss)作为企业级的分布式数据库,支持分布式和主备的部署场景,其中分布式版本包含CN(计算节点)、DN(数据存储节点)和GTM(分布式事务管理器)等节点类型。GaussDB数据库的分布式版本是基于share-nothing架构实现的,通过GTM-Lite技术实现事务强一致,消除了无中心节点性能的瓶颈。
GaussDB数据库在数据库组件上相比OpenGauss数据库多了协调节点(Coordinator Node)和全局事务管理器(Global Transaction Manager),如下图所示。
存储引擎向上对接SQL引擎,为SQL引擎提供或接收标准化的数据格式(元组或向量数组);存储引擎向下对接存储介质,按照特定的数据组织方式,以页面、压缩单元(Compress Unit)或其他形式为单位,通过存储介质提供的特定接口,对存储介质中的数据完成读、写操作。
GaussDB存储引擎包括行存引擎和列存引擎以及MOT内存引擎,行存引擎主要面向TP类业务、列存引擎主要面向AP类业务。行存引擎对于读写并发操作,采用多版本并发控制(MVCC,Multi-Version Concurrency Control);对于写写并发操作,采用基于两阶段锁协议(2PL,Two-Phase Locking)的悲观并发控制(PCC,Pessimistic Concurrency Control)。
GoldenDB分布式数据库是基于分布式中间件的分库分表架构,该架构将数据分成不同的分片,每个分片又存储在不同的存储节点,且单个分片是主备复制架构以保证高可用。业务请求经过数据库中间件(计算节点)解析和路由分发到不同的数据分片,实现分布式功能。同时通过全局事务协调节点来保证事务的全局一致性。GoldenDB数据库在整体架构上由由计算节点、数据节点、全局事务管理器、管理节点四种核心模块组成。
GoldenDB分布式数据库支持多租户管理模式、架构上支持横向动态扩展和节点扩缩容,提供读写分离策略。主备节点之间采用快同步方式同步复制,并采用gSync技术提高同步性能,满足金融级别的高可用要求。GoldenDB数据库的存储节点是基于MySQL数据库的,内核存储引擎上使用的是InnoDB引擎。
TiDB是开源云原生分布式关系型数据库,采用存储和计算分离的架构、提供行列存储引擎支持HTAP混合型业务、基于Multi-Raft多数派协议实现多副本之间数据同步,满足金融级别的高可用要求。TiDB兼容MySQL协议和MySQL生态,并提供多种数据迁移工具实现MySQL应用平滑迁移到TiDB。
TiDB分布式数据库将整体架构拆分成了多个模块,各模块之间互相通信,组成完整的TiDB系统。对应的架构图如下:
RocksDB是由Facebook基于LevelDB开发的一款提供key-value存储与读写功能的LSM-tree架构引擎。RocksDB适用于多CPU场景、高效利用fast storage比如SSD、弹性扩展架构、支持IO-bound/in-memory/write-once等功能。
RocksDB不是一个分布式的DB,而是一个高效、高性能、单点的数据库引擎。RocksDB持久化存储key-value键值对数据,keys和values可以是任意的字节流,且按照keys以log-structured merge tree的形式有序存储。
上图就是Rocksdb的基础架构,主要完成以下功能:
RocksDB作为TiKV的核心存储引擎,用于存储Raft日志以及用户数据。每个TiKV实例中有两个RocksDB实例,一个用于存储Raft日志(通常被称为raftdb),另一个用于存储用户数据以及MVCC信息(通常被称为kvdb)。kvdb中有四个ColumnFamily:raft、lock、default和write:
TiKV使用Raft算法来保证数据的一致性,默认情况下使用3副本组成一个raft group,过Raft的日志复制功能,将数据安全可靠地同步到raft group的每一个节点中。
另外,TiKV支持lease Read功能:对于读请求,可以直接发送给Leader,如果leader判断基于时间的lease没有过期,则可以直接提供读请求的客户端,不需要经过Raft算法过程;如果过期了,则leader需要强制通过Raft算法来更新lease内容提供该客户端。
TDSQL(for MySQL)分布式数据库基于Shared Nothing架构和分布式中间件将数据拆分到多个物理分片节点上,支持自动水平拆分、主备同步复制满足金融级别高可用要求。TDSQL分布式数据库采用存算分离的架构,采用多租户的模式支持集中式和分布式实例部署、X86和ARM服务器混合部署。主要包括以下功能模块:
以上组件共同构成了TDSQL分布式数据库的整体架构,实现分布式实例和集中式实例在数据库集群中的混合部署,并提供了扩展性、高可用性以及运维功能支持。
TDSQL for MySQL提供不同的存储引擎,包括InnoDB版本和TDStore版本。InnoDB版本是采用InnoDB作为数据库存储引擎,也是MySQL默认的存储引擎;TDStore版本是腾讯云自研的敏态存储引擎,兼容MySQL标准协议,专为适配金融级敏态业务而设计。
TDStore引擎采用存储和计算分离的结构,包括计算节点、存储节点和管控节点,计算层和存储层的节点均可根据业务需求独立弹性扩缩容。TDStore存储层基于LSM-Tree + SSTable结构存放和管理数据,具有较高的压缩率,能有效降低海量数据规模下的存储成本。对比InnoDB存储引擎,TDStore版最高可实现高达20倍的压缩率,单实例可支撑EB级别的存储量。
由于MySQL原生的主备节点之间的半同步复制技术存在异步退化、relay log无法保证实时落盘以及等待Slave返回ACK工作线程处于阻塞状态等问题,TXSQL对主备节点的同步复制进行了优化:
TXSQL的强同步机制,主机等待至少一个备机应答成功后才返回客户端成功,保证了数据的一致性,满足金融级的高可用要求。同时采用并行多线程和组提交技术,大幅提升主备复制的性能。
如上图所示客户端写请求提交后,线程池分配连接处理请求,但是并没有立即返回给客户端,而是将这部分信息保存在内存会话信息中。Master发起主备同步请求,接收备机收到binlog的ACK请求,当接收到备机日志落盘的ACK返回后,主节点的工作线程唤起刚刚保存的会话,执行后半段的提交操作,并将结果返回给客户端。因此在Master节点开启了两组线程:接收备机ACK应答线程(Dump ACK Thread)和唤醒hang住的客户端连接线程(User ACK Thread)。
以上数据库从架构类型上分为集中式和分布式,集中式架构包括PolarDB和openGauss、分布式架构包括OceanBase、PolarDB-X版本、GaussDB、GoldenDB、TiDB和TDSQL。其中在存储类型、存储类型和高可用协议上各不相同:
参考资料:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。