浏览器里的广告怎么推广的,seo优化的方法,提供网站建设案例,网站备案状态查询进入正文前#xff0c;感谢宝子们订阅专题、点赞、评论、收藏#xff01;关注IT贫道#xff0c;获取高质量博客内容#xff01; #x1f3e1;个人主页#xff1a;含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 #x1f4cc;订阅…
进入正文前感谢宝子们订阅专题、点赞、评论、收藏关注IT贫道获取高质量博客内容 个人主页含各种IT体系技术,IT贫道_Apache Doris,大数据OLAP体系技术栈,Kerberos安全认证-CSDN博客 订阅拥抱独家专题你的订阅将点燃我的创作热情 点赞赞同优秀创作你的点赞是对我创作最大的认可 ⭐️ 收藏收藏原创博文让我们一起打造IT界的荣耀与辉煌 ✏️评论留下心声墨迹你的评论将是我努力改进的方向 目录
1. 数据副本
2. 数据分片 clickhouse数据存储时支持副本和分片副本指的就是一份数据可以在不同的节点上存储这些节点上存储的每份数据相同数据副本是增加数据存储冗余来防止数据丢失。分片指的是clickhouse一张表的数据可以横向切分为多份每份中的数据不相同且存储在不同的节点上分片的目的主要是实现数据的水平切分方便多线程和分布式查询数据。
这里以由3台clickhouse节点组成的clickhouse集群对应的几张图来描述clickhouse中的副本与分片方便大家理解
表temp只有一个分片1个副本数据本身可看成1个副本 表temp只有一个分片每个分片有1个副本 表temp有2个分片每个分片有1个副本 1. 数据副本
存储在clickhouse中的数据想要有副本创建表时需要在对应的表引擎前面加上“Replicated”前缀组成一种新的变种引擎并且目前只有MergeTree系列表引擎才支持副本如下图所示 下面我们以ReplicatedMergeTree引擎来举例讲解clickhouse中的数据副本。
创建副本表语法
Engine ReplicatedMergeTree(zk_path,replica_name)
在上述创建语法中有zk_path和replica_name两项配置代表意思如下
zk_path:
在zookeeper中创建的数据表的路径路径名称可以自定义用户可以自己定义成希望的任何路径。clickhouse提供了一些约定俗成的配置模板/clickhouse/tables/{shard}/table_name ,其中“/clickhouse/tables”是约定俗成的路径固定前缀表示存放数据表的根路径“{shard}”表示分片编号通常使用数值代替例如01,02,03,一张数据表可以有多个分片而每个分片都拥有自己的副本“table_name”表示数据表的名称通常与物理表的名字相同。
replica_name:
定义在zookeeper中创建的副本名称该名称是区分不同副本实例的唯一标识一种约定俗成的命名方式是使用所在服务器的域名称。
创建副本表举例,我们在node1节点进入clickhouse执行如下建表语句
Create table person_info(id UInt32,name String,age UInt32,gender String,loc String) engine ReplicatedMergeTree(/clickhouse/tables/01/person_info,node1)partition by locorder by id;
在node2节点进入clickhouse执行如下建表语句
Create table person_info(id UInt32,name String,age UInt32,gender String,loc String) engine ReplicatedMergeTree(/clickhouse/tables/01/person_info,node2)partition by locorder by id;
以上两张表创建完成之后在zookeeper中会看到创建“/clickhouse/tables/01/person_info”路径对此路径下的部分重要目录解释如下
/metadata:
保存元数据信息包括主键、分区键、采样表达式。 /columns
保存列字段信息包括列名称和数据类型。 /replicas:
保存副本名称对应设置参数中的replica_name。 /leader_election:
用于主副本的选举工作主副本主要负责merge、Alter delte 、alter update操作。 在node1向表“person_info”中插入以下数据
insert into person_info values (1,zs,18,m,beijing),(2,ls,19,f,shanghai),(3,ww,20,m,beijing),(4,ml,21,m,shanghai)
插入数据之后我们在node1上进行查询
select * from person_info; 由于有副本作用在node2节点上我们同样也可以查询到表person_info中的数据
select * from person_info; 以上在node1节点或者node2节点上表“person_info”中插入数据时都会通过zookeeper的监听立即同步到另外节点可以在node1,node2节点“/var/lib/clickhouse/data/default/person_info”路径下发现相同的一份数据。 2. 数据分片
通过数据副本我们可以降低数据丢失的风险到现在为止每个副本上都有表全量数据当业务量十分庞大的场景下依靠副本并不能解决单表的新能瓶颈我们可以对一张表水平分为多个分片这些分片分别存储在不同的clickhouse集群节点中。例如一个clickhouse集群有3台节点我们在创建表temp时可以分成3个分片这3个分片内的数据不相同分别存储在不同的clickhouse节点上当然为了保证数据的高可用也可以给每个分片设置副本。
特别注意在clickhouse中每个节点只能配置在一个shard标签下的replica中不能与其他的shard标签下的replica节点名称相同。例如配置一个clickhouse集群拥有3个分片且每个分片有2个副本那么metrika.xml配置文件配置如下
remote_serversclickhouse_cluster_3shards_2replicasshardinternal_replicationtrue/internal_replicationreplicahostnode1/hostport9000/port/replicareplicahostnode2/hostport9000/port/replica/shardshardinternal_replicationtrue/internal_replicationreplicahostnode3/hostport9000/port/replicareplicahostnode4/hostport9000/port/replica/shardshardinternal_replicationtrue/internal_replicationreplicahostnode5/hostport9000/port/replicareplicahostnode6/hostport9000/port/replica/shard/clickhouse_cluster_3shards_1replicas/remote_servers
以上完成配置拥有3个分片2个副本的clickhouse集群需要6台节点。
在介绍副本时为了创建多张表我们需要分别登录到不同的clickhouse节点在各自的clickhouse节点上执行create建表命令创建的表名称都是一样的这是因为Create、Drop、Rename、Alter等DDL语句并不支持分布式执行而在分布式的clickhouse集群中我们可以使用新的语法实现分布式DDL其语法格式为
CREATE/DROP/RENAME/ALTER TABLE xxx ON CLUSTER cluste_name
其中以上“xxx”代表创建的表名称“cluster_name”对应前面集群配置文件metrika.xml中的集群名称根据配置文件clickhouse会根据集群的配置信息找到每个节点执行DDL语句“xxx”表也会在各个节点上被创建。
创建具有3分片和1副本的表“person_score”建表语句如下
Create table person_score on cluster clickhouse_cluster_3shards_1replicas (id UInt32,name String,age UInt32,gender String,score Decimal(9,2))engine ReplicatedMergeTree(/clickhouse/tables/{shard}/person_score,{replica})order by id;
注意
以上“clickhouse_cluster_3shards_1replicas”是在“/etc/clickhouse-server/config.d/metrika.xml”配置文件中配置的clickhouse集群的名称{shard}与{replica}两个变量是在metrika.xml中macros宏变量标签中配置的对应值这样当在clickhouse集群中的某台节点执行以上建表语句时clickhouse会自动在各个节点创建此表,这里每台clickhouse节点上的表person_socre是本地表。
可以在zookeeper中找到查看对应的分片信息 向表person_score中插入数据在哪台clickhouse节点向本地表person_score中插入数据那么数据就存入当前本地表对应的分片中。
#在node1向node1本地表person_score中插入以下数据
insert into person_score values (1,zs,18,m,100),(2,ls,19,f,200);#在node1上查询本地表 person_score数据
node1 :) select * from person_score; #在node2向node2本地表person_score中插入以下数据
insert into person_score values (3,ww,20,m,300),(4,ml,21,m,400);#在node2上查询本地表 person_score数据
node2 :) select * from person_score; #在node3向node3本地表person_score中插入以下数据
insert into person_score values (5,ml,22,f,500),(6,tq,23,f,600);#在node3上查询本地表 person_score数据
node3 :) select * from person_score; 以上我们创建的person_score表在clickhouse集群节点node1、node2、node3上都是本地表插入数据时插入到了对应节点的分片上查询时也只能查询对应节点上的分片数据如果我们想要通过一张表将各个clickhouse节点上的person_score表进行查询这时就需要使用Distribute表引擎所以在实际工作中clickhouse的数据分片需要结合Distriubute表引擎一同使用。 如需博文中的资料请私信博主。