上一篇文章主要讲了本地表类型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