84.【数据库】ClickHouse从入门到放弃-VersionedCollapsingMergeTree

656 阅读4分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第20天,点击查看活动详情 

文档参考:《ClickHouse原理解析与应用实践(数据库技术丛书)(朱凯)》

80.【数据库】ClickHouse从入门到放弃-ReplacingMergeTree - 掘金 (juejin.cn)

81.【数据库】ClickHouse从入门到放弃-SummingMergeTree - 掘金 (juejin.cn)

82.【数据库】ClickHouse从入门到放弃-AggregatingMergeTree - 掘金 (juejin.cn)

83.【数据库】ClickHouse从入门到放弃-CollapsingMergeTree - 掘金 (juejin.cn)

书接前几回的文章,这次继续介绍MergeTree中的 VersionedCollapsingMergeTree

1. VersionedCollapsingMergeTree

VersionedCollapsingMergeTree表引擎的作用与CollapsingMergeTree完全相同,它们的不同之处在于,VersionedCollapsingMergeTree对数据的写入顺序没有要求,在同一个分区内,任意顺序的数据都能够完成折叠操作。VersionedCollapsingMergeTree是如何做到这一点的呢?其实从它的命名各位就应该能够猜出来,是版本号。

在定义VersionedCollapsingMergeTree的时候,除了需要指定sign标记字段以外,还需要指定一个UInt8类型的ver版本号字段:

ENGINE = VersionedCollapsingMergeTree(sign,ver)

一个完整的例子如下:

CREATE TABLE ver_collpase_table(
    id String,
    code Int32,
    create_time DateTime,
    sign Int8,
    ver UInt8
)ENGINE = VersionedCollapsingMergeTree(sign,ver)
PARTITION BY toYYYYMM(create_time)
ORDER BY id

VersionedCollapsingMergeTree是如何使用版本号字段的呢?其实很简单,在定义ver字段之后,VersionedCollapsingMergeTree会自动将ver作为排序条件并增加到ORDER BY的末端。以上面的ver_collpase_table表为例,在每个数据分区内,数据会按照ORDER BY id,ver DESC排序。所以无论写入时数据的顺序如何,在折叠处理时,都能回到正确的顺序。

可以用一组示例证明,首先是删除数据:

--删除
INSERT INTO TABLE ver_collpase_table VALUES('A000',101,'2019-02-20 00:00:00',-1,1)
 
INSERT INTO TABLE ver_collpase_table VALUES('A000',102,'2019-02-20 00:00:00',1,1)

接着是修改数据:

--修改
INSERT INTO TABLE ver_collpase_table VALUES('A000',101,'2019-02-20 00:00:00',-1,1)
 
INSERT INTO TABLE ver_collpase_table VALUES('A000',102,'2019-02-20 00:00:00',1,1)
 
INSERT INTO TABLE ver_collpase_table VALUES('A000',103,'2019-02-20 00:00:00',1,2)

上述操作中,数据均能够按照正常预期被折叠。

2. 继承关系

首先,为了便于理解,可以使用继承关系来理解MergeTree。MergeTree表引擎向下派生出6个变种表引擎,如图所示。

image.png

在ClickHouse底层的实现方法中,上述7种表引擎的区别主要体现在Merge合并的逻辑部分。下图所示是简化后的对象关系。可以看到,在具体的实现逻辑部分,7种MergeTree共用一个主体,在触发Merge动作时,它们调用了各自独有的合并逻辑。

image.png

除MergeTree之外的其他6个变种表引擎的Merge合并逻辑,全部是建立在MergeTree基础之上的,且均继承于MergeTree的MergingSortedBlockInputStream,如下图所示。

image.png

MergingSortedBlockInputStream的主要作用是按照ORDER BY的规则保持新分区数据的有序性。而其他6种变种MergeTree的合并逻辑,则是在有序的基础之上“各有所长”,要么是将排序后相邻的重复数据消除、要么是将重复数据累加汇总……

所以,从继承关系的角度来看,7种MergeTree的主要区别在于Merge逻辑部分,所以特殊功能只会在Merge合并时才会触发。

3. 组合关系

ReplicatedMergeTree与普通的MergeTree有什么区别呢?

image.png

上图中的虚线框部分是MergeTree的能力边界,而ReplicatedMergeTree在MergeTree能力的基础之上增加了分布式协同的能力,其借助ZooKeeper的消息日志广播功能,实现了副本实例之间的数据同步功能。

上图中的虚线框部分是MergeTree的能力边界,而ReplicatedMergeTree在MergeTree能力的基础之上增加了分布式协同的能力,其借助ZooKeeper的消息日志广播功能,实现了副本实例之间的数据同步功能。

ReplicatedMergeTree系列可以用组合关系来理解

image.png

当我们为7种MergeTree加上Replicated前缀后,又能组合出7种新的表引擎,这些ReplicatedMergeTree拥有副本协同的能力。