【术语解释】
OLTP:业务类系统主要供基层人员使用,进行一线业务操作,通常被称为OLTP(On-Line Transaction Processing,联机事务处理)
OLAP:数据分析的目标则是探索并挖掘数据价值,作为企业高层进行决策的参考,通常被称为OLAP(On-Line Analytical Processing,联机分析处理)
ROLAP:通过列存、索引等各类技术手段,提升查询时性能。
MOLAP:通过预计算提前生成聚合后的结果数据,降低查询读取的数据量,属于计算换性能方式。

【产品概要】

ClickHouse是由俄罗斯搜索引擎公司Yandex开发的一款开源的OLAP分布式数据仓库产品,源码由C++编写,完全的列存储数据库。相比于开源社区的其他几项分析型技术,如Druid、Presto、Impala、Kylin、ElasticSearch等,ClickHouse更是一整套完善的解决方案,它自包含了存储和计算能力(无需额外依赖其他存储组件),完全自主实现了高可用,而且支持完整的SQL语法包括JOIN等,技术上有着明显优势。相比于hadoop体系,以数据库的方式来做大数据处理更加简单易用,学习成本低且灵活度高。

目前国内大厂应用案例:

1、今日头条 内部用ClickHouse来做用户行为分析,内部一共几千个ClickHouse节点,单集群最大1200节点,总数据量几十PB,日增原始数据300TB左右。
2、腾讯内部用ClickHouse做游戏数据分析,并且为之建立了一整套监控运维体系。
3、携程内部从18年7月份开始接入试用,目前80%的业务都跑在ClickHouse上。每天数据增量十多亿,近百万次查询请求。
4、快手内部也在使用ClickHouse,存储总量大约10PB, 每天新增200TB, 90%查询小于3S。
#新浪提供的性能数据指标,还是较早的版本:19台服务器,300亿/天,800 /天有效的查询,基本上平均查询时间在200毫秒,核心监控查询可能时间更短,在40毫秒。业务流程:Kafka -> ClickHouse -> MySQL -> 前端Superset DashBoard

【技术架构】

分布式架构
1、Shard: 集群内划分为多个分片或分组(Shard 0 … Shard N),通过 Shard 的线性扩展能力,支持海量数据的分布式存储计算。
2、Node: 每个 Shard 内包含一定数量的节点(Node,即进程),同一 Shard 内的节点互为副本,保障数据可靠。ClickHouse 中副本数可按需建设,且逻辑上不同 Shard 内的副本数可不同。
3、ZooKeeper Service: 集群所有节点对等,节点间通过 ZooKeeper 服务进行分布式协调。

物理存储模型
数据分区: 每个分片副本的内部,数据按照 PARTITION BY 列进行分区,分区以目录的方式管理,本文样例中表按照时间进行分区。
列式存储: 每个数据分区内部,采用列式存储,每个列涉及两个文件,分别是存储数据的 .bin 文件和存储偏移等索引信息的 .mrk2 文件。
数据排序: 每个数据分区内部,所有列的数据是按照 ORDER BY 列进行排序的。可以理解为:对于生成这个分区的原始记录行,先按 ORDER BY 列进行排序,然后再按列拆分存储。
数据分块: 每个列的数据文件中,实际是分块存储的,方便数据压缩及查询裁剪,每个块中的记录数不超过 index_granularity,默认 8192。
主键索引: 主键默认与 ORDER BY 列一致,或为 ORDER BY 列的前缀。由于整个分区内部是有序的,且切割为数据块存储,ClickHouse 抽取每个数据块第一行的主键,生成一份稀疏的排序索引,可在查询时结合过滤条件快速裁剪数据块。

常用建表引擎
1、MergeTree: ClickHouse 中使用非常多的表引擎,底层采用 LSM Tree 架构,写入生成的小文件会持续 Merge。
2、Distributed: ClickHouse 中的关系映射引擎,它把分布式表映射到指定集群、数据库下对应的本地表上。

【技术特点】

1、支持数据有序存储,ClickHouse支持在建表时,指定将数据按照某些列进行sort by。在进行等值、范围查询时,where条件命中的数据都紧密存储在一个或若干个连续的Block中,而不是分散的存储在任意多个Block, 大幅减少需要IO的block数量。顺序写的特性,充分利用了磁盘的吞吐能力,即便在HDD上也有着优异的写入性能。官方公开benchmark测试显示能够达到50MB-200MB/s的写入吞吐能力,按照每行100Byte估算,大约相当于50W-200W条/s的写入速度。
2、主键索引,每个索引间隔,默认是8192行,第一个索引叫Mark行,主键索引就是记录其对应的primary key。
3、ClickHouse支持PARTITION BY子句,在建表时可以指定按照任意合法表达式进行数据分区操作。
4、在分析场景中,数据的价值随着时间流逝而不断降低,多数业务出于成本考虑只会保留最近几个月的数据,ClickHouse通过TTL提供了数据生命周期管理的能力。

