猜你喜欢
ClickHouse原理解析与应用实践

ClickHouse原理解析与应用实践

书籍作者:朱凯 ISBN:9787111654902
书籍语言:简体中文 连载状态:全集
电子书格式:pdf,txt,epub,mobi,azw3 下载次数:3381
创建日期:2021-02-14 发布日期:2021-02-14
运行环境:PC/Windows/Linux/Mac/IOS/iPhone/iPad/Kindle/Android/安卓/平板
内容简介

这是一本可帮助读者深度理解并全面掌握ClickHouse运行原理并进行实践开发的工具书,涵盖了ClickHouse的时代背景、发展历程、核心概念、基础功能、运行原理、实践指导等多个维度的内容,尤其是在ClickHouse最核心的部分——MergeTree表引擎与分布式方面,书中对其实现原理和应用技巧进行了详细解读。


本书采用浅显易懂的语言+大量演示案例+大量示意图例的形式呈现,以求让读者在最短的时间内,以最舒服的方式,获得最核心的知识。本书的理论观点来自作者在OLAP领域10余年的工作思考与总结;功能与实操的素材来自作者在工作中对ClickHouse的深度应用与实践;原理解析部分的素材来自对大量专业文献的钻研与源码级的调试与解读。


本书在逻辑上分为三大部分:

第1~2章从宏观的角度出发,描述了时代背景、ClickHouse的发展历程及其核心特点。其中,对MOLAP、ROLAP和HOLAP三种架构形态的优缺点进行了详细解读,对ClickHouse的发展历程和架构形态进行了深度剖析,目的是帮助读者从根本上了解ClickHouse为什么具有这么高的性能。

第3~5章从实践应用的角度出发,详细介绍了ClickHouse基础功能的使用方法和技巧,其中包括对数据库、数据表、视图、数据字典等重点功能的剖析和演示。

第6~11章从原理的角度出发,解析了ClickHouse核心功能的运行机理。重点介绍了六大类数十种表引擎的主要特点与使用方法。其中对MergeTree的原理进行了深度解析,对它的基础数据结构、分区索引、一级索引、二级索引、压缩数据块、数据标记等重要概念进行了解读;对副本与分片的运行原理也进行了详细剖析;对它的基础数据结构、分布式DDL、分布式协同的核心操作过程等进行了解读。


作者简介

朱凯

ClickHouse贡献者之一,ClickHouse布道者,资深架构师,腾讯云*具价值专家TVP,开源爱好者,Apache DolphinScheduler Committer,《企业级大数据平台构建:架构与实现》作者,公众号“ClickHouse的秘密基地”运营者。

十多年IT从业经验,对大数据领域主流技术与解决方案有深入研究,擅长分布式系统的架构设计与整合。曾主导过多款大数据平台级产品的规划、设计与研发工作,一线实战经验丰富。现就职于远光软件股份有限公司,任大数据事业部平台开发部总经理。

前言

为什么要写这本书

生生不息,“折腾”不止。为什么新的技术层出不穷,一直会更替变换?因为人们总是乐于追求更加美好的事物,因此业务总会产生新的诉求。

在软件领域,技术与业务犹如一对不可拆分的双轨车道,承载着产品这辆火车稳步向前。一方面,业务的诉求必须得到满足,所以它倒逼技术提升;另一方面,技术的提升又为业务模式带来了新的可能。

在我所处的BI分析领域,分析软件的产品形态和底层技术就历经了几番更替。特别是在近些年,随着数字化转型浪潮的持续加温,以及“自服务”“人人都是分析师”等理念的进一步推广,分析型软件对底层OLAP技术的实时性提出了越来越苛刻的要求。传统数据库技术早已不堪重负,以Hadoop生态为代表的大数据技术也遇到了各种各样的难题。

在一次机缘巧合下我接触到了ClickHouse,我对它最初的印象极为深刻,ROLAP、在线实时查询、完整的DBMS、列式存储、不需要任何数据预处理、支持批量更新、具有非常完善的SQL支持和函数、支持高可用、不依赖Hadoop复杂生态、开箱即用……借助它仿佛就能解决所有的难题。在经过一番论证之后,我们用ClickHouse完全替换了公司现有产品的底层实现,使公司产品相关性能得到大幅提升。

ClickHouse就是这样一款拥有卓越性能的OLAP数据库,是目前业界公认的OLAP数据库黑马,有很大的发展潜力,并且已经在许多企业的内部得到应用。

