clickhouse 创建分布式表

张映 发表于 2021-08-24

分类目录: clickhouse

标签:, , ,

上一篇文章主要讲了本地表类型MergeTree,本篇主要讲的是ReplicatedMergeTree和Distributed类型。

ReplicatedMergeTree相对于MergeTree存储引擎,多了复制功能,同一shard类的服务器,数据是会同步的。

Distributed并不是真正意义上的表,有点类似于mysql merge存储引擎,也有点类似于视图。

分布表的创建有好多种,本篇以ReplicatedMergeTree+Distributed+zookeeper的方式来实现

1,创建ReplicatedMergeTree表

testpd :-] CREATE TABLE netjoytest1.tank1 ON CLUSTER clickhouse_test_netjoy
:-] (
:-]     `id` UInt8 DEFAULT 0 COMMENT 'id',
:-]     `name` Nullable(String) COMMENT '名字',
:-]     `create_time` DateTime DEFAULT toDateTime(now()) COMMENT '创建时间'
:-] )
:-] ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/netjoytest1/tank1', '{replica}')
:-] PARTITION BY toYYYYMM(create_time)
:-] PRIMARY KEY id
:-] ORDER BY (id, create_time);

CREATE TABLE netjoytest1.tank1 ON CLUSTER clickhouse_test_netjoy
(
    `id` UInt8 DEFAULT 0 COMMENT 'id',
    `name` Nullable(String) COMMENT '名字',
    `create_time` DateTime DEFAULT toDateTime(now()) COMMENT '创建时间'
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{layer}-{shard}/netjoytest1/tank1', '{replica}')
PARTITION BY toYYYYMM(create_time)
PRIMARY KEY id
ORDER BY (id, create_time)

┌─host───────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ 10.0.55.17 │ 9000 │      0 │       │                   3 │                0 │
│ 10.0.10.24 │ 9000 │      0 │       │                   2 │                0 │
│ 10.0.10.23 │ 9000 │      0 │       │                   1 │                0 │
│ 10.0.55.16 │ 9000 │      0 │       │                   0 │                0 │
└────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

4 rows in set. Elapsed: 0.561 sec.

我们在创建表的时候指定了ReplicatedMergeTree(param1,param2),里面传递了两个参数

/clickhouse/tables/
这一部分指定的是在ZK上创建的路径地址,可随意变换只要记得即可

{layer}-{shard}指的是分片的标志,同一个分片内的所有机器应该保持相同。建议使用使用的是集群名+分片名的配置也就是{layer}-{shard},这里的数据就是在macros中配置的属性

netjoytest1/tank1 库名和表名

{replica} 参数建议在macros配置成机器的hostname,因为每台机器的hostname都是不一样的,因此就能确保每个表的识别符都是唯一的了

同一分片下所有shard要一样。不然会导致数据不全,或者数据重复
同一分片下所有shard要一样。不然会导致数据不全,或者数据重复
同一分片下所有shard要一样。不然会导致数据不全,或者数据重复

2,创建Distributed表

testpd :-] CREATE TABLE netjoytest1.tank1_all ON CLUSTER clickhouse_test_netjoy as netjoytest1.tank1
:-] ENGINE = Distributed(clickhouse_test_netjoy, netjoytest1, tank1, rand());

CREATE TABLE netjoytest1.tank1_all ON CLUSTER clickhouse_test_netjoy AS netjoytest1.tank1
ENGINE = Distributed(clickhouse_test_netjoy, netjoytest1, tank1, rand())

┌─host───────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ 10.0.55.17 │ 9000 │      0 │       │                   3 │                0 │
│ 10.0.10.24 │ 9000 │      0 │       │                   2 │                0 │
│ 10.0.10.23 │ 9000 │      0 │       │                   1 │                0 │
│ 10.0.55.16 │ 9000 │      0 │       │                   0 │                0 │
└────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

4 rows in set. Elapsed: 0.171 sec.

a)、cluster_name:集群名称,与集群配置中的自定义名称相对应。
b)、database_name:数据库名称。
c)、table_name:表名称。
d)、sharding_key:可选的,用于分片的key值,在数据写入的过程中,分布式表会依据分片key的规则,将数据分布到各个节点的本地表。如果sharding_key没有,默认是群配置中的weight权重

3,插入和读取数据

