乐趣区

关于数据库:ClickHouse安装及集群搭建

本文介绍如何在 CentOS 零碎上装置 ClickHouse 以及集群部署。

本文依赖的环境为 CentOS-7.4.1708,应用clickhouse 的版本为20.9.3.45

单节点装置

在线 yum 装置

clickhouse的安装包并不在 Linux 官网 yum 仓库中,所以首先须要增加 clickhouseyum镜像:

curl -s https://packagecloud.io/install/repositories/altinity/clickhouse/script.rpm.sh | sudo bash

查看镜像状况:

[root@master ~]# yum list | grep clickhouse
clickhouse-client.x86_64                 20.8.3.18-1.el7               Altinity_clickhouse
clickhouse-common-static.x86_64          20.8.3.18-1.el7               Altinity_clickhouse
clickhouse-debuginfo.x86_64              20.1.11.73-1.el7              Altinity_clickhouse
clickhouse-odbc.x86_64                   1.1.9-1.el7                   Altinity_clickhouse
clickhouse-server.x86_64                 20.8.3.18-1.el7               Altinity_clickhouse
clickhouse-server-common.x86_64          20.8.3.18-1.el7               Altinity_clickhouse
clickhouse-test.x86_64                   20.8.3.18-1.el7               Altinity_clickhouse
clicktail.x86_64                         1.0.20180401-1                Altinity_clickhouse

由此可见,应用 yum 在线装置的版本最新到 20.8.3.18。然而实际上clickhouse 曾经迭代了很多版本,所以咱们不采纳此种装置形式,而采纳 rpm 包的装置形式。

PS:有了下面的信息,yum形式装置 clickhouse 就很简略了,间接 yum install -y clickhouse-server-common.x86_64 clickhouse-server.x86_64 clickhouse-client.x86_64装置即可,此处就不演示了。

rpm 包离线装置

咱们能够从官网 rpm 镜像仓库找到各种版本的 rpm 安装包,官网地址是:https://repo.yandex.ru/clickh…。

咱们抉择 20.9.3.45 版本的rpm 包,次要须要以下三个包:

clickhouse-client-20.9.3.45-2.noarch.rpm
clickhouse-server-20.9.3.45-2.noarch.rpm
clickhouse-common-static-20.9.3.45-2.x86_64.rpm

装置命令如下:

rpm -ivh clickhouse-common-static-20.9.3.45-2.x86_64.rpm clickhouse-client-20.9.3.45-2.noarch.rpm clickhouse-server-20.9.3.45-2.noarch.rpm

如下图所示,咱们即在 node5 这台机器上装置好了clickhouse

[root@node5 ck]# rpm -ivh clickhouse-common-static-20.9.3.45-2.x86_64.rpm clickhouse-client-20.9.3.45-2.noarch.rpm clickhouse-server-20.9.3.45-2.noarch.rpm
正告:clickhouse-common-static-20.9.3.45-2.x86_64.rpm: 头 V4 RSA/SHA1 Signature, 密钥 ID e0c56bd4: NOKEY
筹备中...                          ################################# [100%]
正在降级 / 装置...
   1:clickhouse-common-static-20.9.3.4################################# [33%]
   2:clickhouse-client-20.9.3.45-2    ################################# [67%]
   3:clickhouse-server-20.9.3.45-2    ################################# [100%]
Path to data directory in /etc/clickhouse-server/config.xml: /var/lib/clickhouse/
[root@node5 ck]# 

验证是否装置胜利

如果以上步骤没有报错,则能够通过如下命令开启 clickhouse 的服务:

systemctl start clickhouse-server

而后通过 clickhouse-client 客户端去连贯:

[root@node5 ck]# clickhouse-client 
ClickHouse client version 20.9.3.45 (official build).
Connecting to localhost:9000 as user default.
Connected to ClickHouse server version 20.9.3 revision 54439.

node5 :) select 1

SELECT 1