然而在使用的过程中,我发现ClickHouse的学习资料匮乏,除了官方手册之外,基本没有其他成体系的资料。即便是官方手册,也缺乏一些原理性的解释。虽然它早在2016年就进行了开源,然而截至目前,市面上也没有一本相关的书籍。

作为一名ClickHouse的贡献者,我觉得有义务做些什么。所以我对自己在实践和学习ClickHouse的过程中得到的经验进行了梳理和总结,并编写成书,分享给各位读者。与此同时,也希望将这款优秀的开源软件介绍给更多的朋友。最后,希望本书能够在各位读者应用ClickHouse时提供一定的帮助。


读者对象

商业智能分析领域的工程师:作为一款性能卓越的OLAP数据库,ClickHouse非常适合用作分析软件的底层数据库。通过阅读本书,你将快速掌握ClickHouse的使用方法及其核心原理,这将有助于你顺利把ClickHouse运用在程序中,从而为程序带来数倍至数百倍的性能提升。

数据分析领域的工程师:作为分析领域的工程师,你可能会面对日志分析、用户行为分析、异常检测、流量分析等众多场景,ClickHouse可以支撑从数十行至数万亿行数据规模的一站式分析查询工作。通过阅读本书,你将快速掌握ClickHouse的使用方法,这将有助于你顺利把ClickHouse运用在分析场景中,从而带来工作效率的提升以及软硬件成本的降低。

软件架构师:作为一名软件架构师,需要持续保持敏锐的嗅觉以跟进业界的新动态。所以我向你隆重推荐ClickHouse,它是OLAP数据库领域的一项新兴技术,简单易用且拥有强大的性能。通过阅读本书,你将迅速了解ClickHouse的核心特点和能力边界。本书对ClickHouse核心原理部分的讲解将有助于你进行技术选型。如果你恰好在进行OLAP领域相关的架构设计,那么ClickHouse很可能就是你一直苦苦寻觅的那剂良方。

计算机专业的高校学生:大数据早已成为国家战略,现如今许多高校都开设了Hadoop相关的大数据课程。但Hadoop毕竟是十多年前的产物。在掌握Hadoop基础知识的同时,也应该了解业界正在运用的新兴技术。即便是没有选修大数据课程的学生,我也推荐阅读本书。因为目前在高校的教学体系中,数据库软件相关的课程大部分以介绍OLTP数据库为主(例如SQL Server),然而在实际工作中,还会用到一类专门用于分析的OLAP数据库,ClickHouse就是其中的佼佼者。本书深入浅出,体系化地介绍了ClickHouse的方方面面,非常适合作为延伸读物供相关专业的学生阅读。这将有助于大家紧跟技术潮流,提升就业竞争力。


本书特色及主要内容

这是一本全方位介绍ClickHouse的专业技术书,本书的问世不仅缓解了目前ClickHouse学习资料匮乏的局面,也纠正了网络上部分对ClickHouse的错误解读。

本书从时代背景、发展历程、核心概念、基础功能及核心原理等几个方面全面且深入地对ClickHouse进行解读。通过阅读本书,你不仅可以一站式完成对ClickHouse的学习,还能得到许多一手信息(例如ClickHouse名称的由来)。

在行文方面,本书尽可能使用浅显易懂的语言,并通过大量演示案例引导读者深入学习。在核心部分,本着一图胜千言的原则,本书配有大量的示意图例以帮助读者加深理解。

从逻辑上说,本书主体分为三大部分共11章,各章节之间以循序渐进原则来安排。

第一部分 背景篇(第1~2章),从宏观角度描述了ClickHouse出现的时代背景、发展历程以及核心特点。

第1章 阐述了ClickHouse诞生的缘由和发展历程。

第2章 快速浏览了ClickHouse的核心特性和逻辑架构,并进一步探讨了它的成功秘诀。

第二部分 基础篇(第3~5章),从使用角度介绍了ClickHouse的基础用法。

第3章 介绍了ClickHouse的安装过程,并讲解了基础封装接口和内置工具,为后续内容讲解提供演示环境。

第4章 介绍了ClickHouse的基础概念和基本操作方法,包括数据的类型、数据表的定义、数据表的基本操作(增、删、改、移等)、数据分区的基本操作(查询、删除、复制、重置、装/卸载等)。同时也介绍了DML查询的基本用法。

