分布式物化视图在clickhouse如何实现?
物化视图在数据层面做指标大宽表有着举足轻重的作用,分布式物化视图是对物化视图存储的数据进行分布式读取。
之前我们有一个介绍过物化视图的文章,详情请点击:clickhouse物化视图的应用,这里我们已经介绍过物化视图是什么,如何使用。
下面我们这里来介绍一下分布式物化视图的使用。我们这里使用的是分布式clickhouse集群。版本是:20.3.10.75,下面我们就来详解分布式物化视图在clickhouse的使用。
1:首先我们还是来建立三个表。 use my_test CREATE TABLE user on cluster ch_cluster ( user_id UInt16,phone String,name String,create_time DateTime ) ENGINE = MergeTree() PARTITION BY toYYYYMM(create_time) ORDER BY (user_id) SETTINGS index_granularity = 8192; CREATE TABLE bind on cluster ch_cluster ( user_id UInt16,phone String,create_time DateTime ) ENGINE = MergeTree() PARTITION BY toYYYYMM(create_time) ORDER BY (user_id) SETTINGS index_granularity = 8192; CREATE TABLE user_info on cluster ch_cluster ( user_id UInt16,sig String,node String,create_time DateTime ) ENGINE = MergeTree() PARTITION BY toYYYYMM(create_time) ORDER BY (user_id) SETTINGS index_granularity = 8192;
2:分别在不同的节点插入数据,我这里有两个节点,我们每个节点插入2条数据。 节点1如下: insert into user values(1,"18475484454","张三",now()),(2,"18465484454","李四",now()),(3,"","王五",now()),(4,"","小狗",now()) insert into bind values(1,"18475484454",now()),(3,"18475484457",now()) insert into user_info values(1,"我的地盘我做主","我的签名",now()),(3,"我的地盘我做主2","我的签名2",now())
节点2如下: insert into user values(8,"18475484454","张三4",now()),(5,"18465484454","李四5",now()),(6,"","王五6",now()),(7,"","小狗7",now()) insert into bind values(7,"18475484454",now()),(5,"18475484457",now()) insert into user_info values(4,"我的地盘我做主","我的签名4",now()),(6,"我的地盘我做主6","我的签名6",now())
3:插入完数据之后,我们去每个节点查询,因为我们需要读所有的数据,则我们需要建一下分布式表来读数据。下面是建分布式表的语句。 CREATE TABLE my_test.user_all on cluster ch_cluster(user_id UInt16,phone String,name String,create_time DateTime) ENGINE = Distributed("ch_cluster", "my_test", "user", rand()); CREATE TABLE my_test.bind_all on cluster ch_cluster(user_id UInt16,phone String,create_time DateTime) ENGINE = Distributed("ch_cluster", "my_test", "bind", rand()); CREATE TABLE my_test.user_info_all on cluster ch_cluster(user_id UInt16,sig String,node String,create_time DateTime) ENGINE = Distributed("ch_cluster", "my_test", "user_info", rand());
建立好上面的分布式表之后就能读集群所有节点的数据了。我这里贴一下user表的所有数据。
4:上面是基础的数据表,这里我们开始建物化视图表。下面的sql是把用户表,用户信息表,绑定表进行组合成大宽表,下面的脚本我们是在每个节点上存了一份快照,实际业务中我们是写数据到一个节点,不会一份数据存多份。我这里做例子就这么使用。 CREATE MATERIALIZED VIEW my_test.big_user_view on cluster ch_cluster ENGINE = MergeTree() PARTITION BY toYYYYMM(a.create_time) ORDER BY (a.user_id) POPULATE AS select a.user_id,a.name,a.create_time,b.phone,c.sig,c.node from my_test.user_all a global left join my_test.bind_all as b on a.user_id=b.user_id global left join my_test.user_info_all c on a.user_id=c.user_id;
5:上面的物化视图表我们建立好了,下面我们在物化视图表上建分布式表。 CREATE TABLE my_test.big_user_view_all on cluster ch_cluster as my_test.big_user_view ENGINE = Distributed("ch_cluster", "my_test", "big_user_view", rand());
好了,到这里我们已经可以通过物化视图分布式表读每个节点的物化视图了,业务中我们基于物化视图来做大宽表,读取物化视图分布式表是非常常见的。我之前记得之前clickhouse物化视图在微信的应用这篇文章也是比较类似。
总结 : 物化视图和普通表都可以建立分布式表。 物化视图分布式表常用于业务的大宽表使用。