作者简介姜宇翔,携程技术支持中心高级研究员。十余年数据库开发经验,参与了国内自主品牌大梦数据库从4版到7版的全过程开发,具有丰富的数据库知识和开发经验。加入携程后,专注于MySQL源码研究与改造,在MySQL存储引擎/主从复制/审计等领域做出贡献,针对各种特性需求进行针对性的功能开发。我们在使用MySQL的时候,常常会感受到多引擎下数据管理的灵活性。无论是像Innobase这样具有ACID特性的数据引擎后端,还是像BlackHole这样吃数据什么都不做的数据引擎后端,都在不同的场合发挥着各自的作用。在享受各种存储引擎带来便利的同时,我们也注意到MySQL存储引擎的发展在国内还是一片蓝海。毕竟这种以插件的形式加载到MySQL中的数据后端是一个深入底层的领域,在数据库底层开发这条道路上国内也只有少数开发者走上了这条路。这不能不说是一件令人遗憾的事情。携程技术支持中心的MySQL时序存储引擎起源于一场关于哪种时序数据库更适合携程环境的讨论。在这个日常的免费讨论中,有人心血来潮提出,能不能开发一个MySQL时序存储引擎?没有现有时序数据的繁琐部署,也没有独特的接口调用。熟悉新系统,或使用SQL访问数据。首先,让我们看看OpenTSDB长什么样。下图是OpenTSDB的部署运行图。OpenTSDB的后端存储是HBASE,信息采集前端需要部署在各个服务器上,通过dashboard展示信息。对于现有的时序数据库,各有各的部署和运行方案。然而,这些解决方案不具备架构通用性。除了底层存储组件外,我们希望MySQL用户的架构是相同的。现有的运维经验(HA、复制、备份等)和现有的开发经验(插入、删除、更新操作)大部分都可以继承以前的积累,这是任何一个使用MySQL的公司所希望的。就像下图的架构,对于上层用户来说,变化不大。用户可以通过标准的SQL编写自己的应用客户端来完成数据的采集和展示,提高了灵活性。经过以上考虑,产生了我们的实验产品——存储引擎CFL(ctripfastlog),可以用fastlog的方式记录数据。完成后如下图,满足之前设想的各种情况。技术介绍从层次结构上看,MySQL的存储引擎分为两部分。一类是存储功能实现相关的组件。这一层提供了存储引擎的具体功能(增、删、改、查),我们称之为功能层;另一个是连接MySQL插件接口的组件。引擎的函数调用,我们称之为接口层。如下图所示,数据库操作(如增、删、改、查)会通过引擎管理层到达存储引擎的接口层,再从接口层到达功能层。功能层功能层是存储引擎的核心。由于设计目标不同,存储引擎功能层提供的功能也不同。例如innobase引擎的功能层提供了事务ACID/数据存储/元信息管理/MVCC等一系列功能,提供完整的数据库功能;另一个例子是CSV存储引擎,它只提供字符类型的行存储。这些功能各异的存储引擎组件在MySQL的框架下提供了多种多样的服务。介绍携程时序存储引擎的功能层,主要从两个方面进行介绍。一是功能层的架构,即运行时涉及的对象和这些对象的功能;另一个是持久存储,这将解释数据是如何在文件级别存储的。架构CFL的架构设计目标是尽可能提高数据的插入效率,所以需要贯穿并行处理的思想。其机制是不同的会话并行向表对象中插入数据;表对象通过缓冲区保存插入的数据,当缓冲区满时,将缓冲区加入磁盘写队列,并通过专用的磁盘写线程并发写入磁盘。下图是携程时序存储引擎的架构图:在设计存储时,根据时序数据库的特点,首先考虑的是插入效率,其次是快速故障恢复。为了插入效率,在设计数据结构时,采用严格的顺序写策略,保证连续插入的效率。这样无论是在传统硬盘还是SSD硬盘上,都可以高效写入。对于快速故障恢复,通过控制写入顺序(依次写入数据、索引和控制信息)来实现快速恢复。***考虑到实现的简单性,将索引和数据分开存储,减少对同一个文件的存储管理控制。接口层程序片段下面的代码片段是接口层的一部分。MySQL提供的基类handler,存储引擎需要提供一个继承该类的类,并在基类中实现ha_open/ha_close等功能函数。继承handler类的携程时序数据库的类。接口层架构本部分将以ha_cfl为例,说明MySQL存储引擎管理层与引擎接口的关系。操作发送给会话后,会话从引擎管理层获取ha_cfl对象,将操作转换为对ha_cfl接口的调用。这一步完成了SQL与存储引擎接口的连接。ha_cfl接口接收到调用后,将调用转化为对table对象的操作,完成handler接口的函数与table对象实现的对接。效果通过对时序数据的针对性开发,CFL存储引擎的插入性能相比InnoDB和MyISAM引擎有了很大的提升。Engine\insert线程1线程(ips)3线程(ips)6线程(ips)CFL370057008400MyISAM330045006000InnoDB1900210030002核ssd虚拟机ips:insertpersecond开发、时间或人力限制使得产品不够完善,设计和实现都有提升空间。例如,在创建表时,对时间戳类型的使用和索引列的规范有限制,不能创建多列索引,只能创建时间索引。由于存储结构的限制,不能快速灵活地进行删除和更新。但是在资源有限的情况下,一个完整的概念,一个完整的产品是可以完成的。而且,正是通过这种探索性的发展,打开了MySQL存储引擎的大门。无论从整体架构到实现细节,都有深入的研究,积累了大量的经验。携程技术支持中心DBA团队希望这些经验能对以后国内的MySQL社区有所帮助。