第5章 从内置字典和外部扩展字典两个方面对ClickHouse数据字典的工作原理和操作方法进行了介绍,尤其是ClickHouse在数据字典方面的特殊之处,本书进行了详细剖析。

第三部分 原理篇(第6~11章),从原理角度解析了ClickHouse核心功能的运行机理。

第6章 全方位深度解读了MergeTree表引擎的工作原理,包括MergeTree的基础属性和物理存储结构,以及数据分区、一级索引、二级索引、数据存储和数据标记等重要特性。

第7章 全方位深度解读了MergeTree表引擎系列中5种常用变种引擎的核心逻辑和使用方法。

第8章 介绍了除MergeTree系列之外的其余5大类共18种表引擎的核心逻辑和使用方法。

第9章 按照ClickHouse解析SQL的顺序依次介绍了WITH、FROM、SAMPLE等10余种查询子句的用法。

第10章 对副本、分片和集群的核心工作原理和使用方法进行介绍,这是实现容灾机制的必备知识。

第11章 对ClickHouse的权限管理、熔断机制、数据备份和运行监控进行剖析,以求进一步完善ClickHouse在实际工作中的安全性和健壮性。


如何阅读本书

本书会涉及分布式数据库领域的相关知识,故在阅读本书前读者应具备基础的分布式数据库的知识。另外本书假定读者对使用Java、SQL编程也有一定了解,且熟悉OLAP、分布式、多线程、集群、副本、分片等概念。

本书为照顾初学者,包含基础知识部分。如果你已经熟练掌握ClickHouse的基础知识,可以略过第3~5章的部分内容。否则,建议你顺序阅读全书。

不论是哪种类型的读者,都建议阅读第1章的内容,因为这部分不仅从时代背景的角度解读了ClickHouse的发展历程,还揭露了它的两个小秘密。通过对第1章的阅读,你会看到一个更加丰富立体的ClickHouse。

与此同时,也强烈建议所有读者阅读第6章和第10章,因为这两章阐释了ClickHouse最为核心的部分,即MergeTree的核心原理,以及副本与分片的核心原理。通过阅读这两章,你对ClickHouse运行机理的理解会更加深刻,这将有助于你把ClickHouse运用得更加炉火纯青。

由于篇幅所限,本书没有包含ClickHouse函数、配置参数的内容。我认为,要学习这部分内容,查阅官方手册是一种更为高效的方式。

本书内容基于ClickHouse 19.17.4.11版本编写,演示时所用操作系统为CentOS 7.7。书中涉及的所有演示案例,均经过实际版本验证通过。

