10 - Clickhouse集群部署以及副本和分片

news2024/11/24 14:55:17

一、副本

1、简介

2、副本写入流程

3、副本配置步骤

3.1、启动zookeeper集群

3.2、在 hallo100 的/etc/clickhouse-server/config.d 目录下创建一个名为metrika.xml 的配置文件,内容如下:

3.3、在 hallo100 的/etc/clickhouse-server/config.xml 中增加如下内容

3.4、以上的内容在其它两台服务器都需要配置一遍

3.5、重新启动3台clickhouse服务

4、测试副本

4.1、在所有服务器上分别建表

4.2、在hallo100上插入以下数据

4.3、在hallo100、hallo101、hallo102上分别查询数据,均能够查到说明配置成功了

二、分片集群

1、集群写入流程(3 分片 2 副本共 6 个节点)

2、集群读取流程(3 分片 2 副本共 6 个节点)

2.1、分片 2 副本共 6 个节点集群配置(供参考)

3、配置三节点版本集群及副本

3.1、集群及副本规划(2 个分片,只有第一个分片有副本)

3.2、配置步骤

3.3、在 hallo100上创建 Distribute 分布式表

3.4、在 hallo100上的分布式表插入测试数据

3.5、通过查询分布式表和本地表观察输出结果


一、副本

1、简介

        副本的目的主要是保障数据的高可用性,即使一台 ClickHouse 节点宕机,那么也可以从其他服务器获得相同的数据。

副本只支持合并数家族,支持的引擎如下:

2、副本写入流程

clickhouse集群没有主从之分

3、副本配置步骤

  基于上次安装的一台服务器将其它两台安装好,具体操作如下:

04 - Clickhouse-21.7.3.14-2单机版安装icon-default.png?t=O83Ahttps://blog.csdn.net/K_520_W/article/details/143823561

3.1、启动zookeeper集群

zookeeper完全分布式安装部署icon-default.png?t=O83Ahttps://blog.csdn.net/K_520_W/article/details/99340192

3.2、在 hallo100 的/etc/clickhouse-server/config.d 目录下创建一个名为metrika.xml 的配置文件,内容如下:

<?xml version="1.0"?> 
<yandex> 
 <zookeeper-servers> 
	 <node index="1"> 
		 <host>hallo100</host> 
		 <port>2181</port> 
	 </node> 
	 <node index="2"> 
		 <host>hallo101</host> 
		 <port>2181</port> 
	 </node> 
	 <node index="3"> 
		 <host>hallo102</host> 
		 <port>2181</port> 
	 </node> 
 </zookeeper-servers> 
</yandex> 

将文件的所有者改为启动clickhouse的用户所有,并且配置相关的文件的所有者必须都是

[root@hallo102 clickhouse-server]# ll config.d/
总用量 4
-rw-r--r-- 1 root root 374 11月 23 18:01 metrika.xml
[root@hallo102 clickhouse-server]#

3.3、在 hallo100 的/etc/clickhouse-server/config.xml 中增加如下内容

<zookeeper incl="zookeeper-servers" optional="true" />
<include_from>/etc/clickhouse-server/config.d/metrika.xml</include_from>

3.4、以上的内容在其它两台服务器都需要配置一遍

3.5、重新启动3台clickhouse服务

4、测试副本

4.1、在所有服务器上分别建表

副本只能同步数据,不能同步表结构,所以我们需要在每台机器上自己手动建表

/* hallo100 */
create table t_order_rep2 (
    id UInt32,
    sku_id String,
    total_amount Decimal(16,2),
    create_time Datetime
) engine =ReplicatedMergeTree('/clickhouse/table/01/t_order_rep','rep_100')
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id);

/* hallo101 */
create table t_order_rep2 (
    id UInt32,
    sku_id String,
    total_amount Decimal(16,2),
    create_time Datetime
) engine =ReplicatedMergeTree('/clickhouse/table/01/t_order_rep','rep_101')
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id);

/* hallo102 */
create table t_order_rep2 (
    id UInt32,
    sku_id String,
    total_amount Decimal(16,2),
    create_time Datetime
) engine =ReplicatedMergeTree('/clickhouse/table/01/t_order_rep','rep_102')
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id);

ReplicatedMergeTree 中,第一个参数是分片的 zk_path 一般按照: /clickhouse/table/{shard}/{table_name} 的格式写,如果只有一个分片就写 01 即可。

第二个参数是副本名称,相同的分片副本名称不能相同

4.2、在hallo100上插入以下数据