insert into netjoytest1.tank1 values(1, 'tank', '2021-08-23 14:21:30');
insert into netjoytest1.tank1 values(2, 'tank', '2021-08-23 14:21:30');
insert into netjoytest1.tank1 values(3, 'tank', '2021-08-23 14:21:30');
insert into netjoytest1.tank1 values(4, 'tank', '2021-08-23 14:21:30');

insert into netjoytest1.tank1_all values(5, 'tank', '2021-08-23 14:21:30');
insert into netjoytest1.tank1_all values(6, 'tank', '2021-08-23 14:21:30');

testjian :-] select * from netjoytest1.tank1_all order by id desc;

SELECT *
FROM netjoytest1.tank1_all
ORDER BY id DESC

┌─id─┬─name─┬─────────create_time─┐
│  6 │ tank │ 2021-08-23 14:21:30 │
│  5 │ tank │ 2021-08-23 14:21:30 │
│  4 │ tank │ 2021-08-23 14:21:30 │
│  3 │ tank │ 2021-08-23 14:21:30 │
│  2 │ tank │ 2021-08-23 14:21:30 │
│  1 │ tank │ 2021-08-23 14:21:30 │
└────┴──────┴─────────────────────┘

6 rows in set. Elapsed: 0.003 sec.

Distributed虽然也可以插入,但是主要用于查询。

4,Distributed中的表分析

testticdc :-] select * from system.clusters;

SELECT *
FROM system.clusters

┌─cluster────────────────┬─shard_num─┬─shard_weight─┬─replica_num─┬─host_name──┬─host_address─┬─port─┬─is_local─┬─user────┬─default_database─┬─errors_count─┬─estimated_recovery_time─┐
│ clickhouse_test_netjoy │         1 │            1 │           1 │ 10.0.55.17 │ 10.0.55.17   │ 9000 │        1 │ default │                  │            0 │                       0 │
│ clickhouse_test_netjoy │         1 │            1 │           2 │ 10.0.10.23 │ 10.0.10.23   │ 9000 │        0 │ default │                  │            0 │                       0 │
│ clickhouse_test_netjoy │         2 │            1 │           1 │ 10.0.55.16 │ 10.0.55.16   │ 9000 │        0 │ default │                  │            0 │                       0 │
│ clickhouse_test_netjoy │         2 │            1 │           2 │ 10.0.10.24 │ 10.0.10.24   │ 9000 │        0 │ default │                  │            0 │                       0 │
└────────────────────────┴───────────┴──────────────┴─────────────┴────────────┴──────────────┴──────┴──────────┴─────────┴──────────────────┴──────────────┴─────────────────────────┘

4 rows in set. Elapsed: 0.004 sec.

从这里可以可出,10.0.55.17,10.0.10.23在同一分片,分片号要一样。并且二边表的数据是一样的,如果不一样,说明同步失败。

testjian :-] select * from netjoytest1.tank1;  //10.0.10.23机器

SELECT *
FROM netjoytest1.tank1

┌─id─┬─name─┬─────────create_time─┐
│  2 │ tank │ 2021-08-23 14:21:30 │
│  3 │ tank │ 2021-08-23 14:21:30 │
│  4 │ tank │ 2021-08-23 14:21:30 │
└────┴──────┴─────────────────────┘

3 rows in set. Elapsed: 0.001 sec. 

testjian :-] select * from system.macros;

SELECT *
FROM system.macros

┌─macro───┬─substitution─┐
│ layer   │ test_netjoy1 │
│ replica │ 10.0.10.23   │
│ shard   │ 1            │
└─────────┴──────────────┘

3 rows in set. Elapsed: 0.001 sec. 

testticdc :-] select * from netjoytest1.tank1; //10.0.55.17机器

SELECT *
FROM netjoytest1.tank1

┌─id─┬─name─┬─────────create_time─┐
│  2 │ tank │ 2021-08-23 14:21:30 │
│  3 │ tank │ 2021-08-23 14:21:30 │
│  4 │ tank │ 2021-08-23 14:21:30 │
└────┴──────┴─────────────────────┘

3 rows in set. Elapsed: 0.003 sec. 

testticdc :-] select * from system.macros;

SELECT *
FROM system.macros

