clickhouse分布式表原理解析

4,078 阅读3分钟

clickhouse中的表可以分为分布式表和本地表

  • 分布式表 

逻辑存在的表,自身不存储数据,可以理解为数据库中的视图, 一般建议使用分布式表做查询操作,分布式表引擎会将我们的查询请求路由本地表进行查询, 然后进行汇总最终返回给用户

  • 本地表

 真正存储数据的表

1.分布式(Distributed)表引擎介绍

原理解析: 

分布式(Distributed)表引擎是分布式表的代名词,它⾃身不存储任何数据,⽽是作为数据分⽚的透明代理,能够⾃动的 路由数据⾄集群中的各个节点,即分布式表需要和其他数据表⼀起协同⼯作。分布式表会将接收到的读写任务, 分发到各个本地表,而实际上数据的存储也是保存在各个节点的本地表中。

原理如下图:

2.创建分布式表

分布式表创建规则:  

  • 使用on cluster语句在集群的某台机器上执行以下代码,即可在每台机器上创建本地表和分布式表, 其中⼀张本地表对应着⼀个数据分⽚,分布式表通常以本地表加“_all”命名。它与本地表形成⼀对多的映 射关系,之后可以通过分布式表代理操作多张本地表。
  • 这里有个要注意的点,就是分布式表的表结构尽量和本地表的结构一致。 如果不一致,在建表时不会报错,但在查询或者插入时可能会抛出异常。

先在每个分片上创建本地表:

--使用ReplicatedMergeTree引擎创建本地表test_log
create table test_log on cluster ck_cluster
(
    totalDate Date,
    unikey    String
)
    engine = ReplicatedMergeTree('/clickhouse/test/tables/{shard}/test_log', '{replica}')
        PARTITION BY totalDate
        ORDER BY unikey
        SETTINGS index_granularity = 8192;

分布式表引擎的创建模板:

ENGINE = Distributed(cluster, database, table, [sharding_key])

参数描述:

  • cluster:集群名称,在对分布式表执⾏读写的过程中,它会使⽤集群的配置信息来找到相应的host节点。

  • database,table:数据库和本地表名称,用于将分布式表映射到本地表上。 

  • sharding_key: 分⽚键,分布式表会按照这个规则,将数据分发到各个本地表中。

    --创建分布式表test_log_all,数据在读写时会根据rand()随机函数的取值, --决定数据写⼊哪个分⽚,也可以用hash取值。 create table test_log_all on cluster ck_cluster ( totalDate Date, unikey String ) engine = Distributed('ck_cluster', 'test', 'test_log', rand());

联系上面创建的本地表和分布式表,假设我们clickhouse集群有两个节点,其分布式表与本地表的对应关系则如下图所示:

至此,ck_cluster集群的本地表test_log和分布式表test_log_all就创建完成了。

3.使用分布式表

  • 我们的插入和查询任务都将使用分布式表,数据是分别保存本地表中的,分布式表是代理或映射关系 并不保存数据。可以理解分布式表是nginx,负责将读写任务分发到本地表。

  • 如果要彻底删除分布表,则需要分别删除分布式表和本地表,其语法规则如下:

    --删除分布式表 DROP TABLE test_log_all ON CLUSTER ck_cluster --删除本地表 DROP TABLE test_log ON CLUSTER ck_cluster

参考书籍:ClickHouse原理解析与应用实践