和一些在使用clickhouse的同学聊了下,有不少中小型公司使用的还是单机版,这点还是出乎意料;可能真的是因为clickhouse秒天秒地的性能,加上数据量不大,数据恢复成本不高,才出此策略;
入正题:今天尝试搭建了一个2*2的clickhouse集群,两个分片,每个分片有两个副本,共四个节点,逻辑拓扑图如下
host | shard | replica |
---|---|---|
hadoop2 | 01 | 01 |
hadoop5 | 01 | 02 |
hadoop6 | 02 | 01 |
hadoop7 | 02 | 02 |
在所有节点安装clickhouse-server,参考clickhouse install on centos
涉及三部分remote_servers
,zookeeper
,macros
,所有的节点的remote_servers
,zookeeper
是一样的,不同的是macros
,每个节点根据自己的角色修改shard和replica的值;下面给出hadoop2这个节点的配置
true
hadoop2
9666
hadoop5
9666
true
hadoop6
9666
hadoop7
9666
hadoop1
2181
hadoop2
2181
hadoop3
2181
hadoop4
2181
hadoop5
2181
01
01
启动所有的clickhouse-server
service clickhouse-server start
在每个节点创建t_s2_r2,不需要手动替换shard和replica,建表的时候会根据shard和replica数据自行在zookeeper中注册
CREATE TABLE t_s2_r2\
(\
dt Date,\
path String \
)\
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/t_s2_r2','{replica}',dt, dt, 8192)
创建分布式表t_s2_r2_all
,这个表在任何一个节点创建都行,t_s2_r2_all
就像一个视图,指向所有的分片,数据真正的存储在每个节点的t_s2_r2
表
CREATE TABLE t_s2_r2_all AS t_s2_r2 ENGINE = Distributed(perftest_2shards_2replicas, default, t_s2_r2, rand())
插入数据
insert into t_s2_r2_all values('2019-07-21','path1')
insert into t_s2_r2_all values('2019-07-22','path1')
insert into t_s2_r2_all values('2019-07-23','path1')
insert into t_s2_r2_all values('2019-07-23','path1')
查看数据
hadoop7 :) select * from t_s2_r2_all
SELECT *
FROM t_s2_r2_all
┌─────────dt─┬─path──┐
│ 2019-07-21 │ path1 │
│ 2019-07-22 │ path1 │
│ 2019-07-24 │ path1 │
└────────────┴───────┘
┌─────────dt─┬─path──┐
│ 2019-07-23 │ path1 │
└────────────┴───────┘
4 rows in set. Elapsed: 0.009 sec.
查看每个节点表t_s2_r2
数据
hadoop2 :) select * from t_s2_r2
SELECT *
FROM t_s2_r2
┌─────────dt─┬─path──┐
│ 2019-07-23 │ path1 │
└────────────┴───────┘
hadoop5 :) select * from t_s2_r2
SELECT *
FROM t_s2_r2
┌─────────dt─┬─path──┐
│ 2019-07-23 │ path1 │
└────────────┴───────┘
1 rows in set. Elapsed: 0.007 sec.
hadoop6 :) select * from t_s2_r2
SELECT *
FROM t_s2_r2
┌─────────dt─┬─path──┐
│ 2019-07-21 │ path1 │
│ 2019-07-22 │ path1 │
│ 2019-07-24 │ path1 │
└────────────┴───────┘
3 rows in set. Elapsed: 0.002 sec.
hadoop7 :) select * from t_s2_r2
SELECT *
FROM t_s2_r2
┌─────────dt─┬─path──┐
│ 2019-07-21 │ path1 │
│ 2019-07-22 │ path1 │
│ 2019-07-24 │ path1 │
└────────────┴───────┘
3 rows in set. Elapsed: 0.002 sec.
可以看到hadoop2和hadoop5数据是一致的,hadoop6和hadoop7数据是一致的,现在测试下高可用,干掉hadoop2节点
service clickhouse-server stop
t_s2_r2_all
数据依旧可查,因为shard01还有一个存活副本hadoop5
hadoop7 :) select * from t_s2_r2_all
SELECT *
FROM t_s2_r2_all
┌─────────dt─┬─path──┐
│ 2019-07-21 │ path1 │
│ 2019-07-22 │ path1 │
│ 2019-07-24 │ path1 │
└────────────┴───────┘
┌─────────dt─┬─path──┐
│ 2019-07-23 │ path1 │
└────────────┴───────┘
4 rows in set. Elapsed: 0.008 sec.
现在依然可以插入数据
insert into t_s2_r2_all values('2019-07-29','path2')
这条数据落在了shard01上
hadoop5 :) select * from t_s2_r2
SELECT *
FROM t_s2_r2
┌─────────dt─┬─path──┐
│ 2019-07-29 │ path2 │
└────────────┴───────┘
┌─────────dt─┬─path──┐
│ 2019-07-23 │ path1 │
└────────────┴───────┘
2 rows in set. Elapsed: 0.002 sec.
现在再启动hadoop2节点上的clickhouse-server,刚才插入的数据,会自动同步到hadoop2的t_s2_r2
中
hadoop2 :) select * from t_s2_r2
SELECT *
FROM t_s2_r2
┌─────────dt─┬─path──┐
│ 2019-07-29 │ path2 │
└────────────┴───────┘
┌─────────dt─┬─path──┐
│ 2019-07-23 │ path1 │
└────────────┴───────┘
2 rows in set. Elapsed: 0.003 sec.
当hadoop2和hadoop5上的clickhouse-server同时被干掉时,那t_s2_r2_all
就不可用了,这个应该很好理解,这里就不再测了
End