clickhouse集群搭建

二维码
| Feb 02, 2021 | 原创

借官方原话:ClickHouse 可以在任何具有x86_64,AArch64或PowerPC64LE CPU架构的Linux,FreeBSD或Mac OS X上运行。

为了保证 ClickHouse 集群的高可用,我们引入 zookeeper 作为 ClickHouse 节点信息同步,以及表信息 DDL 操作自动同步工作。因此在搭建 ClickHouse 集群前,需要有一个zookeeper 集群,关于 zooKeeper 集群的搭建,请参考另一篇文章:zookeeper集权部署

如果是真正的生成环境,建议是 ClickHouse 集权和zookeeper 集群分开部署,在同一台机器上同时部署 ClickHousezookeeper 着实不可取。

准备工作

这里我们准备了6台 centos7.4机器来部署 ClickHouse集群,对外我们希望系统可以提供3分片2副本的高可用模式进行服务。6台机器每台机器代表1节点(node),6台机器中,3台机器每台机器1分片(shared),另外3台作为数据备份机器(replica)。

机器信息如下:

| 机器ip | Host | | - | - | | 10.120.1.100 | ck01 | | 10.120.1.101 | ck02 | | 10.120.1.102 | ck03 | | 10.120.1.103 | ck04 | | 10.120.1.104 | ck05 | | 10.120.1.105 | ck06 |

为了方便管理这些机器,我们为每个机器节点取一个host别名,以ck开头加上一个数字名称(如:ck01),我们需要在每台机器上配置类似如下hosts

# ck01机器下配置hosts
10.120.1.100 ck01
10.120.1.101 ck02
10.120.1.102 ck03
10.120.1.103 ck04
10.120.1.104 ck05
10.120.1.105 ck06

其他节点以此类推。不过一般公司级别的机器应该会默认配置host名称。所以此步骤并非必须要求。配置host目的是方便在配置文件中直接填写host名称而不是ip地址,当然其实直接填写ip也没任何问题。

这里要说明的是,ClickHouse 的一个实例只能启动一个分片和一个备份,所以刚开始我们希望使用3台机器来实现3分片2副本,机器节点循环备份的方式是行不通的。所以这里准备了6台机器,三台作为备份机器使用。

以上的三分片仅是演示作用,实际中如果数据较大可能分片规模更多。分片的作用是提升集群的并行计算能力。2副本模式下,如果启动某个节点机器宕机,那么ClickHouse 可以使用备份节点继续提供服务,保证了集群的高可用。

软件安装

本集群服务器统一使用的是 centos系统,所以直接使用官方提供的 rpm 包即可。

首先,需要在每一台机器上安装 clickhouse单机版,然后进行集群化配置。

sudo yum install -y yum-utils && sudo rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG && sudo yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/stable/x86_64

# 安装 clickhouse
sudo yum install clickhouse-server clickhouse-client

不过需要注意的是,这种方式安装的包是最新的版本,但实际场景中最好选择某个具体的stable 版本,方便以后集群扩容时使用统一版本,以减少不必要的版本兼容麻烦

此外,官方提供的Yum源在国内下载速度还是比较慢的,所以这里我们直接使用清华大学的代理镜像,所以最终安装命令变为如下:

# 缩减为一行命令
sudo yum install -y yum-utils && sudo rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG && sudo yum-config-manager --add-repo https://mirrors.tuna.tsinghua.edu.cn/clickhouse/rpm/stable/x86_64 && sudo yum install -y clickhouse-server-21.1.2.15 clickhouse-client-21.1.2.15

服务管理

使用 rpm 安装的 ClickHouse 配置文件默认存放于 /etc 目录下,分为 clickhouse-clientclickhouse-server 两个子目录,分别代表客户端连接配置和服务器配置目录。

/etc
├── clickhouse-client
│   ├── conf.d/
│   └── config.xml
└── clickhouse-server
    ├── config.d/
    ├── config.xml
    ├── users.d/
    └── users.xml

服务管理

关于 ClickHouse 日常管理可以直接使用 systemctl 来操作即可:

# 启动
sudo systemctl start clickhouse-server

# 停止
sudo systemctl stop clickhouse-server

# 重启
sudo systemctl restart clickhouse-server

# 查看状态
sudo systemctl status clickhouse-server

# 查看日志
sudo journalctl -u clickhouse-server

对于 ClickHouse 服务配置修改不需要重启,会自动生效

集群配置

在各个节点安装好 ClickHouse 单机版之后,接下来我们需要修改配置使得 ClickHouse 集群化。配置文件路径如下:

/etc/clickhouse-server/config.xml

配置文件我们主要修改如下内容:

1.修改 listen_host

配置 listen_host字段,运行内网节点互通,**注意IPv4和IPv6的选择

<listen_host>0.0.0.0</listen_host>

2.配置zookeeper

关于 zookeeper 配置为了方便维护,在 config.d 目录下新建 zookeeper.xml 配置文件:

<yandex>
  <zookeeper>
    <node>
      <host>host1</host>
      <port>2181</port>
    </node>
    <node>
      <host>host2</host>
      <port>2181</port>
    </node>
    <node>
      <host>host3</host>
      <port>2181</port>
    </node>
  </zookeeper>
</yandex>

