ClickHouse 集群搭建

2022-04-24 09:22:44 浏览数 (1)

2018年第一天,许下第一份愿望吧,闭上眼睛,双手合十,心中默念,梦想成真。有期待的生活是快乐的,有憧憬的日子是惊喜的。元旦快乐!

上一篇《ClickHouse 单机搭建》中搭建了单机ClickHouse环境,本篇在上一篇的基础上继续进行集群的搭建。

一、环境准备

1. 本群集中包括3台机器。

2. 将3台机器的IP配置如下。(3台机器都绑定hosts)

192.168.0.10 db_server_01

192.168.0.20 db_server_02

192.168.0.30 db_server_03

3.在3台机器,都参照《ClickHouse 单机搭建》安装ClickHouse。

二、修改配置文件

1. 在每台机器上创建配置文件/etc/metrika.xml,完整的代码如下。

vi /etc/metrika.xml

代码语言:javascript复制
<yandex>
代码语言:javascript复制
<clickhouse_remote_servers>
代码语言:javascript复制
    <perftest_3shards_1replicas>
代码语言:javascript复制
        <shard>
代码语言:javascript复制
             <internal_replication>true</internal_replication>
代码语言:javascript复制
            <replica>
代码语言:javascript复制
                <host>db_server_01</host>
代码语言:javascript复制
                <port>9000</port>
代码语言:javascript复制
            </replica>
代码语言:javascript复制
        </shard>
代码语言:javascript复制
        <shard>
代码语言:javascript复制
            <replica>
代码语言:javascript复制
                <internal_replication>true</internal_replication>
代码语言:javascript复制
                <host>db_server_02</host>
代码语言:javascript复制
                <port>9000</port>
代码语言:javascript复制
            </replica>
代码语言:javascript复制
        </shard>
代码语言:javascript复制
        <shard>
代码语言:javascript复制
            <internal_replication>true</internal_replication>
代码语言:javascript复制
            <replica>
代码语言:javascript复制
                <host>db_server_03</host>
代码语言:javascript复制
                <port>9000</port>
代码语言:javascript复制
            </replica>
代码语言:javascript复制
        </shard>
代码语言:javascript复制
    </perftest_3shards_1replicas>
代码语言:javascript复制
</clickhouse_remote_servers>

代码语言:javascript复制
<zookeeper-servers>
代码语言:javascript复制
  <node index="1">
代码语言:javascript复制
    <host>192.168.0.30</host>
代码语言:javascript复制
    <port>2181</port>
代码语言:javascript复制
  </node>
代码语言:javascript复制
</zookeeper-servers>

代码语言:javascript复制
<macros>
代码语言:javascript复制
    <replica>192.168.0.10</replica>
代码语言:javascript复制
</macros>

代码语言:javascript复制
<networks>
代码语言:javascript复制
   <ip>::/0</ip>
代码语言:javascript复制
</networks>

代码语言:javascript复制
<clickhouse_compression>
代码语言:javascript复制
<case>
  <min_part_size>10000000000</min_part_size>             
代码语言:javascript复制
  <min_part_size_ratio>0.01</min_part_size_ratio>
代码语言:javascript复制
  <method>lz4</method>
代码语言:javascript复制
</case>
</clickhouse_compression>

代码语言:javascript复制
</yandex>

3台机器的在/etc/metrika.xml配置文件都一样,唯一有区别的是下面的这个位置IP换成每个机器自己的ip:

代码语言:javascript复制
<macros>
代码语言:javascript复制
    <replica>192.168.0.10</replica>
代码语言:javascript复制
</macros>

其中集群中需用到zookeeper,请自行安装,这里我将zookeeper装在了192.168.0.30这台虚机上,在/etc/metrika.xml的配置文件中,配置为以下内容:

代码语言:javascript复制
<zookeeper-servers>
代码语言:javascript复制
  <node index="1">
代码语言:javascript复制
    <host>192.168.0.30</host>
代码语言:javascript复制
    <port>2181</port>
代码语言:javascript复制
  </node>
代码语言:javascript复制
</zookeeper-servers>

zookeeper是安装在30的机器上面的,只安装了一个实例,生产环境肯定要放到单独的机器,并且配置成集群。

配置文件修改好以后3台服务器重启。

三、简单测试

1. 下面创建本地表,再创建Distributed表(3台机器都创建)。

代码语言:javascript复制
CREATE TABLE ontime_local (FlightDate Date,Year UInt16)  ENGINE = MergeTree(FlightDate, (Year, FlightDate), 8192);
代码语言:javascript复制
CREATE TABLE ontime_all AS ontime_local ENGINE = Distributed(perftest_3shards_1replicas, default, ontime_local, rand());

2. 随便一台机器插入数据。

代码语言:javascript复制
:) insert into ontime_all (FlightDate,Year) values ('2001-10-12',2001);
代码语言:javascript复制
INSERT INTO ontime_all (FlightDate, Year) VALUES
代码语言:javascript复制
Ok.
代码语言:javascript复制
1 rows inset. Elapsed: 0.013 sec. 

代码语言:javascript复制
:) insert into ontime_all (FlightDate,Year) values ('2002-10-12',2002);
代码语言:javascript复制
INSERT INTO ontime_all (FlightDate, Year) VALUES
代码语言:javascript复制
Ok.
代码语言:javascript复制
1 rows inset. Elapsed: 0.004 sec. 

代码语言:javascript复制
:) insert into ontime_all (FlightDate,Year) values ('2003-10-12',2003);
代码语言:javascript复制
INSERT INTO ontime_all (FlightDate, Year) VALUES
代码语言:javascript复制
Ok.

3. 下面任何一台机器查询:

代码语言:javascript复制
:) select * from  ontime_all;
代码语言:javascript复制
SELECT * 
代码语言:javascript复制
FROM ontime_all 

代码语言:javascript复制
┌─FlightDate─┬─Year─┐
代码语言:javascript复制
│ 2001-10-12 │ 2001 │
代码语言:javascript复制
└────────────┴──────┘
代码语言:javascript复制
┌─FlightDate─┬─Year─┐
代码语言:javascript复制
│ 2002-10-12 │ 2002 │
代码语言:javascript复制
└────────────┴──────┘
代码语言:javascript复制
┌─FlightDate─┬─Year─┐
代码语言:javascript复制
│ 2003-10-12 │ 2003 │
代码语言:javascript复制
└────────────┴──────┘
代码语言:javascript复制
→ Progress: 3.00 rows, 12.00 B (48.27 rows/s., 193.08 B/s.) 
代码语言:javascript复制
3 rows inset. Elapsed: 0.063 sec. 

代码语言:javascript复制
:) 

当在其中一台机器上面查询的时候,抓包其他机器可以看见是有请求的。

代码语言:javascript复制
tcpdump -i any -s 0 -l -w - dst port 9000

下面进行数据复制的测试,zk已经配置好了,直接建表测试(3台机器都创建):

代码语言:javascript复制
CREATE TABLE ontime_replica (FlightDate Date,Year UInt16)  ENGINE = ReplicatedMergeTree('/clickhouse_perftest/tables/ontime_replica','{replica}',FlightDate,(Year, FlightDate),8192);

插入数据测试:

代码语言:javascript复制
insert into ontime_replica (FlightDate,Year) values ('2018-10-12',2018);

任何一台机器均可查询到。

0 人点赞