更新时间:2024-05-28 GMT+08:00

ClickHouse应用开发规则

集群安装为安全版,则需要保证客户端与服务端的时间一致

如果集群为安全版,需要进行kerberos认证,则需要服务端与客户端的时间一致,时间一致需要注意时区之间的时差的转换。如果时间不一致,会导致客户端认证失败,后续业务流程无法执行。

ClickHouse服务独享一个Zookeeper服务

ClickHouse强依赖Zookeeper,对Zookeeper会进行大量的读写操作,尽量一个ClickHouse服务独享一个Zookeeper,避免影响其他服务。

合理使用数据表的分区字段和索引字段

MergeTree引擎,数据是以分区目录的形式进行组织存储的,在进行的数据查询时,使用分区可以有效跳过无用的数据文件,减少数据的读取。

MergeTree引擎会根据索引字段进行数据排序,并且根据index_granularity的配置生成稀疏索引。根据索引字段查询,能快速过滤数据,减少数据的读取,大大提升查询性能。

大批量少频次的插入

ClickHouse的每次数据插入都会生成一到多个part文件,如果data part过多则会导致merge压力变大,甚至出现服务异常影响数据插入。建议一次插入10万行,每秒不超过1次插入。

不允许使用字符类型存放时间、日期或数值类型的数据

特别是需要对该时间、日期或数值类型字段进行运算或者比较的时候。

单表(分布式表)的记录数不要超过万亿,单表(本地表)不超过百亿

对于万亿以上表的查询,性能较差,且集群维护难度变大。

表的设计都要考虑到数据的生命周期管理

磁盘的空间是有限的,需要考虑数据的生命周期管理。MergeTree引擎在建表的时候支持列字段和表级的TTL。当列字段中的值过期时,ClickHouse会将它们替换成数据类型的默认值。如果分区内,某一列的所有值均已过期,则ClickHouse会从文件系统中删除这个分区目录下的列文件。当表内的数据过期时,ClickHouse会删除所有对应的行。

外部件保证数据导入的幂等

ClickHouse不支持数据写入的事务保证。通过外部导入模块控制数据的幂等,比如某个批次的数据导入异常,则drop对应的分区数据,等异常修复后重新导入该分区数据。

创建ClickHouse本地表时需要携带partition by关键字,否则在Manager上的ClickHouse数据迁移页面无法对该表进行迁移

ClickHouse数据迁移页面在对表数据进行迁移时依赖表的分区字段,如果创建表时没有使用partition by创建分区,则在Manager上的ClickHouse数据迁移页面无法对该表进行迁移。

join查询时小表在右

两表JOIN时,会将右表数据加载到内存中,再根据右表数据遍历左表做匹配,将小表放在右边,减少匹配查询的次数。根据使用的情况,大表join小表的性能比小表join大表的性能有数量级的提升。