亿级数据库毫秒级查询?看完这一篇,海量数据赋能你也行

近年来,随着大数据分析技术的普及和物联网产业的兴起,越来越多的企业开始重视海量数据的收集和分析处理活动,希望从庞大的数据资料中挖掘出高价值的信息和洞见 。而在数据规模快速膨胀的同时,企业对数据处理平台的软硬件基础设施也提出了更高的要求,并在这一领域催生了很多高水平的前沿技术变革 。
在这样的趋势下,由俄罗斯 Yandex 开发的一款名为 Clickhouse 的数据库产品就在众多竞争者中脱颖而出,凭借十亿乃至百亿行的数据规模下依旧具备秒级返回能力的卓越性能,赢得了全球众多大厂的青睐 。Clickhouse 究竟有怎样的独门绝技,如何做到如此强悍的性能表现,实践中又是如何在主流云平台上部署和优化的?9 月 22 日,来自京东智联云云产品研发部的架构师王向飞老师做客 InfoQ,介绍了 Clickhouse 数据库在京东智联云的落地应用与优化改进经历,为想要深入了解 Clickhouse 的小伙伴们送上了一堂干货满满的技术分享课程 。
本文总结自王向飞老师的在线公开课:《Clickhouse 在京东智联云的大规模应用和架构改良》 。

亿级数据库毫秒级查询?看完这一篇,海量数据赋能你也行

文章插图
 
根据数据库处理的业务数据量,以及处理数据的不同方式,人们把数据库分为 OLTP 和 OLAP 两大类型 。由俄罗斯 Yandex 搜索引擎公司开发并开源的 Clickhouse 数据库,其初始定位就是 Yandex 内部的分析型数据库,符合 OLAP 类型数据库的实现特点 。Clickhouse 的性能超过了很多流行的商业数据库,已经得到了包括 CloudFlare、Spotify、阿里云、腾讯云、京东智联云、今日头条、携程等诸多头部大厂的采用 。
OLTP vs OLAP
常见的 Oracle、MySQL 等数据库都属于 OLTP 类型,也就是 On-Line Transaction Processing,联机事务处理 。OLTP 数据库处理请求和数据时对延迟要求很高,并且要保证数据的完整性和一致性 。此类数据库是面向最终客户的,需要具备 7x24 不间断服务能力 。
OLAP 的含义是联机分析数据处理,这种数据库需要存储海量、但很少更新修改的数据,主要用于多维度历史数据分析统计目的 。出于这种需求,OLAP 数据库需要确保足够高的查询效率,至少 90% 的请求要在很短的时间内返回 。
另一方面,OLAP 数据库并不是直接面对最终客户,而是更关注数据吞吐,要求海量数据尽快持久化,为业务决策、战略定位和分析、个性化推荐等任务提供分析统计能力,所以这类数据库中的查询一般都是较低频的 。
Clickhouse 的关键特性:
列式存储基于 OLAP 数据库的特点,Clickhouse 采用了基于列的数据存储引擎 。传统的行式数据库在存储信息时,是在数据库中按顺序逐个记录的 。以用户注册信息为例,行式数据库会将每个用户的姓名、职业、年龄等数据依次记录下来 。当业务需要查找注册用户的职业或年龄分布时,数据库需要打开所有存储用户注册信息的文件,遍历全部数据行,依次挑出所有职业和年龄信息进行汇总 。使用这种方式,查询遍历的数据往往远大于所需的数据大小,对 IO 能力会造成严重浪费 。
相比之下,列式存储会将数据分为多个属性列,例如用户注册信息分为职业、年龄等多个属性,并按这些属性列分为多个文件分别存储 。这样当查询需要获取其中某些属性的数据时,只需查找对应文件即可完成,大大节约了 IO 需求 。
以一个包含 1 亿条数据的测试表为例,一个简单的 count 查询在 MySQL 上需要两分多钟,而在列式存储的 Clickhouse 数据库上仅用不足 1 秒就返回了结果 。那么,Clickhouse 具体都使用了哪些技术来实现如此高的效率提升呢?
亿级数据库毫秒级查询?看完这一篇,海量数据赋能你也行

文章插图
 
B+Tree vs MergeTree
在深入研究 Clickhouse 之前,我们首先以传统的 MySQL InnoDB 的存储格式来做对比 。
亿级数据库毫秒级查询?看完这一篇,海量数据赋能你也行

文章插图
 
从 InnoDB 的逻辑结构图可以看到,在 InnoDB 中所有数据会被放在表空间内 。表空间可以看作是 InnoDB 的逻辑最高层,由多个段组成,段又分为数据段、索引段 。数据生成时按顺序写入数据段,随着数据记录的增多,InnoDB 会将一些主键值放到索引段内以实现快速定位 。
随着数据量不断增多,数据库形成了名为 B+Tree 的树状结构 。这个树有层级结构,会横向生长,其查询的复杂度取决于树的高度 。B+Tree 的数据节点一般存储主键值,根据主键查找时可以通过叶子节点大概定位数据页,之后直接读取数据页即可 。


推荐阅读