【.com原稿】行业背景随着全球经济下行压力加大,中美贸易摩擦愈演愈烈。数据库作为基础软件的重要组成部分,具有很深的技术含量。在这样的背景下,国内数据库厂商开始发力。其中,分布式数据库如雨后春笋般涌现,良性的竞争环境让它们都取得了长足的进步,其中不乏优秀的产品。本文主要选取几个比较成熟的数据库来介绍架构特点。分布式数据库总体架构分布式数据库总体设计有两个思路和方向,一是基于共享存储架构(shareeverything),二是基于数据分片架构(sharenothing)。共享存储架构的特点是底层存储共享一个数据池,上层的数据库服务器层可以弹性扩展。典型案例有DB2pureScale、OracleRAC、阿里云PolarDB等。这种架构的好处是天生适合云数据库,比如阿里云,上层的SQL引擎可以是MySQL或者PG,可以是无限扩大。底层存储其实是一样的。用户应用只是申请几台上层的MySQL或PG服务器,在底层存储中开辟一块空间给用户使用。这样,资源就可以弹性伸缩。这种架构的数据库不能称为严格意义上的分布式数据库。数据分片架构的特点是将底层数据打散,通过哈希或范围等一定的规则分布到不同的数据节点。在计算过程中,多个底层节点共同参与计算,可以看作是一种MPP并行计算架构。同时可以扩展数据节点,上层由协调节点解析转发。这是目前典型的分布式数据库架构,也是本文的重点。目前分布式数据库的整体架构设计基本与下图相同。每个产品在不同组件的实现上都有差异,但整体架构是相似的。从图中我们可以看出分布式数据库的三大组成部分:协调节点、数据节点和全局事务管理器。Coordinator节点负责SQL的解析和转发,充当类似proxy的角色,Data节点负责计算和数据存储,全局事务管理器负责保证全局事务的读一致性。下面介绍一下目前主流分布式数据库的架构和设计差异。1.TiDBTiDB是互联网行业流行的分布式数据库。它由PingCAP开发,由三个主要组件组成。底层的TiKVServer是Github的一个开源组件。是一个分布式的kv存储引擎,用于数据存储和对应的dataNode;上层TiDBServer由PingCAP开发,用于SQL解析转发,对应协调节点;PDServer复制全局时间戳分配,对应全局事务管理器。下面列出其架构特点:①轻量级,受互联网公司欢迎,适合与容器集成。目前,PingCAP也在做一个TiDBoperator来容器化TiDB。②部署简单,基于AnsiblePlaybook自动部署。③实现了基于Region级别的Raft复制,将数据表逐个拆分成Region。Region的一主两备基于Raft协议进行复制。同时,Region会根据负载情况进行合并和拆分,由PDServer进行负载均衡。调度。④使用隐藏列作为分布列。分布列不占用真正的列,这样修改数据时不需要重新分布数据。总的原则是用表名和主键前面的前缀信息作为隐藏列,然后用这个列进行哈希分布。⑤TiDBServer基本兼容MySQL语法。这种兼容并不代表直接使用MySQLServer。因为TiKV底层是kv的存储模型,所以TiDB在执行sql的时候需要从sql映射到kv。⑥TiKV可以看作是一个大数据池。在物理机层面,没有哪台机器是Master,哪台是Backup。所有机器都是主节点。热点数据会自动进行动态负载均衡,数据会动态移动。⑦基于Googlespannerf1和bigtable的论文,PDServer实现了逻辑时间戳,Google论文也提出了原子钟的概念,从物理上保证交易号的全局顺序。2.OceanBaseOceanBase是蚂蚁金服自研的分布式数据库。它声称代码完全是从第一行开始自行开发的。近期ob多次刷新新闻头条,刷新TPCC官网测试结果,刷新天猫交易量和tps记录。但在银行等金融行业的应用案例并不多。或许银行和支付宝之间可能存在天然的鸿沟。ob架构比较特殊,下面介绍其架构特点:①最底层是observer,每个observer集成了主控服务、SQL引擎、存储引擎和数据分区。②上层是obproxy,实现SQL的路由。这不仅是应用于观察者的路由,也是观察者之间的路由。③数据划分分区,每个分区通过paxos进行复制,保证强一致性。如果主分区宕机不可用,会自动切换到备份分区。④变更关卡时间,关卡时间延长至1天。所有事务都存储在内存中,然后每晚刷新磁盘,实时记录重做日志。这样就避免了随机写的性能损失,而只有顺序写,更像一个内存数据库,性能更好,但是也带来了一些问题,比如宕机后恢复时间变长,查询刚刚做的修改,就需要先查看基础数据,再应用redoentry获取最新数据。⑤两阶段提交不使用ob代理节点作为协调器,而是使用ob代理路由到的第一个主数据分区作为协调器。同时会持久化两阶段提交的prepare和commit信息。如果节点宕机,会启用备分区,同时读取持久化信息。这种设计不同于一般的分布式数据库。⑥集群维护一个分区缓存,分区的分布信息会通过ob代理在不同的ob服务器之间传递。⑦ob最早开源了一段时间,然后基于它诞生了cbase、obase等产品。3、GaussDB华为GaussDB分为三个产品线。Gauss100的前身是华为自研的内存数据库gmdb,现已开源。Gauss200是基于pgxc架构开发的OLAP分析型数据库。Gauss300是在200.数据库基础上开发的HTAP,这里主要介绍Gauss300数据库。Gauss300就是上图中的典型架构:①协调节点,负责sql的解析转发,同时也充当二阶段提交的协调者。协调节点存储一些元数据信息。多个协调节点之间需要同步数据。如果协调节点宕机,会影响ddl相关操作,也可能造成分两阶段提交的信息残留。需要两阶段残留物清洁机制。②数据节点通过基于群体的流复制实现高可用。主备数据节点是实例级别的。一个master节点就是一个masterPG实例,一台机器可以有多个master数据节点。③GTM复制并分配全局事务id。GTM一主多备。GTM主备之间必须同步gxid信息,而且是强同步,这就带来了一个问题。备份GTM节点宕机会导致主GTM不可用,造成全局可用性问题。华为这块把GTM的高可用转移到etcd,把GTM生成的xid写入etcd。etcd本身是一个高可用和一致的集群,保证了GTM的高可用。如果主GTM宕机,则备用GTM将接管并继续从etcd集群读取和写入事务号。④GTM的交易号是批量分配的。如果有高并发,如果gxids一个一个分配,就会有性能瓶颈。华为将交易号改为一次分??配几万甚至几十万,避免了GTM交易号分配。瓶颈。⑤交易id由32位改为64位。PG的交易数为32位,高达42亿。因此,交易号在PG中是非常宝贵的资源。用完后会回收。回收会带来很多严重的问题。华为把交易号从32位改为64位,不可能用完交易号,一次分配几十万也就不足为奇了。⑥为了提升性能,华为还在开发gtm-lite功能,可以在不使用GTM的情况下实现本地事务,因为生产环境大部分是本地事务,可以大大提升性能。⑦Gauss300基于pgxc架构演进,类似于基于pgxc的亚信AntDB、腾讯TBase。4.SequoiaDBSequoiaDB是SequoiaDB自主研发的分布式数据库。最初的应用场景主要是历史数据归档和非结构化数据归档。不过SequoiaDB近期也在积极开发oltp功能,包括研发GTM、支持MySQL协议等。下面介绍其架构特点:①包括协调节点、目录节点、数据节点、PG节点等。协调节点负责sql转发,cataloging节点存储元数据,data节点存储真实数据,PG节点作为sql引擎。②巨杉数据库底层存储为NoSQL,数据以JSON格式存储,与MongoDB具有类似优势。③PG节点使用PGServer作为sql存储引擎,支持sql语法,在PG上创建表,同时创建外部服务器访问Sequoia中的数据。最近还支持MySQL,使用Sequoia作为一个可插拔的存储引擎嵌入到MySQL中。④目前作为交易场景的巨杉并不多。最大的应用案例是拥有100多个物理节点的巨型红杉集群,用于数据归档和图像管理。⑤巨杉底层是多模存储引擎,同时支持结构化数据和非结构化数据,实现统一管理。当然分布式数据库还有很多,像大梦、仁达金仓、南大通用、万里开源、中兴通讯等公司都有分布式数据库产品,这里就不一一介绍了。作者介绍:张晓海,就职于大型商业银行,目前主要负责数据库管理和新技术研究,PostgreSQL技术推广,个人公众号:数据库架构之美。【原创稿件,合作网站转载请注明原作者和出处为.com】
