ClickHouse进阶(六):副本与分片-2-Distributed引擎

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注IT贫道,获取高质量博客内容!

🏡个人主页:含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客

📌订阅:拥抱独家专题,你的订阅将点燃我的创作热情!

👍点赞:赞同优秀创作,你的点赞是对我创作最大的认可!

⭐️ 收藏:收藏原创博文,让我们一起打造IT界的荣耀与辉煌!

✏️评论:留下心声墨迹,你的评论将是我努力改进的方向!

博主个人B栈地址:豹哥教你大数据的个人空间-豹哥教你大数据个人主页-哔哩哔哩视频


目录

[1. 分布式表插入数据](#1. 分布式表插入数据)

[2. 分片规则](#2. 分片规则)

[3. 删除分布式表](#3. 删除分布式表)


Distributed引擎和Merge引擎类似,本身不存放数据,功能是在不同的server上把多张相同结构的物理表合并为一张逻辑表。

Distributed分布式引擎语法:

sql 复制代码
Distributed(cluster_name, database_name, table_name[, sharding_key])

对以上语法解释:

  1. cluster_name:集群名称,与集群配置文件metrika.xml中的自定义名称相对应。
  2. database_name:数据库名称。
  3. table_name:表名称。
  4. sharding_key:可选的,用于分片的key值,在数据写入的过程中,分布式表会依据分片key的规则,将数据分布到各个节点的本地表。

注意:创建分布式表是读时检查的机制,也就是说对创建分布式表和本地表的顺序并没有强制要求。

我们在clickhouse集群中各个节点上创建好了本地表person_socre,每个节点上也有不同的数据,我们需要创建分布式表来映射当前表所有数据,方便查询数据结果,如下图所示:

从实体表层面上来看,一张分片表由两部分组成:

  1. 本地表:通常以_local为后缀进行命名。本地表是承接数据的载体,可以使用非Distributed的任意表引擎,一张本地表对应了一个数据分片。
  2. 分布式表:通常以_all为后缀进行命名,分布式表只能使用Distribute表引擎,它与本地表形成一对多的映射关系,日后将通过分布式表代理操作多张本地表。

创建person_score_all分布式表:

sql 复制代码
Create table person_score_all on cluster clickhouse_cluster_3shards_1replicas (

id UInt32,

name String,

age UInt32,

gender String,

score Decimal(9,2)

)engine = Distributed(clickhouse_cluster_3shards_1replicas,default,person_score,id);

任意一台clickhouse节点查询分布式表person_score_all中的数据:

sql 复制代码
select * from person_score_all;

有了分布式表之后,我们就可以向分布式表中插入数据,那么分布式表会根据配置的sharding_key将数据写入到不同的节点分片中。

1. 分布式表插入数据

在任意节点向分布式表person_score_all中插入数据:

sql 复制代码
insert into person_score_all values (7,'a1',30,'f',1000),(8,'a2',31,'f',1001),(9,'a3',32,'f',1002),(10,'a4',33,'f',1003),(11,'a5',34,'f',1004),(12,'a6',35,'f',1005);

任意节点查询对应的person_score_all表:

sql 复制代码
select * from person_score_all;
sql 复制代码
#可以针对每张本地表进行optimize 合并数据,不能针对分布式表进行合并
#在node1上执行如下命令
node1 :) optimize table person_score;

#在node2上执行如下命令
node1 :) optimize table person_score;

#在node3上执行如下命令
node1 :) optimize table person_score;

#最终查询分布式表person_score_all

​​​​​​​2. 分片规则

分片键sharding_key要求返回一个整形类型的取值,包括Int系列和UInt系列,分片键sharding_key可以使如下几种情况:

可以是一个具体的整形列字段:

sql 复制代码
Distributed(cluster,database,table,userid)

可以按照随机数划分:

sql 复制代码
Distributed(cluster,database,table,rand())

可以按照某个整形列进行散列值划分:

sql 复制代码
Distributed(cluster,database,table,intHash64(userid))

注意:如果不声明分片键,那么分布式表只能包含一个分片,这意味着只能映射一张本地表,否则,在写入数据时将会报错。如果分布式表只包含一个分片,也就失去了分布式的意义,所以虽然分片键是选填参数,但是通常都会按照业务规则进行设置。

​​​​​​​3. 删除分布式表

删除分布式表person_score_all,任意clickhouse节点直接执行如下命令:

sql 复制代码
drop table person_score_all on cluster clickhouse_cluster_3shards_1replicas;

👨‍💻如需博文中的资料请私信博主。


相关推荐
广州智造1 小时前
OptiStruct实例:3D实体转子分析
数据库·人工智能·算法·机器学习·数学建模·3d·性能优化
技术宝哥4 小时前
Redis(2):Redis + Lua为什么可以实现原子性
数据库·redis·lua
学地理的小胖砸5 小时前
【Python 操作 MySQL 数据库】
数据库·python·mysql
dddaidai1235 小时前
Redis解析
数据库·redis·缓存
数据库幼崽6 小时前
MySQL 8.0 OCP 1Z0-908 121-130题
数据库·mysql·ocp
Amctwd6 小时前
【SQL】如何在 SQL 中统计结构化字符串的特征频率
数据库·sql
betazhou6 小时前
基于Linux环境实现Oracle goldengate远程抽取MySQL同步数据到MySQL
linux·数据库·mysql·oracle·ogg
lyrhhhhhhhh7 小时前
Spring 框架 JDBC 模板技术详解
java·数据库·spring
喝醉的小喵8 小时前
【mysql】并发 Insert 的死锁问题 第二弹
数据库·后端·mysql·死锁
付出不多9 小时前
Linux——mysql主从复制与读写分离
数据库·mysql