ClickHouseclickhouseClickHouse

ClickHouse Better Practices

2020-05-31  本文已影响0人  LittleMagic

前言

经过一个月的调研和快速试错,我们的ClickHouse集群已经正式投入生产环境,在此过程中总结出了部分有用的经验,现记录如下。看官可去粗取精,按照自己项目中的实际情况采纳之。(版本为19.16.14.65)

因为我们引入ClickHouse的时间并不算长,还有很多要探索的,因此不敢妄称“最佳实践”,还是叫做“更佳实践”比较好吧。

表相关事项

数据类型
分区和索引

订正:根据稀疏索引的规律,建议查询中更经常用做查询条件(WHERE谓词)的列在前,较不经常用做查询条件的列在后。如果有两列在WHERE谓词中出现的频率大致相同,则基数较大的列(即区分度较高的列)在前,基数较小的列(区分度较低的列)在后。另外,基数特别大的列(如订单ID等)不建议直接用作索引。

表参数

查询相关事项

单表查询
多表查询
负载均衡

对于循环复制拓扑的集群,查询分布式表的负载均衡策略(即load_balancing)设为first_or_random是最优的,能够充分利用机器page cache的同时,在有replica失败时也能尽量保证负载平均分配。详情可见这个issue

写入相关事项

运维相关事项

CPU

CK的“快”与其对CPU的积极利用密不可分,所以CPU的单核性能和多核性能都要尽量好一点,16核32线程左右且带较高的睿频比较合适。CK设置中的max_threads参数控制单个查询所能利用的CPU线程数,默认与本机CPU的物理核心数相同,如果服务器是CK独占的,那么就不用改,否则就改小些。

在监控集群时,CPU指标也是最重要的。实测当单个CK Server节点的CPU使用率超过70%时,服务就不太稳定了。

内存

官方文档建议单机物理内存128G左右。实测CK在我们的应用场景下内存占用并不激进,每线程对应1G内存非常绰绰有余,即max_threads设为20的话,max_memory_usage参数设为20G(懒得打辣么多0了)。为了不干扰系统的正常运行,也应配置所有查询能利用的最大内存参数max_memory_usage_for_all_queries,取物理内存的80%左右即可。

另外,CK在执行GROUP BY聚合逻辑的过程中很有可能超出内存限制,因此也建议设置max_bytes_before_external_group_by参数。在内存占用超出此阈值之后,就会spill到磁盘继续操作,且性能没有降低特别多。官方建议将它设置为max_memory_usage的一半。

存储

CK不太挑存储介质,普通7200rpm SATA HDD都可以用,也可以配置磁盘阵列,建议RAID10或者RAID6。但是如果为了快速响应,或者多数查询的数据量都很大,还是建议上SSD(我们就是如此)。另外,CK还支持基于配置文件的多盘存储、冷热数据分离和存储策略(storage policy)设置,在特定场景下可能会很有用。我们未实操过,不多讲了。

ZooKeeper

千万要调教好ZooKeeper集群,一旦ZK不可用,复制表和分布式表就不可用了。ZK的数据量基本上与CK的数据量成正相关,所以一定要配置自动清理:

autopurge.purgeInterval = 1
autopurge.snapRetainCount = 5

另外,ZK的log文件和snapshot文件建议分不同的盘存储,尽量减少follower从leader同步的磁盘压力,且余量必须要留足,毕竟硬盘的成本不算高。

The End

上文中还涉及到一些比较重要的知识点,如MergeTree索引的结构,JOIN语句的执行过程,CK与ZK的交互等等,今后有时间会分别写文章详细讲解。

618之前事情一直都会比较多,希望一切顺利。今天先这样吧。

民那晚安晚安。

上一篇 下一篇

猜你喜欢

热点阅读