insert into t_order_rep2 values
(101,'sku_001',1000.00,'2020-06-01 12:00:00'),
(102,'sku_002',2000.00,'2020-06-01 12:00:00'),
(103,'sku_004',2500.00,'2020-06-01 12:00:00'),
(104,'sku_002',2000.00,'2020-06-01 12:00:00'),
(105,'sku_003',600.00,'2020-06-02 12:00:00');

4.3、在hallo100、hallo101、hallo102上分别查询数据,均能够查到说明配置成功了

select * from t_order_rep2;

┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 105 │ sku_003 │       600.00 │ 2020-06-02 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 101 │ sku_001 │      1000.00 │ 2020-06-01 12:00:00 │
│ 102 │ sku_002 │      2000.00 │ 2020-06-01 12:00:00 │
│ 103 │ sku_004 │      2500.00 │ 2020-06-01 12:00:00 │
│ 104 │ sku_002 │      2000.00 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘

二、分片集群

        副本虽然能够提高数据的可用性,降低丢失风险,但是每台服务器实际上必须容纳全量数据,对数据的横向扩容没有解决。

        要解决数据水平切分的问题,需要引入分片的概念。通过分片把一份完整的数据进行切分,不同的分片分布到不同的节点上,再通过 Distributed 表引擎把数据拼接起来一同使用,就是将表中的数据分别存到不同的分片中。

        **Distributed 表引擎本身不存储数据,**有点类似于 MyCat 之于 MySql,成为一种中间件,通过分布式逻辑表来写入、分发、路由来操作多台节点不同分片的分布式数据。

注意:ClickHouse 的集群是表级别的,实际企业中,大部分做了高可用,但是没有用分片,避免降低查询性能以及操作集群的复杂性。

1、集群写入流程(3 分片 2 副本共 6 个节点)

以上绿线代表内部同步,即副本自身进行同步;非内部同步的话,由distribute节点统一进行数据同步。最好是开启内部同步

2、集群读取流程(3 分片 2 副本共 6 个节点)

errors_count表示请求错误次数

2.1、分片 2 副本共 6 个节点集群配置(供参考)

配置的位置还是在之前的/etc/clickhouse-server/config.d/metrika.xml,内容如下

<yandex>
    <remote_servers>
        <test_cluster> <!-- 集群名称-->
            <shard> <!--集群的第一个分片-->
                <internal_replication>true</internal_replication>
                <!--该分片的第一个副本-->
                <replica>
                    <host>hadoop101</host>
                    <port>9000</port>
                </replica>
                <!--该分片的第二个副本-->
                <replica>
                    <host>hadoop102</host>
                    <port>9000</port>
                </replica>
            </shard>
            <shard> <!--集群的第二个分片-->
                <internal_replication>true</internal_replication>
                <replica>
                <!--该分片的第一个副本-->
                    <host>hadoop103</host>
                    <port>9000</port>
                </replica>
                <replica>
                <!--该分片的第二个副本-->
                    <host>hadoop104</host>
                    <port>9000</port>
                </replica>
            </shard>
            <shard> <!--集群的第三个分片-->
                <internal_replication>true</internal_replication>
                <replica>
                <!--该分片的第一个副本-->
                    <host>hadoop105</host>
                    <port>9000</port>
                </replica>
                <replica>
                <!--该分片的第二个副本-->
                    <host>hadoop106</host>
                    <port>9000</port>
                </replica>
            </shard>
        </test_cluster>
    </remote_servers>
</yandex>

3、配置三节点版本集群及副本

3.1、集群及副本规划(2 个分片,只有第一个分片有副本)

hallo100hallo101hallo102

01

rep_1_1

01

rep_1_2

02

rep_2_1

3.2、配置步骤

1)在 hallo100 的/etc/clickhouse-server/config.d 目录下创建 metrika-shard.xml 文件

<?xml version="1.0"?>
<yandex>
    <remote_servers>
    <test_cluster> <!-- 集群名称-->
        <shard>
        <!--集群的第一个分片-->
            <internal_replication>true</internal_replication>
            <replica>
                <!--该分片的第一个副本-->
                <host>hallo100</host>
                <port>9000</port>
            </replica>
            <replica>
                <!--该分片的第二个副本-->
                <host>hallo101</host>
                <port>9000</port>
            </replica>
        </shard>
        <shard> <!--集群的第二个分片-->
            <internal_replication>true</internal_replication>
            <replica>
                <!--该分片的第一个副本-->
                <host>hallo102</host>
                <port>9000</port>
            </replica>
        </shard>
    </test_cluster>
    </remote_servers>
    
    <zookeeper-servers>
        <node index="100">
            <host>hallo100</host>
            <port>2181</port>
        </node>
        <node index="101">
            <host>hallo101</host>
            <port>2181</port>
        </node>
        <node index="102">
            <host>hallo102</host>
            <port>2181</port>
        </node>
    </zookeeper-servers>
    
    <macros>
        <shard>01</shard> <!--不同机器放的分片数不一样-->
        <replica>rep_1_1</replica> <!--不同机器放的副本数不一样-->
    </macros>
