TDSQL 分布式数据库的架构与解耦
TDSQL 团队在研发分布式事务型数据库的过程中,除了思考分布式事务处理技术(ACID 实现的所有技术)外,还深度探索测试验证、架构扩展、模块解耦等等各种重要的问题。
新硬件和 AI 等技术,在云环境下,如何影响着数据库的架构?
数据库各个模块间是否能解耦以降低研发的复杂度,同时缩短研发人才的培养周期?
新硬件和 AI 等技术,从架构上深深地影响了传统的数据库,这表现在如何融合这些新技术:
**首先,**数据库可能会“增加”很多新模块进去,如图 7 中的左下子图,AI 调优数据库技术使得数据库系统被扩展了,增加了很多新组件进来。**其次,**数据库的传统模块会被改变,如图 8 中的左下子图,在并行的事务型数据库系统中,提出基于 AI 技术对事务进行优化的模型。该模型采取存储过程的方式(此点类似 H-Store、VoltDB),向数据库引擎提前提供所执行的事务,然后利用 AI 技术(Markov model,马尔可夫模型)对存储过程进行分析,确定那些存储过程所代表的事务间的语义,排定事务并发执行时哪些是互相冲突的,得到一个有固定结构的事务执行模型,如图 8 左下子图中右侧,是对 TPC-C 模型 NewOrder 进行的分析得到的事务调度图。当多个 Client 发出 SQL 语句执行存储过程代表的并发事务时,据此模型即能推断事务的调度方式。这是 AI 技术改变事务处理中并发访问控制模块的一个典型事例。
下图中“d”模型是基于 RDMA 从 2 个方面对事务处理构成影响,一是事务处理的控制流,二是事务执行过程中发生的数据流。影响分布式事务处理效率的,不仅仅是庞大的数据流,而相对数据量小的控制流,也是瓶颈,因此需要引入 RDMA 来加以解决网络带宽瓶颈。
数据库中的模块发生变化
传统的数据库系统,其复杂度极高,从外看高内聚,从内看高耦合,这使得数据库的复杂度骤然提升。当各种新技术产生,影响了数据库的架构时,数据库的复杂性被再提上一个台阶。在这种背景下,研发人才的培育,其成长周期就会更长。因此,我们在思考的一个问题是:从技术上看,如何解耦数据库内部间的诸多模块?耦合度高,研发人员需要掌握数个相关模块才能良好推进工作;如果模块间解耦较好,掌握单个模块就能方便推进工作,这样人才的培育周期相应也会缩短,软件的质量也会得到提高。
所以,数据库架构背景下各个模块解耦问题,是一个技术问题。解耦工作,可以在许多层次、许多模块间展开。解耦技术,各有其妙。
上子图所示,AWS 的 Aurora 提出的存储计算分离,就是存储和计算两大模块的解耦。而微软 Deuteronomy 系统在 08 年-16 年也有过一系列相关工作。Deuteronomy 一开始采用的方案是在存储层上面实现事务,而底层的存储采用的是 KV 模型。存储层只需要提供 KV 的原子性和幂等性,上层就可以比较容易实现事务的并发访问控制和恢复。
后来的 Percolator、Spanner/F1、CockroachDB、TiDB 其实也是沿着这个思路在发展,底层是 Bigtable/Spanner 或者 RocksDB 这样的 KV 存储引擎,在存储之上封装一层事务。但是在类似 RocksDB 这样的 KV 存储中,对于 KV 记录的并发控制还是和存储紧耦合的。
存储和计算两大模块的解耦,促进了各自所囊括的子模块之间再次进行解耦,事务和存储层的解耦,该怎么进行?有的研究者,把事务处理功能提取到客户端进行(左子图),有的把事务处理功能放到中间件层实行按(中间子图),这 2 种方式不同于传统的在 Server 端进行事务处理(右子图)。
事务和存储层解耦
另外,解耦工作,其实无处不在。下图展示了算法与数据结构之间的解耦。下图的左子图,是数据库的持久化部分和内存中数据之间的设计解耦。下图的右子图,是索引的数据结构与物理存储层之间的解耦。
下图左子图,对应 VLDB 2018 的论文"FineLine: Log-structured Transactional Storage and Recovery",提出了一种事务存储和恢复机制 FineLine,舍弃了传统的 WAL,把所有需要持久化的数据存储到一个单一的数据结构,希望将数据库的持久化部分和内存中数据存储之间达到设计解耦。
FineLine 无需将内存中数据落盘到 DB,仅将内存中的 log 信息持久化到 Indexed log 中,然后通过 fetch 操作从 Indexed log 读取到数据的最新状态。通过将内存中的数据结构与其持久性表示尽量地解耦,消除了与传统基于磁盘的 RDBMS 相关的许多开销。除此之外,这种单一的持久化存储架构带来的另一个好处是,在系统发生故障后恢复的开销很低。由于 Indexed log 保持了与原子操作的一致性,当发生故障并重启时,可以从 Indexed log 中读取到已提交的最新数据记录。基于 no-steal 的策略,Undo 操作,Checkpoint 这些也都不需要。
** 计算与数据结构之间的解耦**
数据库内部,各个模块之间的解耦,与模块粒度的划分,与具体实现的系统,都有密切关系。如图 11 展示了几个主流数据库之间解耦的关系,期待能抛砖引玉,引发更多思考。
结语
数据库作为核心基础技术之一,在自主可控的时代发展潮流下,是我们必将要跨过的大山。路虽弥,不行则不至,历经十数年的研发演进,至少今天我们都已达成了许多重要的里程碑。当下而言,国产数据库从技术、人才、工业生态等各方面,都有待完善和发展,而未来更紧密的产学研结合、科技与传统产业融合趋势下,将进一步促进数据库自主可控发展。
评论