┌─macro───┬─substitution─┐
│ layer   │ test_netjoy1 │
│ replica │ 10.0.55.17   │
│ shard   │ 1            │
└─────────┴──────────────┘

3 rows in set. Elapsed: 0.002 sec.

5,修改ReplicatedMergeTree和Distributed表结构

testpd :-] desc netjoytest1.tank1;   //查看表

DESCRIBE TABLE netjoytest1.tank1

┌─name────────┬─type─────────────┬─default_type─┬─default_expression─┬─comment──┬─codec_expression─┬─ttl_expression─┐
│ id          │ UInt8            │ DEFAULT      │ 0                  │ id       │                  │                │
│ name        │ Nullable(String) │              │                    │ 名字     │                  │                │
│ create_time │ DateTime         │ DEFAULT      │ toDateTime(now())  │ 创建时间 │                  │                │
└─────────────┴──────────────────┴──────────────┴────────────────────┴──────────┴──────────────────┴────────────────┘

3 rows in set. Elapsed: 0.001 sec. 

//修改ReplicatedMergeTree表结构
testpd :-] alter table netjoytest1.tank1 ON CLUSTER clickhouse_test_netjoy
:-] add column age UInt8 default 0 comment '年龄' after name;

ALTER TABLE netjoytest1.tank1 ON CLUSTER clickhouse_test_netjoy
    ADD COLUMN `age` UInt8 DEFAULT 0 COMMENT '年龄'     AFTER name

┌─host───────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ 10.0.10.24 │ 9000 │      0 │       │                   3 │                2 │
│ 10.0.10.23 │ 9000 │      0 │       │                   2 │                2 │
└────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
┌─host───────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ 10.0.55.17 │ 9000 │      0 │       │                   1 │                1 │
└────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘
┌─host───────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ 10.0.55.16 │ 9000 │      0 │       │                   0 │                0 │
└────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

4 rows in set. Elapsed: 1.167 sec. 

//修改Distributed表结构
testpd :-] alter table netjoytest1.tank1_all ON CLUSTER clickhouse_test_netjoy
:-] add column age UInt8 default 0 comment '年龄' after name;

ALTER TABLE netjoytest1.tank1_all ON CLUSTER clickhouse_test_netjoy
    ADD COLUMN `age` UInt8 DEFAULT 0 COMMENT '年龄'     AFTER name

┌─host───────┬─port─┬─status─┬─error─┬─num_hosts_remaining─┬─num_hosts_active─┐
│ 10.0.55.17 │ 9000 │      0 │       │                   3 │                0 │
│ 10.0.10.24 │ 9000 │      0 │       │                   2 │                0 │
│ 10.0.10.23 │ 9000 │      0 │       │                   1 │                0 │
│ 10.0.55.16 │ 9000 │      0 │       │                   0 │                0 │
└────────────┴──────┴────────┴───────┴─────────────────────┴──────────────────┘

4 rows in set. Elapsed: 0.164 sec. 

testpd :-] desc netjoytest1.tank1;  //查看表结构

DESCRIBE TABLE netjoytest1.tank1

┌─name────────┬─type─────────────┬─default_type─┬─default_expression─┬─comment──┬─codec_expression─┬─ttl_expression─┐
│ id          │ UInt8            │ DEFAULT      │ 0                  │ id       │                  │                │
│ name        │ Nullable(String) │              │                    │ 名字     │                  │                │
│ age         │ UInt8            │ DEFAULT      │ 0                  │ 年龄     │                  │                │
│ create_time │ DateTime         │ DEFAULT      │ toDateTime(now())  │ 创建时间 │                  │                │
└─────────────┴──────────────────┴──────────────┴────────────────────┴──────────┴──────────────────┴────────────────┘

4 rows in set. Elapsed: 0.002 sec.

上面是添加字段,其他的字段操作也是一样的。不过一定要注意的是ON CLUSTER,加上他一改的话,每个节点都会改掉。如果不加,有的节点没操作,就会导致分布式表中的字段不一致。

6,删除分表式

drop TABLE netjoytest1.tank1 ON CLUSTER clickhouse_test_netjoy;
drop TABLE netjoytest1.tank1_all ON CLUSTER clickhouse_test_netjoy;

 

 



转载请注明
作者:海底苍鹰
地址:http://blog.51yip.com/clickhouse/2522.html