┌─1─┐
│ 1 │
└───┘

1 rows in set. Elapsed: 0.003 sec. 

node5 :) 

如果呈现上述界面,则阐明单机装置 clickhouse 胜利。

clickhouse-client CLI 工具阐明

在下面,咱们用到了 clickhouse-client 这样一款工具。

clickhouse-client是一个带命令行的客户端工具,它通过 TCP9000端口连贯clickhouse-server,能够在该命令行工具里进行各种操作。

通过 clickhouse-client --help能够查看工具的帮忙文档,能够看到该工具反对很多参数,此处简要说一下一些罕用的参数。

参数 用法举例 阐明 备注
-h [--host] -h 192.168.0.1
--host=192.168.0.1
指定连贯 clickhouse 服务的 host 地址,个别是近程连贯其余机器上的 clickhouse 服务。 clickhouse要想连贯近程服务器,须要将配置文件中 <listen_host>::</listen_host> 选项开启。
--port --port=9000 指定近程连贯 clickhouse 服务的端口号,默认为9000 这个端口号可通过配置文件配置:<tcp_port>9000</tcp_port>
-u [--user] -u ck
--user=ck
指定登录 clickhouse 的用户,默认是default default用户是内置的用户。能够通过 users.xml 配置文件自定义用户信息。
--password --password=123456 指定登录 clickhouse 的明码 default用户是没有明码的。明码可配置明文明码和加密明码
-q [--query] -q "show databases" 通过命令行间接输出sql,即时返回,而不须要进入客户端外部
-m [--multiline] 在客户端内反对多行语句操作,以分号作为结束符 如果不指定 -m 参数,每句 sql 语法后可加分号,也可不加,默认一行就是一个语句
-n [--multiquery] 命令行间接输出语句时反对多条 sql 语句,个别和 -q 联合应用 留神 -n 的地位不能在 -qsql语句之间
-f [--format] -f JSON 设置输入的显示格局 反对 JSONCSVTSV 等,详见 https://clickhouse.tech/docs/…

利用 CLI 工具导入数据

假如咱们在 default 数据库下有一张 test 表,在 /data01 目录下有一个 file.csv 的文件,可通过如下形式将数据导入到 test 表中。

clickhouse-client --database=test --query="INSERT INTO test FORMAT CSV" < /data01/file.csv

配置文件阐明

config.xml

config.xml文件是 clickhouse 默认的配置文件,门路为/etc/clickhouse-server/config.xml

config.xml中能够配置的内容有很多,上面节选一些比拟重要的配置项来阐明一下:

<?xml version="1.0"?>
<yandex>
    <logger>
        <!-- clickhouse 日志相干的配置 -->
        <level>trace</level>
        <log>/var/log/clickhouse-server/clickhouse-server.log</log> <!-- 日志门路 -->
        <errorlog>/var/log/clickhouse-server/clickhouse-server.err.log</errorlog>
        <size>1000M</size>
        <count>10</count>
    </logger>
    
    <http_port>8123</http_port>   <!--http 客户端连贯 ck 的端口 -->
    <tcp_port>9000</tcp_port>     <!--tcp 客户端连贯 ck 的端口 -->
    <mysql_port>9004</mysql_port> 

    <listen_host>::</listen_host>  <!--ip 地址,配置成:: 能够被任意 ipv4 和 ipv6 的客户端连贯 -->
    
    
    <path>/var/lib/clickhouse/</path>  <!--ck 寄存数据库内容的门路 -->
    
    <user_files_path>/var/lib/clickhouse/user_files/</user_files_path>  <!--File 引擎文件寄存的门路,个别可设置为 /,这样就能够指定绝对路径 -->
    
    <users_config>users.xml</users_config> <!-- 指定用户配置文件 -->
    
    <default_database>default</default_database>  <!-- 指定默认数据库 -->
    
    <!-- 配置 prometheus 信息 -->
    <prometheus>     
        <endpoint>/metrics</endpoint>
        <port>9363</port>
        <metrics>true</metrics>
        <events>true</events>
        <asynchronous_metrics>true</asynchronous_metrics>
        <status_info>true</status_info>
    </prometheus>
    
    <include_from>/etc/clickhouse-server/metrika.xml</include_from>  <!-- 指定 metrika.xml 配置文件 -->

