0%

ClickHouse 高可用集群设计

ClickHouse采用分片 + 副本实现高可用集群,下面以4台服务器为例子,讲述设计一个高可用的分布式集群需要注意的几个地方。

建立可横向扩展的数据服务集群,分片技术通常是必须的,MongoDB提供了原生的数据库分片技术,减小MySQL分库分表带来的麻烦。ClickHouse同样支持分片技术,假设4台机器,每台机器安装一个CH的示例,则表示有4个分片,每个分片的副本设置为1,对于这种集群设置不存在高可用可言,因为如果有一台机器挂了则整个ClickHouse集群不可用。

只有分片 + 副本才可实现高可用集群,可根据集群机器资源情况设置单分片副本数量,本次采用4台机器服务集群搭建,4个分片,每个分片两个副本。需要在每台机器上开启两个ClickHouse示例,注意不同示例需要设置不同的数据目录以及绑定不同的端口。

集群配置

memetrika.xml配置

  • internal_replication属性设置为true表示数据在插入到分布式表时,只插入到其中一个数据表,由后台进程同步到其余副本可保证数据一致性;设置为false则表示数据插入到各个数据表,这种方式有可能导致数据不一致,在采用Replicated表引擎时,官方推荐该属性设置为true。
  • xcloud_cluster配置项表示集群名称,后续在闯将分布式表时需要制定该集群名称
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
<clickhouse_remote_servers>
<xcloud_cluster>
<!-- 数据分片1 -->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ip1</host>
<port>9000</port>
<user>xcloud</user>
<password>Xcloud2018#ZzVv</password>
</replica>
<replica>
<host>ip2</host>
<port>9001</port>
<user>xcloud</user>
<password>Xcloud2018#ZzVv</password>
</replica>
</shard>
<!-- 数据分片2 -->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ip2</host>
<port>9000</port>
<user>xcloud</user>
<password>Xcloud2018#ZzVv</password>
</replica>
<replica>
<host>ip1</host>
<port>9001</port>
<user>xcloud</user>
<password>Xcloud2018#ZzVv</password>
</replica>
</shard>
<!-- 数据分片3 -->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ip3</host>
<port>9000</port>
<user>xcloud</user>
<password>Xcloud2018#ZzVv</password>
</replica>
<replica>
<host>ip4</host>
<port>9001</port>
<user>xcloud</user>
<password>Xcloud2018#ZzVv</password>
</replica>
</shard>
<!-- 数据分片4 -->
<shard>
<internal_replication>true</internal_replication>
<replica>
<host>ip4</host>
<port>9000</port>
<user>xcloud</user>
<password>Xcloud2018#ZzVv</password>
</replica>
<replica>
<host>ip3</host>
<port>9001</port>
<user>xcloud</user>
<password>Xcloud2018#ZzVv</password>
</replica>
</shard>
</xcloud_cluster>
</clickhouse_remote_servers>

<zookeeper-servers>
<node index="1">
<host>ip1</host>
<port>2181</port>
</node>
<node index="2">
<host>ip2</host>
<port>2181</port>
</node>
<node index="3">
<host>ip3</host>
<port>2181</port>
</node>
<node index="4">
<host>ip4</host>
<port>2181</port>
</node>
</zookeeper-servers>
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
clickhouse :) 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─┐
│ test_shard_localhost │ 111 │ localhost │ ::190001default │ │
│ test_shard_localhost_secure │ 111 │ localhost │ ::194400default │ │
│ xcloud_cluster │ 111 │ ip1 │ ip1 │ 90000 │ xcloud │ │
│ xcloud_cluster │ 112 │ ip2 │ ip2 │ 90010 │ xcloud │ │
│ xcloud_cluster │ 211 │ ip2 │ ip2 │ 90001 │ xcloud │ │
│ xcloud_cluster │ 212 │ ip1 │ ip1 │ 90011 │ xcloud │ │
│ xcloud_cluster │ 311 │ ip3 │ ip3 │ 90000 │ xcloud │ │
│ xcloud_cluster │ 312 │ ip4 │ ip4 │ 90010 │ xcloud │ │
│ xcloud_cluster │ 411 │ ip4 │ ip4 │ 90000 │ xcloud │ │
│ xcloud_cluster │ 412 │ ip3 │ ip3 │ 90010 │ xcloud │ │
└─────────────────────────────┴───────────┴──────────────┴─────────────┴────────────────┴────────────────┴──────┴──────────┴─────────┴──────────────────┘

创建分布式表

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
CREATE TABLE xcloud.cdn_nginx_log_minute_agg
(
date Date,

timeStamp DateTime,

channel String,

customer String,

province String,

flow AggregateFunction(sum, Int64),

visit AggregateFunction(sum, Int64),

download_time AggregateFunction(sum, Int64),

response_time AggregateFunction(sum, Int64),

upstream_response_time AggregateFunction(sum, Int64),

first_byte_time AggregateFunction(sum, Int64),

request_time AggregateFunction(sum, Int64),

download_flow AggregateFunction(sum, Int64),

response_normal AggregateFunction(sum, Int64)
)
ENGINE = ReplicatedAggregatingMergeTree('{zkpath}', '{replica}')
PARTITION BY date ORDER BY (timeStamp, date, channel, customer, province);

创建完后可在zk上看到表的一些副本信息:

1
2
3
4
[zk: localhost:2181(CONNECTED) 5] ls /clickhouse/xcloud/cdn_nginx_log_area_fivemin_shard_

cdn_nginx_log_area_fivemin_shard_4 cdn_nginx_log_area_fivemin_shard_3 cdn_nginx_log_area_fivemin_shard_2
cdn_nginx_log_area_fivemin_shard_1
1
2
ls /clickhouse/xcloud/cdn_nginx_log_area_fivemin_shard_1/replicas
[SR-CNSX-TJ-36-90, SR-CNSX-TJ-36-91-wingman]