另外,为了帮助读者更好地理解和应用书中的知识点,本书提供了专用的演示代码和部分样例数据,大家可以根据需要自行下载(https://github.com/nauu/clickhousebook)。


勘误和支持

由于水平有限,编写时间仓促,书中难免会出现一些错误或者不准确的地方,恳请读者批评指正。为此,我特意创建了一个提供在线支持与应急方案的站点https://github.com/nauu/clickhousebook。你可以将书中的错误发布在Bug勘误表页面中,也可以将遇到的任何问题发布在Q&A页面,我将尽量在线上为你提供最满意的解答。

如果你有更多的宝贵意见,也欢迎发送邮件至出版社邮箱[email protected],期待能够得到你的真挚反馈。

同时,你也可以关注我的微信公众号chcave,我会在此定期分享ClickHouse的最新资讯、趣闻杂谈、使用经验等。

致谢

感谢我的家人。如果没有你们的悉心照顾和鼓励,我不可能完成本书。

感谢我的公司远光软件。远光软件为我提供了学习和成长的环境,书中的很多知识都来自我在远光软件的工作实践。

感谢我的挚友李根。谢谢你提出了许多宝贵的建议。

感谢我的同事兼伙伴—谢小明、彭一轩、殷雷、胡艺、陈雪莹、潘登、王涛、库生玉、李昂、何宇、张锐、陈泽华、李国威、杨柯、张琛、郑凤英、姜亚玮以及名单之外的更多朋友,感谢你们在工作中对我的照顾和支持,十分荣幸能够与你们同在一个富有激情与活力的团队。

感谢ClickHouse社区的伙伴—Ivan Blinkov、Alexey Milovidov、郭炜、郑天祺、张健、李本旺、高鹏、赵群、胡宸章、杨兆辉、丁晓坤、王金海以及名单之外的更多朋友,是你们的无私奉献促进了社区的发展,加速了ClickHouse的普及。

感谢华章鲜读的读者朋友(微信名称,排名不分先后)—濤、马尚、君Hou、renwei、Luyung、朱熊、Duke、lansane、Lithium、xchf、陈刚、路途、一念之间、辛、李海武以及名单之外的更多朋友,是你们提供的宝贵建议帮助我提升了书稿的质量。


感谢机械工业出版社华章公司的编辑杨福川老师、孙海亮老师、李艺老师,在这一年多的时间中始终支持我的写作,你们的鼓励和帮助引导我顺利完成全部书稿。


目录

目  录 Contents

推荐序一

推荐序二

推荐序三

推荐序四

推荐序五

赞誉

前言

第1章 ClickHouse的前世今生1

1.1 传统BI系统之殇2

1.2 现代BI系统的新思潮2

1.3 OLAP常见架构分类4

1.4 OLAP实现技术的演进6

1.5 一匹横空出世的黑马7

1.5.1 天下武功唯快不破8

1.5.2 社区活跃8

1.6 ClickHouse的发展历程8

1.6.1 顺理成章的MySQL时期9

1.6.2 另辟蹊径的Metrage时期10

1.6.3 自我突破的OLAPServer时期10

1.6.4 水到渠成的ClickHouse时代11

1.7 ClickHouse的名称含义12

1.8 ClickHouse适用的场景12

1.9 ClickHouse不适用的场景13

1.10 有谁在使用ClickHouse13

1.11 本章小结13

第2章 ClickHouse架构概述14

2.1 ClickHouse的核心特性14

2.1.1 完备的DBMS功能15

2.1.2 列式存储与数据压缩15

2.1.3 向量化执行引擎16

2.1.4 关系模型与SQL查询17

2.1.5 多样化的表引擎18

2.1.6 多线程与分布式18

2.1.7 多主架构19

2.1.8 在线查询19

2.1.9 数据分片与分布式查询 19

2.2 ClickHouse的架构设计20

2.2.1 Column与Field20

2.2.2 DataType20

2.2.3 Block与Block流21

2.2.4 Table22

2.2.5 Parser与Interpreter22

2.2.6 Functions 与Aggregate Functions22

2.2.7 Cluster与Replication23

2.3 ClickHouse为何如此之快24

2.3.1 着眼硬件,先想后做24

2.3.2 算法在前,抽象在后24

2.3.3 勇于尝鲜,不行就换25

2.3.4 特定场景,特殊优化25

2.3.5 持续测试,持续改进25

2.4 本章小结26

第3章 安装与部署27

3.1 ClickHouse的安装过程27

3.1.1 环境准备27

3.1.2 安装ClickHouse28

3.2 客户端的访问接口31

3.2.1 CLI31

3.2.2 JDBC33

3.3 内置的实用工具35

3.3.1 clickhouse-local35

3.3.2 clickhouse-benchmark36

3.4 本章小结38

第4章 数据定义39

4.1 ClickHouse的数据类型39

4.1.1 基础类型40

4.1.2 复合类型45

4.1.3 特殊类型48

4.2 如何定义数据表49

4.2.1 数据库49

4.2.2 数据表50

4.2.3 默认值表达式52

4.2.4 临时表53

4.2.5 分区表54

4.2.6 视图55

4.3 数据表的基本操作56

4.3.1 追加新字段56

4.3.2 修改数据类型56

4.3.3 修改备注56

4.3.4 删除已有字段57

4.3.5 移动数据表57

4.3.6 清空数据表58

4.4 数据分区的基本操作58

4.4.1 查询分区信息58

4.4.2 删除指定分区58

4.4.3 复制分区数据59

4.4.4 重置分区数据60

4.4.5 卸载与装载分区60

4.4.6 备份与还原分区61

4.5 分布式DDL执行61

4.6 数据的写入61

4.7 数据的删除与修改63

4.8 本章小结64

第5章 数据字典65

5.1 内置字典65

5.1.1 内置字典配置说明65

5.1.2 使用内置字典67

5.2 外部扩展字典67

5.2.1 准备字典数据67

5.2.2 扩展字典配置文件的元素组成68

5.2.3 扩展字典的数据结构69

5.2.4 扩展字典的类型71

5.2.5 扩展字典的数据源79

5.2.6 扩展字典的数据更新策略84

5.2.7 扩展字典的基本操作85

5.3 本章小结87

第6章 MergeTree原理解析88

6.1 MergeTree的创建方式与存储结构89

6.1.1 MergeTree的创建方式89

6.1.2 MergeTree的存储结构91

6.2 数据分区93

6.2.1 数据的分区规则93

6.2.2 分区目录的命名规则94

6.2.3 分区目录的合并过程95

6.3 一级索引98

6.3.1 稀疏索引98

6.3.2 索引粒度99

6.3.3 索引数据的生成规则99

6.3.4 索引的查询过程101

6.4 二级索引102

6.4.1 granularity与index_granularity的关系104

6.4.2 跳数索引的类型105

6.5 数据存储106

6.5.1 各列独立存储106

6.5.2 压缩数据块106

6.6 数据标记109

6.6.1 数据标记的生成规则109

6.6.2 数据标记的工作方式110

6.7 对于分区、索引、标记和压缩数据的协同总结113

6.7.1 写入过程113

6.7.2 查询过程114

6.7.3 数据标记与压缩数据块的对应关系114

6.8 本章小结116

第7章 MergeTree系列表引擎117

7.1 MergeTree117

7.1.1 数据TTL117

7.1.2 多路径存储策略121

7.2 ReplacingMergeTree128

7.3 SummingMergeTree130

7.4 AggregatingMergeTree134

7.5 CollapsingMergeTree137

7.6 VersionedCollapsingMergeTree140

7.7 各种MergeTree之间的关系总结141

7.7.1 继承关系141

7.7.2 组合关系143

7.8 本章小结144

第8章 其他常见类型表引擎145

8.1 外部存储类型145

8.1.1 HDFS145

8.1.2 MySQL149

8.1.3 JDBC150

8.1.4 Kafka152

8.1.5 File157

8.2 内存类型158

8.2.1 Memory159

8.2.2 Set159

8.2.3 Join160

8.2.4 Buffer162

8.3 日志类型164

8.3.1 TinyLog164

8.3.2 StripeLog165

8.3.3 Log166

8.4 接口类型167

8.4.1 Merge167

8.4.2 Dictionary168

8.4.3 Distributed169

8.5 其他类型170

8.5.1 Live View170

8.5.2 Null171

8.5.3 URL171

8.6 本章小结173

第9章 数据查询174

9.1 WITH子句175

9.2 FROM子句177

9.3 SAMPLE子句178

9.4 ARRAY JOIN子句180

9.5 JOIN子句183

9.5.1 连接精度184

9.5.2 连接类型186

9.5.3 多表连接189

9.5.4 注意事项190

9.6 WHERE与PREWHERE子句190

9.7 GROUP BY子句193

9.7.1 WITH ROLLUP194

9.7.2 WITH CUBE194

9.7.3 WITH TOTALS195

9.8 HAVING子句195

9.9 ORDER BY子句197

9.10 LIMIT BY子句198

9.11 LIMIT子句199

9.12 SELECT子句200

9.13 DISTINCT子句200

9.14 UNION ALL子句202

9.15 查看SQL执行计划203

9.16 本章小结207

第10章 副本与分片208

10.1 概述208

10.2 数据副本209

10.2.1 副本的特点212

10.2.2 ZooKeeper的配置方式212

10.2.3 副本的定义形式213

10.3 ReplicatedMergeTree原理解析214

10.3.1 数据结构215

10.3.2 副本协同的核心流程217

10.4 数据分片228

10.4.1 集群的配置方式228

10.4.2 基于集群实现分布式DDL232

10.5 Distributed原理解析236

10.5.1 定义形式236

10.5.2 查询的分类237

10.5.3 分片规则238

10.5.4 分布式写入的核心流程239

10.5.5 分布式查询的核心流程245

10.6 本章小结251

第11章 管理与运维252

11.1 用户配置252

11.1.1 用户profile252

11.1.2 配置约束253

11.1.3 用户定义254

11.2 权限管理257

11.2.1 访问权限257

11.2.2 查询权限258

11.2.3 数据行级权限259

11.3 熔断机制261

11.4 数据备份263

11.4.1 导出文件备份263

11.4.2 通过快照表备份264

11.4.3 按分区备份264

11.5 服务监控265

11.5.1 系统表266

11.5.2 查询日志267

11.6 本章小结270

短评

不应该叫作者,应该叫译者。 第一章介绍完历史发展之后,后面的内容基本就是官网翻译了,想多看一点都没有。买来就想看看书中关于向量化执行引擎的介绍,结果作者举了一个果汁店的例子,就没了(我真的是醉了。。。)。

2020-06-14