</yandex>

2)将 hallo100的 metrika-shard.xml 同步到 hallo101和 hallo102

3)修改hallo101和 hallo102中 metrika-shard.xml 宏的配置

<!-- hallo101-->
<macros>
    <shard>01</shard> <!--不同机器放的分片数不一样-->
    <replica>rep_1_2</replica> <!--不同机器放的副本数不一样-->
</macros>

<!-- hallo102-->
<macros>
    <shard>02</shard> <!--不同机器放的分片数不一样-->
    <replica>rep_2_1</replica> <!--不同机器放的副本数不一样-->
</macros>

4) 在 hallo100、hallo101、hallo102上修改/etc/clickhouse-server/config.xml

<zookeeper incl="zookeeper-servers" optional="true" />
<include_from>/etc/clickhouse-server/config.d/metrika-shard.xml</include_from>

5)重启三台服务器上的 ClickHouse 服务

sudo clickhouse restart

6)在 hallo100 上执行建表语句

create table st_order_mt on cluster test_cluster (
    id UInt32,
    sku_id String,
    total_amount Decimal(16,2),
    create_time Datetime
) engine = ReplicatedMergeTree('/clickhouse/tables/{shard}/st_order_mt','{replica}')
partition by toYYYYMMDD(create_time)
primary key (id)
order by (id,sku_id);
  • 会自动同步到 hallo101 和 hallo1012上,因为使用了on cluster来创建表
  • 集群名字要和配置文件中的一致
  • 分片和副本名称从配置文件的宏定义中获取

3.3、在 hallo100上创建 Distribute 分布式表

create table st_order_mt_all2 on cluster test_cluster
(
    id UInt32,
    sku_id String,
    total_amount Decimal(16,2),
    create_time Datetime
)engine = Distributed(test_cluster, default, st_order_mt, hiveHash(sku_id));

参数含义:

Distributed(集群名称,库名,本地表名,分片键)

分片键必须是整型数字,所以用 hiveHash 函数转换,也可以 rand()

3.4、在 hallo100上的分布式表插入测试数据

insert into st_order_mt_all2 values
(201,'sku_001',1000.00,'2020-06-01 12:00:00') ,
(202,'sku_002',2000.00,'2020-06-01 12:00:00'),
(203,'sku_004',2500.00,'2020-06-01 12:00:00'),
(204,'sku_002',2000.00,'2020-06-01 12:00:00'),
(205,'sku_003',600.00,'2020-06-02 12:00:00');

3.5、通过查询分布式表和本地表观察输出结果

/* 分布式表 */
SELECT * FROM st_order_mt_all2;

/* 本地表 */
select * from st_order_mt;

1)查询st_order_mt_all2

hallo100 :) SELECT * FROM st_order_mt_all2;

SELECT *
FROM st_order_mt_all2

Query id: 73412df1-3a43-4378-ae53-519f3b4c9ae0

┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 202 │ sku_002 │      2000.00 │ 2020-06-01 12:00:00 │
│ 203 │ sku_004 │      2500.00 │ 2020-06-01 12:00:00 │
│ 204 │ sku_002 │      2000.00 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 205 │ sku_003 │       600.00 │ 2020-06-02 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 201 │ sku_001 │      1000.00 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘

5 rows in set. Elapsed: 0.009 sec.

hallo100 :)

2)查询hallo100的st_order_mt)

hallo100 :) select * from st_order_mt;

SELECT *
FROM st_order_mt

Query id: 63a642fb-28f5-40f2-8674-4bcf5c951104

┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 202 │ sku_002 │      2000.00 │ 2020-06-01 12:00:00 │
│ 203 │ sku_004 │      2500.00 │ 2020-06-01 12:00:00 │
│ 204 │ sku_002 │      2000.00 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘

3 rows in set. Elapsed: 0.003 sec.

hallo100 :)

3)查询hallo101的st_order_mt

hallo101 :) select * from st_order_mt;

SELECT *
FROM st_order_mt

Query id: d251d3e7-b99b-4456-982b-d80af8bead0e

┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 202 │ sku_002 │      2000.00 │ 2020-06-01 12:00:00 │
│ 203 │ sku_004 │      2500.00 │ 2020-06-01 12:00:00 │
│ 204 │ sku_002 │      2000.00 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘

3 rows in set. Elapsed: 0.003 sec.

hallo101 :)

4)查询hallo102的st_order_mt

hallo102 :) select * from st_order_mt;

SELECT *
FROM st_order_mt

Query id: bb05a57d-ef62-4a15-91ed-d923deb16c16

┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 205 │ sku_003 │       600.00 │ 2020-06-02 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘
┌──id─┬─sku_id──┬─total_amount─┬─────────create_time─┐
│ 201 │ sku_001 │      1000.00 │ 2020-06-01 12:00:00 │
└─────┴─────────┴──────────────┴─────────────────────┘

2 rows in set. Elapsed: 0.003 sec.

hallo102 :)

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

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

相关文章

Ubuntu24.04LTS设置root用户可远程登录

Ubuntu24.04LTS设置root用户可远程登录 文章目录 Ubuntu24.04LTS设置root用户可远程登录1. 设置root密码2. 设置root用户可远程登录1. 查看ssh服务是否安装2. 安装ssh服务3. 再次查看ssh服务是否安装4. 配置ssh文件5. 重启ssh服务6. root远程登录 1. 设置root密码 Ubuntu安装后…

DMA理论篇

DMA理论篇 简介 传统的数据传输都是需要CPU来实现&#xff0c;从一个地方拷贝到另一个地方&#xff1b;而DMA(Direct Memory Access)则不完全依赖CPU&#xff0c;DMA更新芯片SOC的一个控制器&#xff0c;他可以控制数据从内存中传输到另一个地方(外设、soc其它模块)&#xff…

理解原子变量之三:原子性与memory_order_relaxed

目录 CPU与内存的关系 原子性 典型使用场景 在本系列的第一篇文章理解原子变量之一&#xff1a;从互斥锁到原子变量&#xff0c;最粗浅的认识_原子互斥-CSDN博客&#xff0c;我通过几个实例从感性认识的角度介绍了原子性。本文在第一篇文章的基础上&#xff0c;从理性认识的…

医院信息化与智能化系统(22)

医院信息化与智能化系统(22) 这里只描述对应过程&#xff0c;和可能遇到的问题及解决办法以及对应的参考链接&#xff0c;并不会直接每一步详细配置 如果你想通过文字描述或代码画流程图&#xff0c;可以试试PlantUML&#xff0c;告诉GPT你的文件结构&#xff0c;让他给你对应…

青少年编程等级考试C++一级,硬币反转问题

代码 #include<iostream>using namespace std;bool a[300];int main(){ int n,m; cin >> n >> m; for(int i 1;i < m;i) { for (int j 1;j < n;j) { if( j % i 0) { a[j] !a[j];…

数字化工厂 MES试点方案全解析(二)

生产过程监控与数据采集 在生产线上部署各类传感器、数据采集终端等设备&#xff0c;与 MES 系统相连&#xff0c;实时采集生产数据&#xff0c;如设备运行参数&#xff08;温度、压力、转速等&#xff09;、产品加工数据&#xff08;尺寸、重量、加工时间等&#xff09;、物料…

动态规划子数组系列一>最长湍流子数组

1.题目&#xff1a; 解析&#xff1a; 代码&#xff1a; public int maxTurbulenceSize(int[] arr) {int n arr.length;int[] f new int[n];int[] g new int[n];for(int i 0; i < n; i)f[i] g[i] 1;int ret 1;for(int i 1; i < n-1; i,m. l.kmddsfsdafsd){int…

(十一)Python字符串常用操作

一、访问字符串值 Python访问子字符串变量&#xff0c;可以使用方括号来截取字符串。与列表的索引一样&#xff0c;字符串索引从0开始。 hh"LaoTie 666" hh[2] mm"床前明月光" mm[3] 字符串的索引值可以为负值。若索引值为负数&#xff0c;则表示由字符…

Sigrity SPEED2000 DDR simulation模式如何生成和解读DDR仿真报告-SODIMM-Write模式

Sigrity SPEED2000 DDR simulation模式如何生成和解读DDR仿真报告-SODIMM-Write模式 Sigrity SPEED2000 DDR simulation模式如何进行DDR仿真分析操作指导-SODIMM-Write模式详细介绍了如何进行DDR Write模式的仿真分析,下面基于此仿真结果进行DDR报告的输出和解读分析 在workfl…

【图像检测】深度学习与传统算法的区别(识别逻辑、学习能力、泛化能力)

