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大表的性能有数量级的提升。