参加Hackathon可以接触到内核、工具、生态各个领域中志同道合的小伙伴,通过他们的项目学习到非常好的创意。大家的想法都很奇妙,充满了创新力,在平时的研发过程中,很少能接触到这些,Hackathon能够帮助我们打开思维,让我们知道原来TiDB还可以这么玩。——He3团队TiDB在使用过程中,随着用户数据量的持续增长,存储成本在数据库总成本中的占比将会越来越高。如何有效降低数据库存储成本摆在了许多用户面前。在众多解决方案中,有一种方法是将冷热数据实现分层存储。在绝大部分场景中,数据其实都可以分为“冷数据”和“热数据”。数据划分的原则,可以根据时间远近、热点/非热点用户等等。用户通常只访问一段时间之内的数据,例如近一周或一个月。如果数据不做划分,必然会导致一定程度上的性能、成本损耗。
在刚刚收官的TiDBHackathon中,He3团队就选择了冷热数据分层存储来降低TiDB的存储成本。他们在设计中将热数据存放在TiKV上,将查询和分析几率比较少的冷数据存放到便宜通用的云存储S3,同时使S3存储引擎支持TiDB部分算子下推,实现TiDB基于S3冷数据的分析查询。项目获得了评委的一致好评,力夺本届赛事的一等奖。
这个项目为后面TiDB与S3的整合打下不错的基础,在这次Hackathon验证了可行性。它的原理其实很简单,将冷的数据放到S3,将算子尽量下推到S3,通过S3原生的select功能加速查询。当然,如果数据已经在S3,还可以通过Cloud上其他的服务,譬如Athena,来做更多的查询聚合操作,加速查询。这次大家都是在通过partition做文章,毕竟根据时间片来分的partition是非常常用的一种操作。我们内部现在也在通过LSM做一些跟S3整合的研究,我还是很期待这些都能在今年看到不少的成果产出。譬如TiDBClouddevtier集群就可以完全用这套机制来验证。
——评委唐刘点评
为什么选择冷热数据分层存储这个方向?
He3团队的队长薛港,队员时丕显、沈政,都是来自移动云数据库团队的研发工程师,三人平时的工作就是从事云数据库服务的开发,降低用户在云上使用数据库的成本是他们一直追求的目标。在去年7月份的HackingCamp中,He3就曾基于TiDB实现了提供Serverlessdb服务的ServerlessdbforHTAP项目。用户在使用TiDB时可以按使用量付费,不用再像传统RDS需要包年包月,大大降低了用户使用TiDB的成本。该项目也因此获得了HackingCamp优秀毕业生和最佳应用奖。随着产品在移动云上的落地,很多用户在使用了一段时间后发现随着数据量的增加,存储成本越来越高。薛港解释道,在公有云上,块存储收费比S3对象存储要高很多,用户部分场景的数据其实很多是冷数据,完全可以存放在S3上。于是在去年12月份时,他们就开始思考如何降低TiDB的存储成本。恰好这时TiDBHackathon启动了,薛港和时丕显、沈政一商量,就决定将冷热数据分层存储作为今年的比赛项目。在答辩时,他们专门用了一页PPT分析了运用该项目后的成本变化:
项目方向定了,接下来就该报名了。队长薛港在看电视的时候对氦-3这种元素产生了兴趣,经过了解,发现它可以用作核聚变燃料,比现有的核燃料能量更大,并且只有很少的放射性,是一种清洁高效安全的发电燃料。这种特性和他们对分布式云数据库的期望完全一致——安全、高性能、易用、价格便宜,于是He3便成了队名。在接下来不到一个月的时间中,薛港作为队长负责整体需求的确认、架构设计、方案验证以及具体框架的开发。其他队员主要负责功能开发,时丕显负责算子下推与数据类型支持,沈政重点在性能优化以及TPC-H测试。
该项目解决了什么问题?
He3开发的TiDB冷热数据分层存储项目,能够以极简的方式实现冷热数据分离:
针对普通表:实现insertintoselect的方式完成冷热数据分离:支持创建S3外部表;支持通过insertintos3_tableselectfromtikv_tablewhere...,把TiKV内部表的数据转储到S3对象存储上;支持通过insertintotikv_tableselectfroms3_tablewhere...,把S3外部表的数据转储到TiKV内部表。针对分区表:自动完成分片表转化成S3外部表,保留主表和S3外部表的主从关系。支持通过Alter分区表操作,把TiKV内部分区表的数据自动转储到对应的S3外部表中,自动完成以下几件事:内部TiKV分区表数据转存到S3对象存储中;更改分区表元数据,把TiKV内部分区表转化成S3外部表,核心要点保留S3外部表和主表的分区关系;删除TiKV内部分区表数据。转换后S3外部分区表对用户完全透明,对用户来说,S3外部表就是主表的一个分片表。例如针对主表的查询结果包含部分TiKV内部分片表以及部分S3外部表对应的分片表数据,那么返回的结果就会来自两部分:TiKV内部分片表,以及S3外部表。保证用户使用S3外部表和TiKV内部表没有任何区别:S3外部表支持所有的数据类型;S3外部表支持所有的算子;优化S3外部表操作性能在用户可接受的范围内。通过支持谓词(逻辑运算、比较运算、数值运算),聚合函数、Limit等算子下推到S3节点,利用S3的计算能力提升查询性能。为了达到期望所有效果,He3在此次Hackathon中开发修改了TiDB一些模块:
SQLParser模块、系统表模块
增加一个新的系统表,用于保存S3元数据,每一条记录对应一个S3存储元数据:包含S3的endpoint,accesskey,secretkey,s3bucket。insertintomysql.serverobjectvalues("s3object","