clickhouse-MergeTree引擎
参考文档
https://clickhouse.tech/docs/en/engines/table-engines/#mergetree
https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/replication/#table_engines-replication
前言
业务使用主要使用MergeTree,结合ZK高可用 使用Replicated*MergeTree系列。
MergeTree 系列
1.png按功能划分为6类,均继承MergeTree。
业务上主要使用MergeTree,ReplacingMergeTree,SummingMergeTree,AggregatingMergeTree
engine | function | remark |
---|---|---|
ReplacingMergeTree | 去重 | 相同分区数据去重,分区合并的时候触发,以Order by排序键为基准 |
SummingMergeTree | 预聚合 | 相同分区的数据预聚合,分区合并的时候触发,以Order by排序键为基准 |
AggregatingMergeTree | 预聚合 | 相同分区的数据预聚合,主要结合物化视图使用,需要注意!数据写入使用State函数,数据读取使用Merge函数 |
CollapsingMergeTree | 以增代删 | 以增代删,分区合并时候触发,以Order by排序键为基准。 |
VersionedCollapsingMergeTree | 以增代删 | 功能通CollapsingMergeTree,以增代删,但CollapsingMergeTree需要写入按严格的顺序,而VersionedCollapsingMergeTree不用,会在order by后自动添加version字段,保证有序 |
GraphiteMergeTree | 监控 | Graphite监控引擎,没用过 |
Replicated*MergeTree系列
数据多副本高可用主要是ReplicatedMergeTree引擎系列,结合以上的6类引擎实现不同的业务需求。数据多副本一致性,高可用主要依赖zk*
Replicated*MergeTree是在MergeTree上加了分布式功能。主要分为以下引擎,功能同MergeTree,也是我们
业务主要使用的引擎。
ReplicatedMergeTree
ReplicatedSummingMergeTree
ReplicatedReplacingMergeTree
ReplicatedAggregatingMergeTree
ReplicatedCollapsingMergeTree
ReplicatedVersionedCollapsingMergeTree
ReplicatedGraphiteMergeTree
MergeTree建表模板
CREATE TABLE [IF NOT EXISTS] [db.]table_name [ON CLUSTER cluster]
(
name1 [type1] [DEFAULT|MATERIALIZED|ALIAS expr1] [TTL expr1],
name2 [type2] [DEFAULT|MATERIALIZED|ALIAS expr2] [TTL expr2],
...
INDEX index_name1 expr1 TYPE type1(...) GRANULARITY value1,
INDEX index_name2 expr2 TYPE type2(...) GRANULARITY value2
) ENGINE = MergeTree()
ORDER BY expr
[PARTITION BY expr]
[PRIMARY KEY expr]
[SAMPLE BY expr]
[TTL expr
[DELETE|TO DISK 'xxx'|TO VOLUME 'xxx' [, ...] ]
[WHERE conditions]
[GROUP BY key_expr [SET v1 = aggr_func(v1) [, v2 = aggr_func(v2) ...]] ] ]
[SETTINGS name=value, ...]
ENGINE:表引擎(必填)
ORDER BY:排序键(必填),默认主键primary key与排序键相同。排序键可以单个列字段,也可以多个列字段
PARTITION BY:分区键 不声明分区键则ck会生成一个名为all的分区。合理使用分区 可以减少查询数据文件的扫描范围
primary key:主键 一级索引,用于加速表查询。默认主键与排序键相同
sample by:抽样表达式,很少用,一般用户数据抽样
TTL:表级别的数据生命周期,过期存储策略
settting部分:
index_granularity:索引粒度,默认值8192,不建议修改。
index_granularity_bytes:索引粒度,默认值10Mb,不同于index_granularity按行,也同样按文件大小建索引。
enable_mixed_granularity_parts:是否开启自适应索引间隔的功能,默认开启。
use_minimalistic_part_header_in_zookeeper:ZK元数据进行压缩存储。注意无法回滚,大表字段很多建议加上。
min_merge_bytes_to_use_direct_io:使用直接 I/O 来操作磁盘的合并操作时要求的最小数据量。
merge_with_ttl_timeout:TTL合并频率的最小间隔时间,默认一天(86400s)。
write_final_mark:默认为1,启用或禁用在数据片段尾部写入最终索引标记,不要改。
storage_policy:存储策略,这个需要注意,生产环境如果使用多磁盘存储策略,需要指定,否则会默认找confif.xml中配置的path路径。
index_granularity,use_minimalistic_part_header_in_zookeeper,storage_policy比较重要,需要注意。
Tips:
1,分区键不可修改,排序键理论上也不可修改,只能将新加的字段加到排序键,所以建议一开始就要定义好排序键和分区间。如果不好操作,可以考虑物化视图解决,否则只能使用类似clickhouse-copier的同步工具做reshard