users.xml

<users>
    <!-- 用户名为 ck-->
    <ck>    
        <password>123456</password>  <!-- 明文明码 -->
        <!--
        SHA256 加密明码,可通过上面的命令生成:PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha256sum | tr -d '-'
        <password_sha256_hex>8d969eef6ecad3c29a3a629280e686cf0c3f5d5a86aff3ca12020c923adc6c92</password_sha256_hex>
        SHA1 加密形式加密的明码,可通过上面的命令生成
        PASSWORD=$(base64 < /dev/urandom | head -c8); echo "$PASSWORD"; echo -n "$PASSWORD" | sha1sum | tr -d '-' | xxd -r -p | sha1sum | tr -d '-'
        <password_double_sha1_hex>7c4a8d09ca3762af61e59520943dc26494f8941b</password_double_sha1_hex>
        -->
        <networks>
              <ip>::/0</ip>
              </networks>
        <profile>default</profile>
        <quota>default</quota>
    </ck>
</users>

metrika.xml

metrika.xml 次要是用来服务于集群搭建的。它外面是对于 zookeepershard 以及 replica 的配置,比较复杂,将在部署集群中具体阐明。

部署集群

Clickhouse 的集群是依赖于 zookeeper 的。所以在搭建 clickhouse 集群之前,首先要有一个 zookeeper 集群。

对于 zookeeper 集群的搭建,此处不再开展详述,如有不分明的请自行百度。(本文默认 zookeeper 集群曾经搭建好)

后面说过,clickhouse集群的相干配置都在 metrika.xml 配置文件里,所以首先咱们须要配置好 metrika.xmlmetrika.xml 的门路能够在 config.xml 中通过 <include_from> 指定。

zookeeper 配置

zookeeper 不肯定要和 ck 的节点装置在同一台机器上,只有 ck 的几点可能拜访 zk 即可。

<zookeeper-servers>
    <node index="1">
      <host>192.168.0.1</host>
      <port>2181</port>
    </node>
    <node index="2">
      <host>192.168.0.2</host>
      <port>2181</port>
    </node>
    <node index="3">
      <host>192.168.0.3</host>
      <port>2181</port>
    </node>
  </zookeeper-servers>

Shard 和 Replica 设置

如下图所示,为一个残缺的 shardReplica的配置,以下为 test 集群配置 2 分片 2 正本。

<clickhouse_remote_servers>
    <test>      <!-- 集群的名字 -->
      <shard>   <!--shard 分片的配置 -->
        <internal_replication>true</internal_replication>  <!-- 是否只将数据写入其中一个正本,默认为 false-->
        <replica>   <!--shard 正本的配置 -->
          <host>192.168.0.1</host>
          <port>9000</port>
        </replica>
        <replica>
          <host>192.168.0.2</host>
          <port>9000</port>
        </replica>
      </shard>
      <shard>
        <internal_replication>true</internal_replication>
        <replica>
          <host>192.168.0.3</host>
          <port>9000</port>
        </replica>
        <replica>
          <host>192.168.0.4</host>
          <port>9000</port>
        </replica>
      </shard>
    </test>
  </clickhouse_remote_servers>

一个残缺的 metrika.xml 如下所示:

