clickhouse 五(分布式表原理解析)

1,187 阅读3分钟

在clickhouse分布式集群中,我们通常需要先创建本地表再创建分布式表。因为本地表储存数据,而分布式表只是作为一个查询引擎本身不存储任何数据,查询时将sql发送到所有集群分片,然后进行进行处理和聚合后将结果返回给客户端。

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

  • 分布式表

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

  • 本地表:

真正存储数据的表

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

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

原理如下图:
在这里插入图片描述

2.创建分布式表

分布式表创建规则:

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

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

--使用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;
12345678910

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

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

参数描述:

  • 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()); 1234567

联系上面创建的本地表和分布式表,假设我们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 1234

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