自己一个项目的初步方案梳理。
1.整体流程
三条路线:
1.api–>kafka–>clickhouse
问题:
- 数据无法展平和清洗,难以加工,适合a.b等简单json格式。pass
2.api展平–>kafka–>clickhouse
问题:
- api需要改造,数据需要写两套格式,要额外写一套ck的格式,侵入大。pass
2.kafka–>roc–>clickhouse
优点:
- roc中进行数据清洗,展平,格式化等操作;
- 积压数据,批量写入;
- 对之前业务完全无侵入无影响;
roc中需要实现:
-
消费逻辑
-
清洗,展平,格式化等逻辑;
-
批量写入逻辑;
-
失败处理逻辑;
-
。。。。。。
2.细节选择
2.1表引擎选择
表引擎作用:
- 决定表存储在哪里以及以何种方式存储
- 支持哪些查询以及如何支持
- 并发数据访问
- 索引的使用
- 是否可以执行多线程请求
- 数据复制参数
1.MergeTree表引擎
MergeTree在写入一批数据时,数据总会以数据片段的形式写入磁盘,且数据片段不可修改。为了避免片段过多,ClickHouse会通过后台线程,定期合并这些数据片段,属于相同分区的数据片段会被合成一个新的片段。
特点:
- 存储的数据按照主键排序:允许创建稀疏索引,从而加快数据查询速度
- 支持分区,可以通过PRIMARY KEY语句指定分区字段。
- 支持数据副本
- 支持数据采样
- 无法去重
注意:
多次插入数据,会生成多个分区文件,可以执行optimize手动合并。(或等后台线程合并)
MergeTree中主键不用于去重,用于索引。
2.ReplacingMergeTree表引擎
特点:
- 可以针对相同主键的数据进行去重,它能够在合并分区时删除重复的数据。是以ORDERBY排序键为基准的,而不是PRIMARY KEY。
- 在执行分区合并时,会触发删除重复数据。optimize的合并操作是在后台执行的,无法预测具体执行时间点,除非是手动执行。
- ReplacingMergeTree是以分区为单位删除重复数据的。只有在相同的数据分区内重复的数据才可以被删除,而不同数据分区之间的重复数据依然不能被剔除。
3.SummingMergeTree表引擎
介绍:
该引擎继承了MergeTree引擎,当合并 SummingMergeTree
表的数据片段时,ClickHouse 会把所有具有相同主键的行合并为一行,该行包含了被合并的行中具有数值数据类型的列的汇总值,即如果存在重复的数据,会对对这些重复的数据进行合并成一条数据,类似于group by的效果。
推荐将该引擎和 MergeTree
一起使用。例如,将完整的数据存储在 MergeTree
表中,并且使用 SummingMergeTree
来存储聚合数据。这种方法可以避免因为使用不正确的主键组合方式而丢失数据。
如果用户只需要查询数据的汇总结果,不关心明细数据,并且数据的汇总条件是预先明确的,即GROUP BY的分组字段是确定的,可以使用该表引擎。
特点:
- 用ORBER BY排序键作为聚合数据的条件Key。即如果排序key是相同的,则会合并成一条数据,并对指定的合并字段进行聚合。
- 以数据分区为单位来聚合数据。当分区合并时,同一数据分区内聚合Key相同的数据会被合并汇总,而不同分区之间的数据则不会被汇总。
4.Aggregatingmergetree表引擎
介绍:
该表引擎继承自MergeTree,可以使用 AggregatingMergeTree
表来做增量数据统计聚合。如果要按一组规则来合并减少行数,则使用 AggregatingMergeTree
是合适的。AggregatingMergeTree是通过预先定义的聚合函数计算数据并通过二进制的格式存入表内。
与SummingMergeTree的区别在于:
SummingMergeTree对非主键列进行sum聚合,而AggregatingMergeTree则可以指定各种聚合函数。
AggregatingMergeTree通常作为物化视图的表引擎,与普通MergeTree搭配使用。
5.CollapsingMergeTree表引擎
CollapsingMergeTree就是一种通过以增代删的思路,支持行级数据修改和删除的表引擎。它通过定义一个sign标记位字段,记录数据行的状态。如果sign标记为1,则表示这是一行有效的数据;如果sign标记为-1,则表示这行数据需要被删除。当CollapsingMergeTree分区合并时,同一数据分区内,sign标记为1和-1的一组数据会被抵消删除。
每次需要新增数据时,写入一行sign标记为1的数据;需要删除数据时,则写入一行sign标记为-1的数据。
注意:
- 数据折叠不是实时的,需要后台进行Compaction操作,用户也可以使用手动合并命令,但是效率会很低,一般不推荐在生产环境中使用。当进行汇总数据操作时,可以通过改变查询方式,来过滤掉被删除的数据。
- CollapsingMergeTree对于写入数据的顺序有着严格要求,否则导致无法正常折叠。
6.VersionedCollapsingMergeTree表引擎
上面提到CollapsingMergeTree表引擎对于数据写入乱序的情况下,不能够实现数据折叠的效果。VersionedCollapsingMergeTree表引擎的作用与CollapsingMergeTree完全相同,它们的不同之处在于,VersionedCollapsingMergeTree对数据的写入顺序没有要求,在同一个分区内,任意顺序的数据都能够完成折叠操作。
VersionedCollapsingMergeTree使用version列来实现乱序情况下的数据折叠。