<yandex>
    <zookeeper-servers>
    <node index="1">
      <host>192.168.0.1</host>
      <port>2181</port>
    </node>
    <node index="2">
      <host>192.168.0.2</host>
      <port>2181</port>
    </node>
    <node index="3">
      <host>192.168.0.3</host>
      <port>2181</port>
    </node>
  </zookeeper-servers>
  <clickhouse_remote_servers>
    <test>      <!-- 集群的名字 -->
      <shard>   <!--shard 分片的配置 -->
        <internal_replication>true</internal_replication>  <!-- 是否只将数据写入其中一个正本,默认为 false-->
        <replica>   <!--replica 正本的配置 -->
          <host>192.168.0.1</host>
          <port>9000</port>
        </replica>
        <replica>
          <host>192.168.0.2</host>
          <port>9000</port>
        </replica>
      </shard>
      <shard>
        <internal_replication>true</internal_replication>
        <replica>
          <host>192.168.0.3</host>
          <port>9000</port>
        </replica>
        <replica>
          <host>192.168.0.4</host>
          <port>9000</port>
        </replica>
      </shard>
    </test>
  </clickhouse_remote_servers>
</yandex>

集群搭建

首先依照单节点装置的形式,在 node1node2node3node4 四个节点上装置好clickhouse

批改config.xml,次要批改内容如下:

<!--1. 减少 listen_host,容许近程拜访 -->
<listen_host>0.0.0.0</listen_host>   
<!--
这里 listen_host 到底是配置:: 还是 0.0.0.0 是有说法的。官网举荐的是::,然而在某些不反对 IPV6 的机器上并不能 work,这时候就要配置成 0.0.0.0。我集体比拟喜爱配置成 0.0.0.0,因为不论是 IPV4 还是 IPV6,0.0.0.0 都能够反对
-->

<!--2. 批改 path 门路,指定数据寄存地位,我这里指定 /data01/clickhouse 目录 -->
<!-- 须要留神的是,这个门路必须提前存在,且 clickhouse 用户有权限拜访 -->
<path>/data01/clickhouse</path>
<tmp_path>/data01/clickhouse/tmp/</tmp_path>
<user_files_path>/data01/clickhouse/user_files/</user_files_path>
<access_control_path>/data01/clickhouse/access/</access_control_path>

<!--3. 指定 metrika.xml 文件 -->
<include_from>/etc/clickhouse-server/metrika.xml</include_from>


<!--4. 重新制定 tcp_port -->
<tcp_port>19000</tcp_port>
<!-- 这一步不是必须的,我这里之所以重新制定,是因为发现我的机器上 9000 端口曾经被占用了,个别状况下,默认的 9000 即可 -->

批改users.xml,咱们减少一个用户,专门用来治理cluster

<!-- 在 <users> 外面新增如下内容,创立一个用户名为 ck,明码为 123456 的用户 -->
        <ck>
            <password>123456</password>
            <networks incl="networks" replace="replace">
                <ip>::/0</ip>
            </networks>
            <profile>default</profile>
            <quota>default</quota>
        </ck>

创立 metrika.xml 文件。

在 /etc/clickhouse-server门路下创立 metrika.xml 文件(这个门路为下面 config.xml 中配置的 include_from 的门路):

<yandex>
    <zookeeper-servers>
    <node index="1">
      <host>192.168.0.1</host>
      <port>2181</port>
    </node>
    <node index="2">
      <host>192.168.0.2</host>
      <port>2181</port>
    </node>
    <node index="3">
      <host>192.168.0.3</host>
      <port>2181</port>
    </node>
  </zookeeper-servers>
  <clickhouse_remote_servers>
    <test>      
      <shard>   
        <replica>  
          <host>192.168.0.1</host>
          <port>19000</port>    <!-- 这里的端口号要和 config.xml 中 tcp_port 保持一致,如果那里改了,这里也要对应的改 -->
        </replica>
        <replica>
          <host>192.168.0.2</host>
          <port>19000</port>
        </replica>
      </shard>
      <shard>
        <replica>
          <host>192.168.0.3</host>
          <port>19000</port>
        </replica>
        <replica>
          <host>192.168.0.4</host>
          <port>19000</port>
        </replica>
      </shard>
    </test>
  </clickhouse_remote_servers>
