❝这段时间通过对clickhouse的使用和测试,分线一些使用心得和建议。由于数据保密,过程就不展示了,直接看总结。
❞
集群情况
① 集群共有14台clickhouse-server。
② 本地表使用ReplicatedMergeTree引擎,用来写入数据;
③ 分布式表用来查询;
④ kafka表用来接入kafka数据;
⑤ 另外还有一个物化视图用于将kafka表导入本地副本表。
⑥ 单表数据量在5千多亿,大概19T左右。
入库
总体服务器负载和cpu使用率偏高,可以看出clickhouse是非常吃CPU的。
查询
① 总体查询效率比较高,如果分区范围合理,查询压力基本不大
② 查询时使用单条件查询比较快
③ 查询时使用分区字段比较快
④ select的时候尽量指定查询字段名,会比较快,因为列式存储的特性
⑤ 过滤条件不需要满足最左匹配原则,只需要过滤条件包含在索引列中即可
⑥ 简单聚合需求效率比较高,复杂聚合需求会造成内存溢出,也有可能是因为表数据量大的缘故
优点
① 数据按列存储,支持向量化
② 过滤条件不需要满足最左匹配原则,只需要过滤条件包含在索引列中即可
③ 写入速度比较快,每小时20亿数据毫无压力
④ 单表查询效率很高
⑤ 对于聚合需求,可以使用物化视图加速查询
⑥ 支持python和java udf函数
缺点
① 数据的删除和更新支持的不好
② 不支持高并发,官方建议qps为100,不建议在高并发场景中使用
③ join的写法比较特殊
④ 对CPU要求比较高
⑤ 集群运维门槛比较高,需要对clickhouse架构比较熟悉
⑥ 修改表结构比较复杂,需要同时修改本地表、分布式表、kafka表和物化视图
⑦ 服务器扩容需要手动操作,且需要重启服务器,副本数据均衡需要通过代码手动实现
⑧ 支持多目录配置,需要修改集群配置文件,并对不同表设置不同的存储策略,默认策略只能配置一个磁盘路径
⑨ 不支持事务
⑩ 表结构变更支持的不好,操作过程一言难尽
使用建议
① 使用时,关闭虚拟内存,物理内存和虚拟内存的数据交换,会导致查询变慢。
② 建表时,尽量使用后续用的比较频繁的字段做排序字段(order by),以及时间字段来做分区(partition)。如果后续查询用不到分区,尽量使用非分区表,查询效率比较高。所以,是否建立分区表跟后续的查询场景相关。
③ 尽量使用排序字段和分区字段做查询条件,分区时间范围尽量缩小
④ select语句中避免使用*
⑤ 尽量将数据汇总成大宽表查询,避免join操作
⑥ 对于需要计算的聚合指标,可以使用物化视图提前预聚合,但是查询时要指定具体的物化视图名称,不能直接使用表名查询
写在最后
以上总结和建议建立在真实测试的基础上,如果有不合理或者不完善的地方欢迎指出,共同探讨和学习。
往期推荐