一、ReplicatedMergeTree概述
ReplicatedMergeTree是ClickHouse的一种分布式表引擎,创建于2016年。它的设计目标是解决ClickHouse在分布式环境下,高并发下,数据更新频繁等问题。相较于其他分布式引擎,如Distributed、Cluster等,ReplicatedMergeTree更适用于有大量数据更新的场景。
ReplicatedMergeTree采用了一种基于数据版本协调的方式,实现了高效的数据同步和数据一致性。并且,在数据更新量非常大的情况下,仍然可以保证较好的性能。
二、ReplicatedMergeTree数据结构
ReplicatedMergeTree的核心是一种基于分区的MergerTree结构。每个分区都是一棵MergerTree,每个节点保存该节点下所有分区的数据,并维护版本。整个表是由所有分区组成的。
当向表中插入一条数据时,先根据分区键算出数据需要插入的分区。将数据插入该分区的MergerTree中的最底层——也就是叶子节点中,如果该叶子节点的数据量超过限制,则会触发一次数据合并操作。即,将多个叶子节点的数据合并到父节点,并检查合并后的节点数据量是否超限,如果超限则继续向上合并,直到所有合并后的节点数据量不超过限制。
对于删除、更新操作也是类似的。将需要删除、更新的数据插入相应的分区中,如果被删除、更新的数据位于合并节点的某个叶子节点,则将该叶子节点中对应数据删除或更新;如果在合并节点的父节点中,则将删除、更新操作标记在分支的下一次合并操作时执行。
三、ReplicatedMergeTree工作流程
当一个节点更新了数据,ReplicatedMergeTree会把更新的数据同步到所有副本上,然后将数据插入到本地的分区中。如果别的节点更新了数据,则将其同步到本地后与本地的数据进行合并。当某个节点master宕机,系统会自动将副本中的数据选出一个副本作为新的master。
在数据同步过程中,ReplicatedMergeTree采用了一种积极的策略。每次收到新的更新,节点会立即将数据同步给所有节点,并且标记本地数据为“失效”,直到所有节点都同步完成后才恢复本地数据的有效性。
四、ReplicatedMergeTree代码示例
-- 创建引擎的语法 CREATE TABLE 表名( ... ) ENGINE = ReplicatedMergeTree('集群名称', '本节点名', partition_key, order_by_expression, replicas) -- 插入数据的语法 INSERT INTO 表名(字段列表) VALUES (值列表)
五、ReplicatedMergeTree的优点
高并发下,可以保证数据一致性。ReplicatedMergeTree采用了版本控制的方式,并且在数据同步时采用了快速、积极的策略,保证数据一致性。
支持大规模更新。数据的更新、删除都是用数据插入的方式实现的。因为MergeTree本身就是一种优秀的支持大量插入操作的引擎,所以ReplicatedMergeTree也自然适合处理大规模更新场景。
自动容错。当master宕机时,系统会自动选择一个节点作为新的master,保证数据的可用性。
六、ReplicatedMergeTree的缺点
不支持数据的细粒度多版本控制。ReplicatedMergeTree只有一种全量数据版本管理方式,不支持数据的细粒度版本控制,例如列级别的版本控制。
只能工作在ClickHouse之上。ReplicatedMergeTree是ClickHouse的一种分布式引擎,只能在ClickHouse之上使用。