</yandex>

以上配置在四台机器上同步,而后重启clickhouse

systemctl restart clickhouse-server

如果启动胜利,就能看到 clickhouse-server 的过程曾经在运行了:

[root@node2 test]# ps -ef |grep clickhouse
clickho+ 17548     1  1 11:11 ?        00:00:00 /usr/bin/clickhouse-server --config=/etc/clickhouse-server/config.xml --pid-file=/run/clickhouse-server/clickhouse-server.pid
root     17738 10683  0 11:11 pts/0    00:00:00 grep --color=auto clickhouse

咱们应用 clickhouse-client 工具,登录到其中一台机器:

[root@node4 test]# clickhouse-client -u ck --password=123456 --port=19000 -m
ClickHouse client version 20.9.3.45 (official build).
Connecting to localhost:19000 as user ck.
Connected to ClickHouse server version 20.9.3 revision 54439.

node4 :) 

查问 system.clusters 表:

node4 :) select * from system.clusters where cluster = 'test';

SELECT *
FROM system.clusters
WHERE cluster = 'test'

┌─cluster─┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name─────┬─host_address──┬──port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ test    │         1 │            1 │           1 │ 192.168.0.1 │ 192.168.0.1 │ 19000 │        0 │ default │                  │            0 │                       0 │
│ test    │         1 │            1 │           2 │ 192.168.0.2 │ 192.168.0.2 │ 19000 │        0 │ default │                  │            0 │                       0 │
│ test    │         2 │            1 │           1 │ 192.168.0.3 │ 192.168.0.3 │ 19000 │        0 │ default │                  │            0 │                       0 │
│ test    │         2 │            1 │           2 │ 192.168.0.4 │ 192.168.0.4 │ 19000 │        1 │ default │                  │            0 │                       0 │
└─────────┴───────────┴──────────────┴─────────────┴───────────────┴───────────────┴───────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘

4 rows in set. Elapsed: 0.002 sec.

呈现下面所示的后果,阐明配置集群胜利。

分布式表

接下来就能够在集群里创立分布式表了。

首先在集群的各个节点创立本地表。

CREATE TABLE t_cluster ON CLUSTER test (
id Int16,
name String,
birth Date
)ENGINE = MergeTree()
PARTITION BY toYYYYMM(birth)
ORDER BY id;

登录到任意节点,执行以上sql,呈现如下提醒,阐明执行胜利:

node4 :) CREATE TABLE default.t_cluster ON CLUSTER test (id Int16, name String, birth Date)ENGINE = MergeTree() PARTITION BY toYYYYMM(birth) ORDER BY id;

CREATE TABLE default.t_cluster ON CLUSTER test
(
    `id` Int16,
    `name` String,
    `birth` Date
)
ENGINE = MergeTree()
PARTITION BY toYYYYMM(birth)
ORDER BY id

┌─host──────────┬──port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ 192.168.0.1 │ 19000 │      0 │       │                   3 │                0 │
│ 192.168.0.2 │ 19000 │      0 │       │                   2 │                0 │
│ 192.168.0.3 │ 19000 │      0 │       │                   1 │                0 │
│ 192.168.0.4 │ 19000 │      0 │       │                   0 │                0 │
└───────────────┴───────┴────────┴───────┴─────────────────────┴──────────────────┘

4 rows in set. Elapsed: 0.108 sec. 

咱们能够登录任意一台机器,都能查问到 t_cluster 表,这就阐明曾经在 test 集群上所有节点创立了一个 t_cluster 本地表。

这个时候如果往 t_cluster 表插入数据,依然是在所在节点的本地表中操作,在其余集群中是无奈看见的。

如咱们在 node1 节点插入如下数据:

node1 :) insert into t_cluster values(1, 'aa', '2021-02-01'), (2, 'bb', '2021-02-02');

INSERT INTO t_cluster VALUES

Ok.

2 rows in set. Elapsed: 0.002 sec.

