本文介绍如何在 CentOS
零碎上装置 ClickHouse
以及集群部署。
本文依赖的环境为 CentOS-7.4.1708
,应用clickhouse
的版本为20.9.3.45
。
单节点装置
在线 yum 装置
clickhouse
的安装包并不在 Linux
官网 yum
仓库中,所以首先须要增加 clickhouse
的yum
镜像:
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
是一个带命令行的客户端工具,它通过 TCP
的9000
端口连贯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 的地位不能在 -q 和sql 语句之间 |
|
-f [--format] |
-f JSON |
设置输入的显示格局 | 反对 JSON 、CSV 、TSV 等,详见 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
次要是用来服务于集群搭建的。它外面是对于 zookeeper
、shard
以及 replica
的配置,比较复杂,将在部署集群中具体阐明。
部署集群
Clickhouse
的集群是依赖于 zookeeper
的。所以在搭建 clickhouse
集群之前,首先要有一个 zookeeper
集群。
对于 zookeeper
集群的搭建,此处不再开展详述,如有不分明的请自行百度。(本文默认 zookeeper
集群曾经搭建好)
后面说过,clickhouse
集群的相干配置都在 metrika.xml
配置文件里,所以首先咱们须要配置好 metrika.xml
。metrika.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 设置
如下图所示,为一个残缺的 shard
和Replica
的配置,以下为 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>
集群搭建
首先依照单节点装置的形式,在 node1
,node2
,node3
,node4
四个节点上装置好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.
node3
和 node4
查问也是如此。
这就充分说明了如果间接操作 t_cluster
表,操作的数据其实只是以后节点的数据。有人可能会有纳闷,我不是明明指定了 node1
和node2
互为 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.
由以上后果可知,node1
和 node2
下面存储的数据一样,node3
和 node4
下面存储的数据一样,然而 node1
和node3
下面的数据不一样。node1
(node2
)和 node3
(node4
)的数据组成了dist_t_cluster
表中的所有数据。
这是因为 node1
和node2
、node3
和 node4
互为正本,所以它们的数据会主动同步。而node1
(node2
)和node3
(node4
)属于不同的分片,所以数据依照肯定的规定(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