<host> 可以是 zookeeper 集群具体的 hostname 也可以是ip地址,端口<port> 为集群的服务具体端口,zookeeper 默认端口为 2181

3.配置 remote_server

配置集群为 3分片2副本模式:

<remote_servers>
  <ck_cluster>
    <shard>
      <weight>1</weight>
      <internal_replication>true</internal_replication>
      <replica>
        <host>ck01</host>
        <port>9000</port>
      </replica>
      <replica>
        <host>ck02</host>
        <port>9000</port>
      </replica>
    </shard>
    <shard>
      <weight>1</weight>
      <internal_replication>true</internal_replication>
      <replica>
        <host>ck03</host>
        <port>9000</port>
      </replica>
      <replica>
        <host>ck04</host>
        <port>9000</port>
      </replica>
    </shard>
    <shard>
      <weight>1</weight>
      <internal_replication>true</internal_replication>
      <replica>
        <host>ck05</host>
        <port>9000</port>
      </replica>
      <replica>
        <host>ck06</host>
        <port>9000</port>
      </replica>
    </shard>
  </ck_cluster>
</remote_servers>

这里的集群名称:ck_cluster ,名称可自行修改,主要后续创建分布式表会使用到。集群下,有3分片,分别为3个shard字段。每个分片下,有俩副本集,我们把准备的6台机器中,双数host机器作为单数host机器的备份机器,即,ck02ck01 的备份机,ck04ck03 的备份机,ck06ck05 提供备份。

借用一张图来说明更为直观:

4.配置macro

/etc/clickhouse-server/config.d目录下创建 macros.xml 文件,配置每台机器的分片和副本宏定义。

sudo touch /etc/clickhouse-server/config.d/macros.xml

写入如下内容:

<yandex>
    <macros>
        <shard>01</shard>
        <replica>01</replica>
    </macros>
</yandex>

根据我们设计的集群分片副本定义规则,我们设置每台机器宏定义内容,规则如下:

ck01: shard=01, replica=01
ck02: shard=01, replica=02
ck03: shard=02, replica=01
ck04: shard=02, replica=02
ck05: shard=03, replica=01
ck05: shard=03, replica=02

config.d 目录下的文件会自动加载到配置内容中,因此不需要额外设置 incl 标记包含标记。配置后可以使用如下命令查看宏定义配置是否生效:

select * from system.macros

返回类似如下内容,即配置成功:

┌─macro───┬─substitution─┐
│ replica │ 01           │
│ shard   │ 01           │
└─────────┴──────────────┘

测试

调整完配置后,我们可以测试配置文件是否生效。由于配置文件是热更新的,所以修改配置后无需要重启服务,除非是首次启动 ClickHouse

查看集群状态

随意选一台机器,使用客户端连接 ClickHouse 查看集群信息:

clickhouse client -h [节点ip]

然后查询集群信息:

select * from system.clusters;

创建 ReplicatedMergeTree 测试表

任选一台机器,创建一个 ReplicatedMergeTree 引擎的测试表,测试 ZooKeeper 同步功能,以及表数据同步功能是否可用。

CREATE TABLE test ON CLUSTER ck_cluster (EventDate DateTime, CounterID UInt32, UserID UInt32 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/test', '{replica}') PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID);

查看其他机器节点查看表结构是否同步成功:

show tables

如果显示如下信息,则表示同步成功:

┌─name──────┐
│ test      │
└───────────┘

验证数据备份是否生效

使用 ck01 插入一条数据,验证备份机 ck02 中数据是否同步到位:

-- ck01 客户端登录执行
insert into test values ('2021-02-01 00:00:01', 2, 2);

-- ck02 客户端登录执行
select * from test

如果数据存在,则表示数据同步配置成功。

创建 Distributed 引擎测试表

创建一个分布式测试表测试数据分片是否ok。还是任选一台节点机器,先创建一张本地表,类似 test 表,因为已经配置了zookeeper,所以创建表的DDL语句也会同步到其他节点上。

CREATE TABLE dis_test ON CLUSTER ck_cluster (EventDate DateTime, CounterID UInt32, UserID UInt32 ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/dis_test', '{replica}') PARTITION BY toYYYYMM(EventDate) ORDER BY (CounterID, EventDate, intHash32(UserID)) SAMPLE BY intHash32(UserID);

再基于 dis_test 创建分布式表:

CREATE TABLE dis_test_all ON CLUSTER ck_cluster AS dis_test
ENGINE = Distributed(ck_cluster, default, dis_test, rand())

再往分布式表中插入几条数据:

insert into dis_test_all values ('2021-02-01 12:00:01', 100,105);
insert into dis_test_all values ('2021-02-01 12:00:02', 101,105);
insert into dis_test_all values ('2021-02-01 12:00:03', 102,105);
insert into dis_test_all values ('2021-02-01 12:00:04', 103,105);
insert into dis_test_all values ('2021-02-01 12:00:05', 104,105);
insert into dis_test_all values ('2021-02-01 12:00:06', 105,105);

查看每个节点下分布式表返回的数据,正常情况下每个节点分布式表返回的数据都应该是6条数据:

select * from dis_test_all

总结

至此,ClikHouse 三分片2副本集群搭建完毕,不过上述的配置还不能完全应用于生产环境,主要还涉及用户账号权限设置,系统参数调优,数据存放路径设置等等,在后续的文章中将进一步说明。