node1 节点查问:

node1 :) select * from t_cluster;

SELECT *
FROM t_cluster

┌─id─┬─name─┬──────birth─┐
│  1 │ aa   │ 2021-02-01 │
│  2 │ bb   │ 2021-02-02 │
└────┴──────┴────────────┘

2 rows in set. Elapsed: 0.002 sec. 

node2节点查问:

node2 :) select * from t_cluster;

SELECT *
FROM t_cluster

Ok.

0 rows in set. Elapsed: 0.002 sec.

node3node4 查问也是如此。

这就充分说明了如果间接操作 t_cluster 表,操作的数据其实只是以后节点的数据。有人可能会有纳闷,我不是明明指定了 node1node2互为 replica 吗?为什么 node1 的数据也没有同步到 node2 下面去?

这是因为咱们的引擎指定的是 MergerTree,而不是ReplicaMergeTree,如果指定的是ReplicaMergeTree,确实是会同步到对应的replica 下面去的,但这里创立的仅仅是 MergeTree,这个引擎自身不具备同步正本的性能,所以node2 上并没有同步数据。

个别在理论利用中,创立分布式表指定的都是 Replica 的表,这里仅仅是做一个例子阐明。

那么既然如此,这个集群中的表数据不能相互关联起来,不就失去了集群的意义了吗?

为了解决下面的问题,从而引入了分布式表。

分布式表的创立是这样的:

CREATE TABLE default.dist_t_cluster ON CLUSTER test as t_cluster engine = Distributed(test, default, t_cluster,rand());

Distributed是一个非凡的引擎,用来创立分布式表。它自身具备四个参数,第一个参数示意集群的名字,第二个参数为数据库的名字,第三个参数为表的名字,第四个参数为 sharding key,它决定最终数据落在哪一个分片上,最初一个参数能够省略,如果省略,则实用配置文件中的weight 分片权重。

下面的语句就是创立一张名为 dist_t_cluster 的分布式表,该分布式表是基于 test 集群中的 default.t_cluster 表。as t_cluster示意这张表的构造和 t_cluster 截然不同。

分布式表自身不存储数据,数据存储其实还是由本地表 t_cluster 实现的。这个 dist_t_cluster 仅仅做一个代理的作用。

如下所示,示意分布式表创立胜利。

node1 :) CREATE TABLE default.dist_t_cluster ON CLUSTER test as t_cluster engine = Distributed(test, default, t_cluster, rand());

CREATE TABLE default.dist_t_cluster ON CLUSTER test AS t_cluster
ENGINE = Distributed(test, default, t_cluster, rand())

┌─host──────────┬──port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ 192.168.0.1 │ 19000 │      0 │       │                   3 │                0 │
│ 192.168.0.2 │ 19000 │      0 │       │                   2 │                0 │
│ 192.168.0.3 │ 19000 │      0 │       │                   1 │                0 │
│ 192.168.0.4 │ 19000 │      0 │       │                   0 │                0 │
└───────────────┴───────┴────────┴───────┴─────────────────────┴──────────────────┘

4 rows in set. Elapsed: 0.106 sec.

接下来咱们应用分布式表向集群中插入数据,察看景象:

node1 :) insert into dist_t_cluster values(1, 'aaa', '2021-02-01'), (2, 'bbb', '2021-02-02');

INSERT INTO dist_t_cluster VALUES

Ok.

2 rows in set. Elapsed: 0.002 sec. 

这时候咱们在不同节点上查问 dist_t_cluster 表,失去的后果都是截然不同的:

/* node1 查问后果 */
node1 :) select * from dist_t_cluster;

SELECT *
FROM dist_t_cluster

┌─id─┬─name─┬──────birth─┐
│  2 │ bbb  │ 2021-02-02 │
└────┴──────┴────────────┘
┌─id─┬─name─┬──────birth─┐
│  1 │ aaa  │ 2021-02-01 │
└────┴──────┴────────────┘

