数据库

首页 » 常识 » 问答 » MyNewSQL是什么全面解析青云Qi
TUhjnbcbe - 2020/12/22 1:05:00

对分布式数据库感兴趣的朋友都知道,谷歌的F1和Spanner引领了NewSQL技术的发展,于是很多公司去做NewSQL,导致好多人认为基于MySQL的分布式数据库过时了。其实不然,MySQL并没有过时,本篇文章的主角——RadonDB,就是把NewSQL领域比较流行的分布式一致性算法和MySQL结合起来,形成了新一代的分布式数据库MyNewSQL,同样做到了可扩展、高可用、强一致、易部署的特点。

那么,如何将NewSQL领域比较流行的技术和MySQL结合起来,打造一款新的分布式数据库?

RadonDB的架构

首先看一下RadonDB的架构,如上图所示,上半部分是分布式的SQL层,下面是存储层,如果我们对F1和Spanner进行抽象之后,会发现也都是这两层。

其中SQL层主要负责对用户SQL解析,然后生成分布式的执行计划和执行器,再把这些执行器下发到具体的存储节点去执行。

虽然架构看上去比较一致,但RadonDB比较特殊的一点是:下面的存储层有多个存储节点。图中每个圆圈里面都是一个存储节点,每个存储节点有三副本,三副本之间就是一个Raft协议进行数据同步,每个副本都是一个MySQL。而其他NewSQL就是一个KV或者其他的存储。

RadonDB架构层解析

下面详细阐述一下架构里面的各个技术点。

SQL节点

首先来看一下SQL节点。

用户请求到达SQL节点后,我们根据数据的分布规则生成一个分布式的执行计划,告诉用户的SQL要分发到哪些存储节点,然后根据分布式执行计划生成一个分布式的执行器,就是具体到哪些存储节点进行链接、执行、返回。

执行完之后SQL节点就会做二次运算,为什么叫二次运算?因为下面是MySQL,SQL节点把计算推到MySQL之后,SQL节点再进行二次运算,包括limit/groupby/aggregation/join。

所以说,SQL节点是一个无中心化、无状态的,扩容性强。

存储层

接着来看看存储层。

存储层由多个Node组成,每个Node就是一主两从的MySQL,但这个MySQL比较特殊,因为MySQL没有一个高可用的方案,可能大家都是MHA或者自己写一个主从切换脚本来运维。

但是RadonDB引入了Raft协议,它是无中心化的,当主库挂了后,通过Raft协议选择新主,而数据同步则基于MySQLGTID机制。

基于MySQL的好处是不仅有存储能力还有计算能力,如果一个副本只是一个KV,他的计算能力就比较有限,SQL层把数据推到存储层,然后再返回SQL节点再进行运算,这样存储层和SQL层交互就会比较多。我们尽量把计算能力下推到存储层让MySQL完成,因为MySQL跟数据是在一块的,不涉及网络传输,只需要几个I/O就将数据过滤掉了。

数据分布

刚才说了SQL层和存储层,再看一下数据怎么分布?

建一个T1表,后面指定的分区方式是HASH,在RadonDB里面默认整张表共slots,每个小表默认是18slots,其实就是一个大表分成3个小表,比如两个存储节点,这个T1表的3个小表,前16个小表在第一个存储节点上,后16个小表是在第二个节点上,是均分布的。

可能很多人认为基于MySQL扩容是个问题,但是如上所说,表分完之后,RadonDB以小表为单位做数据迁移,所以扩容非常方便。如果是加了一个新的节点,RadonDB就会把动态的一些小表迁移到新的节点上,因为我们是基于MySQL做的,首先会做一个全量,然后把位点记下来,等全量做完再追增量,这个迁移过程基本不影响业务了。

所以这样每个小表就可以在多个存储节点上动态的漂移。这些迁移规则也可以进行自定制,比如说先迁移较大的表或者热度比较高的表,让整体资源分配最快达到最优化。

如何保障高可用?

一个存储节点内三个副本怎么保证高可用的?我们将分布式一致性算法Raft和MySQL自身的GTID结合起来。

Raft主要做两件事,一个是选主,第二个是数据同步。MySQL5.7GTID,类似于Raft里面的一个logindex,数据同步是通过GTID,选主是通过Raft,我们开发了一套Raft框架,实时监测MySQL状态,如果主不正常了,就发起重新选主。

选完后新主与其他两个从库数据怎么同步呢?两个从根据自己的GTID向主那去拉数据,进行数据同步。MySQL5.7可以并行复制,过程非常迅速,主从基本没有延迟,在高压情况下延迟也非常小。而且,通过比较强的semi-sync确保事务不丢失。

存储节点里Raft和GTID是没有中心化的,可以跨机房部署,非常灵活。

分布式事务

下面看一下分布式事务,为什么分布式数据库需要分布式事务呢?

因为数据在存储节点是分布式存储的,比如说一个表在节点1、节点、节点3都有存储,然后执行了一个操作,在节点1成功了,在节点失败了,节点3成功了。这时如果没有分布式事务,那这个表其实是坏的。

如果没有分布式事务保证的话,数据随时都处于不可用的状态,只能用来存不重要的业务。所以RadonDB就提供了分布式事务,比如说刚才这个情况,就是失败之后,这个1和3存储节点自动回滚,这是分布式事务保障。

RadonDB分布式事务也是基于MySQL实现的,在MySQL里面分两阶段提交。

首先它会做xastart,然后执行SQL,做xaend,第四做xaprepare,这是第一阶段,此时事务才会从副本复制过去;第二个阶段是xa

1
查看完整版本: MyNewSQL是什么全面解析青云Qi