ClickHouse进阶(五):副本与分片-1-副本与分片

进入正文前,感谢宝子们订阅专题、点赞、评论、收藏!关注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_servers><clickhouse_cluster_3shards_2replicas><shard><internal_replication>true</internal_replication><replica><host>node1</host><port>9000</port></replica><replica><host>node2</host><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>node3</host><port>9000</port></replica><replica><host>node4</host><port>9000</port></replica></shard><shard><internal_replication>true</internal_replication><replica><host>node5</host><port>9000</port></replica><replica><host>node6</host><port>9000</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;

注意:

  1. 以上“clickhouse_cluster_3shards_1replicas”是在“/etc/clickhouse-server/config.d/metrika.xml”配置文件中配置的clickhouse集群的名称
  2. {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表引擎一同使用。


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


本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/63481.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

2023年7月京东打印机行业品牌销售排行榜(京东运营数据分析)

鲸参谋监测的京东平台7月份打印机行业销售数据已出炉&#xff01; 7月份&#xff0c;打印机市场呈现下滑趋势。根据鲸参谋平台的数据可知&#xff0c;当月京东平台打印机的销量为48万&#xff0c;环比下降约28%&#xff0c;同比下降约18%&#xff1b;销售额为4亿&#xff0c;环…

Django(10)-项目实战-对发布会管理系统进行测试并获取测试覆盖率

在发布会签到系统中使用django开发了发布会签到系统&#xff0c; 本文对该系统进行测试。 django.test django.test是Django框架中的一个模块&#xff0c;提供了用于编写和运行测试的工具和类。 django.test模块包含了一些用于测试的类和函数&#xff0c;如&#xff1a; Tes…

【数据结构】带头双向循环链表及其实现

目录 1.带头双向循环链表 2.带头双向循环链表实现 2.1初始化 2.2销毁 2.3头插 2.4链表打印 2.5头删数据 2.6尾插数据 2.7尾删数据 2.8链表判空 2.9查找一个数据 2.10在pos位置前插入数据 2.11删除pos位置 2.12求链表的长度 2.顺序表和链表的比较 1.带头双向循环…

stable diffusion实践操作-CLIP

系列文章目录 stable diffusion实践操作 文章目录 系列文章目录前言一、CLIP是什么&#xff1f;1.1 定义&#xff1a;1.2 作用 二、使用步骤2.1 设置使用2.1 跳过层对比图&#xff1a; 三、总结 前言 学习本章之前&#xff0c;先看SD生图原理 stable diffusion实践操作-SD原理…

YOLOv5算法改进(12)— 替换主干网络之Swin Transformer

前言&#xff1a;Hello大家好&#xff0c;我是小哥谈。Swin Transformer是一种基于Transformer的深度学习模型&#xff0c;它在视觉任务中表现出色。与之前的Vision Transformer&#xff08;ViT&#xff09;不同&#xff0c;Swin Transformer具有高效和精确的特性&#xff0c;并…

B081-Lucene+ElasticSearch

目录 认识全文检索概念lucene原理全文检索的特点常见的全文检索方案 Lucene创建索引导包分析图代码 搜索索引分析图代码 ElasticSearch认识ElasticSearchES与Kibana的安装及使用说明ES相关概念理解和简单增删改查ES查询DSL查询DSL过滤 分词器IK分词器安装测试分词器 文档映射(字…

Windows NUMA编程实践 – 处理器组、组亲和性、处理器亲和性及版本变化

Windows在设计之初没有考虑过对大数量的多CPU和NUMA架构的设备的支持&#xff0c;大部分关于CPU的设计按照64个为上限来设计。核心数越来越多的多核处理器的进入市场使得微软不得不做较大的改动来进行支持&#xff0c;因此Windows 的进程、线程和NUMA API在各个版本中行为不一样…

Vue:关于声明式导航中的 跳转、高亮、以及两个类名的定制

声明式导航-导航链接 文章目录 声明式导航-导航链接router-link的两大特点&#xff08;能跳转、能高亮&#xff09;声明式导航-两个类名定制两个高亮类名 实现导航高亮&#xff0c;实现方式其实&#xff0c;css&#xff0c;JavaScript , Vue ,都可以实现。其实关于路由导航&…

【计算机组成 课程笔记】3.2 算数运算和逻辑运算的硬件实现

课程链接&#xff1a; 计算机组成_北京大学_中国大学MOOC(慕课) 3 - 2 - 302-门电路的基本原理&#xff08;11-39--&#xff09;_哔哩哔哩_bilibili 现代计算机的CPU和其他很多功能部件都是基于晶体管的集成电路&#xff0c;想要了解计算机组成的基本原理&#xff0c;还是需要有…

苹果macOS 14开发者预览版Beta 7发布 新增超过100款视频壁纸和屏保

8 月 31 日&#xff0c;苹果向 Mac 电脑用户推送了 macOS 14 开发者预览版 Beta 7 更新&#xff08;内部版本号&#xff1a;23A5337a&#xff09;&#xff0c;本次更新距离上次发布隔了 8 天。 苹果发布 Beta 7 更新的同时&#xff0c;还发布了第 6 个公测版&#xff0c;正式版…

【UIPickerView-UIDatePicker-应用程序对象 Objective-C语言】

一、今天我们来学习三个东西 1.UIPickerView-UIDatePicker-应用程序对象 1.首先,来看数据选择控件 数据选择控件, 大家对这个数据选择控件,是怎么理解的, 1)数据选择控件,首先,是不是得有数据, 2)然后呢,你还得让用户能够选择, 3)最后,你还得是一个控件儿 那…

