ClickHouse性能之巅:从架构设计解读性能之谜
上QQ阅读APP看书,第一时间看更新

前言 Preface

为什么要写这本书

2021年,一次从深圳到上海的航班上,我和同事讨论到了客户的需求。同事反馈:客户抱怨现有的Hive数据仓库开发一个指标的周期太长,客户提出一个想法后,需要很久才能得到数据,严重降低了客户的决策效率。我自信地向同事推荐了ClickHouse——ClickHouse正好可以用来应对这类数据探索的场景。我满心欢喜地认为这个客户的需求得到了圆满的解决,然而墨菲定律再一次发挥了它强大的威力。

几周后,这位同事急吼吼地找到了我:“峰少,ClickHouse不行啊,查询速度要20多秒,离客户的1秒预期差太多了。”我的第一反应是不可能,就客户的数据量来说,再差也不会超过3秒。随即我意识到,一定是优化没有做到位。于是我开始了解同事先前的工作。

通过调研,我发现同事是在做一些加索引、合并ODS表的操作,这些操作的确将ClickHouse的速度提升了几个数量级,但是依然有着近20秒的差距。这个差距,通过索引、分区等手段是解决不了的。这让我意识到,需要从ClickHouse的底层引擎出发。最终我只是修改了其中一个数仓表的主键顺序,就成功地将查询速度从20秒优化到了100毫秒,远超客户的预期。

这个事件促使我有了写书的想法。的确,ClickHouse以速度快闻名,但事实上这是建立在对ClickHouse的底层引擎有着深度认知的基础上的。如果还是以传统数仓的方式对ClickHouse调优,就无法充分发挥ClickHouse的性能优势。

ClickHouse是数仓中的另类,为了充分发挥单机优势,放弃了很多传统数仓习以为常的设计。这导致了ClickHouse和当前的主流数仓不同的适用场景和调优方式,也给目前的数仓从业者带来了挑战:传统的调优方式无法在ClickHouse上达到极致的效果,需要对ClickHouse底层引擎有更全面的了解,并同时理解一套全新的调优的方法论。

当然,对于大部分大数据工程师来说,只需要了解ClickHouse的调优方法论。但我的很多同事在了解了ClickHouse调优的套路之后,对ClickHouse的神奇特性产生了好奇:为何更换一下位置就能将性能提升这么多?要理解这个问题,就需要对ClickHouse的底层引擎有深入了解。我写这本书,就是希望能够系统地将ClickHouse的底层引擎分析透彻,从而帮助读者知其然,更能知其所以然。

读者对象

我在写作时尽量避免解读ClickHouse源码,更注重分析ClickHouse背后的思想。因为我认为源码是思想的外在体现,同样的思想,不同的开发者在实现时会有不同的代码逻辑,所以核心在于背后的思想而不是代码的实现。本书面向的读者不仅仅是ClickHouse的C++源码开发工程师,还包括以下读者:

□ClickHouse初学者及爱好者

□软件架构师

□系统架构师

□ClickHouse开发者

□数仓建模师

□大数据工程师

□ClickHouse运维工程师

□中高级开发工程师

本书特色

本书从架构设计的层面揭示了ClickHouse查询速度快的根本原因。读者阅读本书后,能够深刻理解ClickHouse的适用场景,能够客观地认识ClickHouse并形成自己的认知,为今后在实际业务中充分发挥ClickHouse的性能提供坚实的基础。

在思想内核上,本书分为明线和暗线。明线是ClickHouse为什么查询速度快,暗线是在此基础上向读者揭示更高维度的“架构如何影响功能(能力)”这个问题,从而帮助读者在潜移默化中构建架构世界观。

如何阅读本书

本书分为两部分。

第一部分 架构篇(第1~7章),介绍ClickHouse的架构,并从架构的角度分析ClickHouse查询速度快的底层逻辑。任何架构都不可能适用于所有的场景,这部分会基于这个逻辑推导出ClickHouse的适用场景。

第二部分 实战篇(第8~12章),向读者展示ClickHouse的使用技巧、真实场景下ClickHouse如何建模、云计算时代ClickHouse的全新架构和性能优化等内容。

勘误和支持

由于作者的水平有限,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。为此,我开通了一个微信订阅号“峰少的技术空间”,读者关注后可以直接给我留言,反馈意见和建议,我会及时与大家在线交流。

书中的全部源文件可以通过以下链接下载,我也会及时更新相应的功能。

前端代码源文件链接为https://github.com/Wen-ace/frontend_project_user_profile_with_high_performance_of_clickhouse。

后端代码源文件链接为https://github.com/chen-ace/project_user_profile_with_hign_performance_of_clickhouse。

如果读者有更多的宝贵意见,也欢迎发送邮件至邮箱cfcz48@qq.com。期待能够得到你们的真挚反馈。

致谢

感谢我的恩师——南京大学胡昊教授。正是胡老师当年对我的教导,才让我有了求真探索的精神和看透表象的逻辑洞察力,也让我具备了写出这本书的能力。感谢我的恩师为本书作序。

感谢云和恩墨创始人、鲲鹏MVP盖国强老师,盖老师在数据库行业的经验非常丰富,重视提携新人,感谢盖国强老师为本书作序。

感谢我的伯乐杨磊,杨磊先生从微末中发现了我,带我进入更大的平台,给了我一个可以自由挥洒才华的舞台,是杨磊先生提高了我的视野,让我能够从不同的角度去分析问题。同时感谢杨磊先生为本书编写推荐语。

感谢我的公司滴普科技及公司的领导赵杰辉、王兵、吴小前、吕鑫。是公司给我创造了写作的条件,并给我提供了实践项目。没有公司和领导们的支持,就不会有这本书的出版。

感谢京东云数据库研发负责人高新刚、ClickHouse中国社区创始人郭炜、美创科技技术研究院数据库内核专家吕海波、StarRocks社区活跃贡献者徐昱、中国科学院软件研究所工程师温一川、中亦科技数据库产品副总经理陈宏义(老猫)、南京大学助理研究员匡宏宇博士。很荣幸本书能得到这些同行和前辈的认可。感谢你们对我的支持,为本书写推荐语。我将不断前行,输出更多优质的内容。

感谢我的同事:曹源、郑聪聪、温荣蛟、徐业洲、钱思贝、温志强、赵宇凯、刘晶、简婉晴。感谢你们为本书的创作提供了支撑。特别感谢温荣蛟先生,为第9章提供了前端代码。

感谢我的父亲陈志中。他是一个淳朴的物流司机,不擅于表达,只知道一心一意支持我,对于我求学路上的要求,从来都不打折扣地满足。也正是父亲对我的无私支持,才让我能够专心求学,最终写出了这本书。

最后感谢党和祖国,让我这个农村出身的孩子能够通过教育改变自己的命运。愿祖国繁荣昌盛。

谨以此书献给我的父亲和兄弟们,以及众多热爱ClickHouse的朋友们!