识别逻辑 深度学习 使用了端到端的学习策略&#xff0c;直接学习从图像到检测结果的映射关系&#xff0c;自动提取特征&#xff0c;并且根据特征与特征之间的关系&#xff0c;计算出检测结果。 传统算法 则是人工提取特征&#xff0c;比如边缘特征&#xff0c;直线特征&#x…

TypeScript 系统学习 章节3

想学习 TypeScript 的小伙伴看过来&#xff0c;本文将带你一步步学习 TypeScript 入门相关的十四个知识点&#xff0c;详细的内容大纲请看下图&#xff1a; 一、TypeScript 是什么 TypeScript 是一种由微软开发的自由和开源的编程语言。它是 JavaScript 的一个超集&#xff0c…

opencv undefined reference to `cv::noarray()‘ 。window系统配置opencv,找到opencv库,但连接不了

之前都是在ubuntu里用opencv&#xff0c;今天为了方便在平时用Window10系统也用下c版的cv&#xff0c;就想配置一下vscode的cv环境&#xff0c;直接下载了一个编译好的opencv库&#xff08;带build文件夹的&#xff09;&#xff0c;刚开始用的是visual studio的编译器&#xff…

利用FileZilla搭建ftp服务器

一 利用windows自带的ftp服务搭建服务器&#xff0c;要复杂一些&#xff0c;好处是无需借用外部软件。 也有一些好的工具&#xff0c;如FileZilla的Server版&#xff0c;构建过程简单&#xff0c;好用。 下面看看。 二 安装FileZilla Server 当前下载版本是0.9.43&#xf…

【刷题21】BFS解决FloodFill算法专题

目录 一、图像渲染二、岛屿数量三、岛屿的最大面积四、被环绕的区域 一、图像渲染 题目&#xff1a; 思路&#xff1a; 如果起始位置的颜色(数值)与color相同&#xff0c;直接返回该数组上下左右一层一层的找与当前位置颜色相同的&#xff0c;并且该位置不越界&#xff0c;然…

DICOM核心概念:显式 VR(Explicit VR)与隐式 VR(Implicit VR)在DICOM中的定义与区别

在DICOM&#xff08;Digital Imaging and Communications in Medicine&#xff09;标准中&#xff0c;VR&#xff08;Value Representation&#xff09; 表示数据元素的值的类型和格式。理解显式 VR&#xff08;Explicit VR&#xff09;与隐式 VR&#xff08;Implicit VR&#…

【Isaac Sim】加载自带模型或示例时报 Isaac Sim is not responding

Isaac Sim对电脑配置要求很高&#xff0c;开机第一次打开 Isaac Sim 时&#xff0c;直接就报 Isaac Sim is not responding 卡死了&#xff0c;这是由于第一次需要加载一些资源&#xff0c;耗时会导致 Isaac Sim 无响应&#xff0c;这里等一会会自动给回复。 加载自带模型或示…

如何读论文【论文精读·1】

第一遍题目 摘要 结论 方法 实验 是不是适合自己看看自己适不适合这篇文章。&#xff08;花时最少&#xff0c;做海选&#xff09; 不需要懂太具体的公式。这一遍阅读之后&#xff0c;你需要再继续思考一下这篇论文的质量以及和自己研究方向的契合程度&#xff0c;决定一下自己…

SpringBoot整合SpringSecurity实现一个简单的认证与授权应用

1、SpringSecurity 的简介 Spring Security 是一个功能强大且高度可定制的身份验证和访问控制框架&#xff0c;它是 Spring 项目组中用来提供安全认证服务的框架&#xff0c;能够为基于 Sprin g的企业应用系统提供声明式的安全访问控制解决方案。 Spring Security 的前身是 A…

CPU命名那些事

一、Intel CPU命名 1. 命名结构 Intel CPU 的命名通常包含以下几个部分&#xff1a; 品牌 产品线 系列 代数 具体型号 后缀 例如&#xff1a;Intel Core i7-13700K 2. 各部分含义 品牌 Intel&#xff1a;表示厂商&#xff08;几乎所有命名中都有&#xff09;。不同品…

爬虫与反爬-Ja3指纹风控(Just a moment...)处理方案及参数说明

概述&#xff1a;本文将针对 Ja3 指纹检测风控进行处理&#xff0c;举例了一个案例并使用两种不同的破解方案进行突破&#xff0c;同时深入了解指纹间不同字符所代表的含义 指纹检测背景&#xff1a; 1、每一个设备、软件都有独属于自己的设备信息、版本号、加密算法、椭圆算…