IP子网的划分

文章目录 一、子网掩码1. 产生背景2. 定义3. 分类 二、VLSM算法1. 得出下列参数2. 计算划分结果3. 举例子计算 三、常见子网划分对应关系四、练习IP编址题目需求解题1. 192.168.1.100/282. 172.16.0.58/263. 25.83.149.222/254. 100.100.243.18/205. 10.100.100.100/10 首先可以…

代码随想录笔记--栈与队列篇

目录 1--用栈实现队列 2--用队列实现栈 3--有效的括号 4--删除字符串中的所有相邻重复项 5--逆波兰表达式求值 6--滑动窗口的最大值 7--前k个高频元素 1--用栈实现队列 利用两个栈&#xff0c;一个是输入栈&#xff0c;另一个是输出栈&#xff1b; #include <iostrea…

NodeJS的简介以及下载和安装

本章节会带大家下载并安装NodeJs 以及简单的入门&#xff0c;配有超详细的图片&#xff0c;一步步带大家进行下载与安装 NodeJs简介关于前端与后端Node是什么&#xff1f;为什么要学习NodeNodeJS的优点&#xff1a; NodeJS的下载与安装NodeJS的下载&#xff1a; NodeJS的快速入…

剑指 Offer 49. 丑数(C++实现)

剑指 Offer 49. 丑数https://leetcode.cn/problems/chou-shu-lcof/ 对每个丑数 分别乘2、乘3、乘5 即可得到后续丑数 其中只需要对计算出来的丑数结果进行去重即可 int nthUglyNumber(int n) {// base caseif (n < 1){return -1;}if (n 1){return 1;}vector<int> res…

记1次前端性能优化之CPU使用率

碰到这样的一个问题&#xff0c;用户反馈页面的图表一直加载不出来&#xff0c;页面还卡死 打开链接页面&#xff0c;打开控制台 Network 看到有个请求一直pending&#xff0c;结合用户描述&#xff0c;页面一直loading,似乎验证了我的怀疑&#xff1a;后端迟迟没有相应。 但是…

LINQ详解(查询表达式)

什么是LINQ&#xff1f; LINQ(语言集成查询)是将查询功能直接集成到C#中。数据查询表示简单的字符串&#xff0c;在编译时不会进行类型检查和IntelliSense(代码补全辅助工具)支持。 在开发中&#xff0c;通常需要对不同类型的数据源了解不同的查询语句&#xff0c;如SQL数据库…

Redis项目实战——商户查询缓存

目录 为什么要用Redis实现商户查询缓存&#xff1f;用Redis实现商户查询缓存的基本思路&#xff1f;使用Redis缓存的问题及解决方法&#xff1f;一、如何保持数据库数据和Redis缓存数据的一致性&#xff1f;1 内存淘汰机制2 超时剔除机制3 主动更新机制&#xff08;胜&#xff…

sql:SQL优化知识点记录(七)

&#xff08;1&#xff09;索引优化5 &#xff08;2&#xff09;索引优化6 &#xff08;3&#xff09;索引优化7 查询*&#xff0c; 百分号加右边&#xff0c;否则索引会失效 没建立索引之前都是全表扫描 没建立索引 建立索引&#xff1a; 建立索引 id是主键&#xff0c;他也…

全新UI站长在线工具箱系统源码带后台开源版

该系统的全开源版本可供下载&#xff0c;并且支持暗黑模式。 系统内置高达72种站长工具、开发工具、娱乐工具等功能。此系统支持本地调用API&#xff0c;同时还自带免费API接口&#xff0c; 是一个多功能性工具程序&#xff0c;支持后台管理、上传插件、添加增减删功能。 环…