5、ClickHouse更加适合低成本、大数据量的分析场景,它能够充分利用磁盘的带宽能力。数据导入和存储成本上,ClickHouse更加具有绝对的优势。

6、有限支持delete、update。删除、更新操作为异步操作,需要后台compation之后才能生效。
alter table delete where filter_expr
alter table update col=val where filter_expr

7、多核并行,ClickHouse将数据划分为多个partition,每个partition再进一步划分为多个index granularity,然后通过多个CPU核心分别处理其中的一部分来实现并行数据处理。在这种设计下,单条Query就能利用整机所有CPU。极致的并行处理能力,极大的降低了查询延时。
8、分布式计算,ClickHouse提供了可线性拓展的分布式计算能力,ClickHouse会自动将查询拆解为多个task下发到集群中,然后进行多机并行处理,最后把结果汇聚到一起。

9、ClickHouse实现了向量执行引擎(Vectorized execution engine),对内存中的列式数据,一个batch调用一次SIMD指令(而非每一行调用一次),不仅减少了函数调用次数、降低了cache miss,而且可以充分发挥SIMD指令的并行能力,大幅缩短了计算耗时。向量执行引擎,通常能够带来数倍的性能提升。
10、支持近似计算,近似计算以损失一定结果精度为代价,极大地提升查询性能。在海量数据处理中,近似计算价值更加明显。

11、ClickHouse实现了Expression级别的runtime codegen,动态地根据当前SQL直接生成代码,然后编译执行。
12、ClickHouse还提供了array、json、tuple、set等复合数据类型,支持业务schema的灵活变更。

【优缺点分析】

优点:

1、提供了极致的查询性能:开源公开benchmark显示比传统方法快1001000倍,提供50MB~200MB/s的高吞吐实时导入能力)
2、以极低的成本存储海量数据: 借助于精心设计的列存、高效的数据压缩算法,提供高达10倍的压缩比,大幅提升单机数据存储和计算能力,大幅降低使用成本,是构建海量数据仓库的绝佳方案。在实际场景下,ClickHouse 通常可以达到 10:1 的压缩比,大幅降低存储成本。同时,超高的压缩比又可以降低存储读取开销、提升系统缓存能力,从而提高查询性能。
3、简单灵活又不失强大:提供完善SQL支持,上手十分简单;提供json、map、array等灵活数据类型适配业务快速变化;同时支持近似计算、概率数据结构等应对海量数据处理。

缺点:

1、不支持事务,不支持真正的删除/更新。

2、聚合结果必须小于一台机器的内存大小。

3、不支持高并发,官方建议qps为100,可以通过修改配置文件增加连接数,但是在服务器足够好的情况下。

4、SQL满足日常使用80%以上的语法,join写法比较特殊;最新版已支持类似SQL的join,但性能不好。

【ClickHouse VS Kylin】

1、技术架构区别:
Kylin 是基于 Hadoop 的 MOLAP (Multi-dimensional OLAP) 技术,核心技术是 OLAP Cube;
ClickHouse 是基于 MPP 架构的分布式 ROLAP (Relational OLAP)分析引擎
2、技术生态:
Kylin 采用 Java 编写,充分融入 Hadoop 生态系统,使用 HDFS 做分布式存储;兼容 Hive 元数据,Kylin 只支持 SELECT 查询,schema 的修改等都需要在 Hive 中完成,然后同步到 Kylin;建模等操作通过 Web UI 完成,任务调度通过 Rest API 进行,Web UI 上可以查看任务进度。
ClickHouse 采用 C++ 编写,自成一套体系,对第三方工具依赖少。支持较完整的 DDL 和 DML,大部分操作可以通过命令行结合 SQL 就可以完成;分布式集群依赖 Zookeper 管理,单节点不用依赖 Zookeper,大部分配置需要通过修改配置文件完成。
3、适用场景:
Kylin 因为采用预计算技术, 适合有固定模式的聚合查询,例如:SQL 中的 join、group by、where条件模式比较固定等,数据量越大,使用 Kylin 的优势越明显;特别的,Kylin 在去重(count distinct)、Top N、Percentile 等场景的优势尤为巨大,大量使用在 Dashboard、各类报表、大屏展示、流量统计、用户行为分析等场景。
ClickHouse 因为采用 MPP 架构现场计算能力很强,当查询请求比较灵活,或者有明细查询需求,并发量不大的时候比较适用。