2 rows in set. Elapsed: 0.005 sec. 

/* node2 查问后果 */
node2 :) select * from dist_t_cluster;

SELECT *
FROM dist_t_cluster

┌─id─┬─name─┬──────birth─┐
│  2 │ bbb  │ 2021-02-02 │
└────┴──────┴────────────┘
┌─id─┬─name─┬──────birth─┐
│  1 │ aaa  │ 2021-02-01 │
└────┴──────┴────────────┘

2 rows in set. Elapsed: 0.005 sec.

/* node3 查问后果 */
node3 :) select * from dist_t_cluster;

SELECT *
FROM dist_t_cluster

┌─id─┬─name─┬──────birth─┐
│  1 │ aaa  │ 2021-02-01 │
└────┴──────┴────────────┘
┌─id─┬─name─┬──────birth─┐
│  2 │ bbb  │ 2021-02-02 │
└────┴──────┴────────────┘

2 rows in set. Elapsed: 0.006 sec. 

/* node4 查问后果 */
node4 :) select * from dist_t_cluster;

SELECT *
FROM dist_t_cluster

┌─id─┬─name─┬──────birth─┐
│  1 │ aaa  │ 2021-02-01 │
└────┴──────┴────────────┘
┌─id─┬─name─┬──────birth─┐
│  2 │ bbb  │ 2021-02-02 │
└────┴──────┴────────────┘

2 rows in set. Elapsed: 0.005 sec.

咱们再去看各个节点的本地表 t_cluster 表中数据分布状况:

/* node1 查问后果 */
node1 :) select * from t_cluster;

SELECT *
FROM t_cluster

┌─id─┬─name─┬──────birth─┐
│  2 │ bbb  │ 2021-02-02 │
└────┴──────┴────────────┘

1 rows in set. Elapsed: 0.002 sec.

/* node2 查问后果 */
node2 :) select * from t_cluster;

SELECT *
FROM t_cluster

┌─id─┬─name─┬──────birth─┐
│  2 │ bbb  │ 2021-02-02 │
└────┴──────┴────────────┘

1 rows in set. Elapsed: 0.002 sec. 

/* node3 查问后果 */
node3 :) select * from t_cluster;

SELECT *
FROM t_cluster

┌─id─┬─name─┬──────birth─┐
│  1 │ aaa  │ 2021-02-01 │
└────┴──────┴────────────┘

1 rows in set. Elapsed: 0.002 sec.

/* node4 查问后果 */
node4 :) select * from t_cluster;

SELECT *
FROM t_cluster

┌─id─┬─name─┬──────birth─┐
│  1 │ aaa  │ 2021-02-01 │
└────┴──────┴────────────┘

1 rows in set. Elapsed: 0.002 sec. 

由以上后果可知,node1node2 下面存储的数据一样,node3node4 下面存储的数据一样,然而 node1node3下面的数据不一样。node1node2)和 node3node4)的数据组成了dist_t_cluster 表中的所有数据。

这是因为 node1node2node3node4互为正本,所以它们的数据会主动同步。而node1node2)和node3node4)属于不同的分片,所以数据依照肯定的规定(sharding key)落在了不同分片。

如果咱们关上存储数据的目录,能够看到 dist_t_cluster 表中仅仅有一个长期文件夹,并没有理论存储数据,因为数据是存储在 t_cluster 本地表中的。

[root@node1 chenyc]# ls -l  /data01/clickhouse/data/default/dist_t_cluster/
总用量 0
drwxr-x--- 3 clickhouse clickhouse 17 2 月  25 13:57 default@192%2E168%2E21%2E52:19000
drwxr-x--- 3 clickhouse clickhouse 17 2 月  25 13:57 default@192%2E168%2E21%2E53:19000
drwxr-x--- 2 clickhouse clickhouse  6 2 月  25 13:57 default@192%2E168%2E21%2E54:19000
退出移动版