环境

Zookeeper 服务器

eth0 IP eth1 IP 操作系统 ZK 版本 myid
10.0.4.101 10.1.4.101 CentOS7.8 3.4.14 101
10.0.4.102 10.1.4.102 CentOS7.8 3.4.14 102
10.0.4.103 10.1.4.103 CentOS7.8 3.4.14 103
  • eth0 网卡用于向客户端提供服务,eth1 网卡用于 Zookeeper 集群内部通信
  • 配置时间同步,关闭 selinux 和 firewalld

ClickHouse 服务器

eth0 IP eth1 IP 操作系统 CH 版本 shard 值 replica 值
10.0.4.181 10.1.4.181 CentOS7.8 20.3 LTS 1 10.1.4.181
10.0.4.182 10.1.4.182 CentOS7.8 20.3 LTS 1 10.1.4.182
10.0.4.183 10.1.4.183 CentOS7.8 20.3 LTS 2 10.1.4.183
10.0.4.184 10.1.4.184 CentOS7.8 20.3 LTS 2 10.1.4.184
10.0.4.185 10.1.4.185 CentOS7.8 20.3 LTS 3 10.1.4.185
10.0.4.186 10.1.4.186 CentOS7.8 20.3 LTS 3 10.1.4.186
  • eth0 网卡用于向客户端提供服务,eth1 网卡用于 ClickHouse 集群内部通信
  • 配置时间同步,关闭 selinux 和 firewalld

安装 Zookeeper 集群

  • ClickHouse 集群依赖 zookeeper 管理集群配置
  • 安装过程参考: CentOS7 安装 zookeeper 集群
  • 启动 zookeeper 集群,zookeeper 正常运行后,才能进行后续步骤

安装 ClickHouse 集群

配置 ClickHouse yum 源

  • 在每台 ClickHouse 服务器上执行如下操作

  • 生成 clickhouse.repo 文件

    1
    2
    3
    4
    5
    6
    7
    8
    
    echo '[clickhouse-lts]
    name=ClickHouse - LTS Repository
    baseurl=https://mirrors.tuna.tsinghua.edu.cn/clickhouse/rpm/lts/$basearch/
    gpgkey=https://mirrors.tuna.tsinghua.edu.cn/clickhouse/CLICKHOUSE-KEY.GPG
    gpgcheck=1
    enabled=1
    EOF
    ' > /etc/yum.repos.d/clickhouse.repo
    
  • 重建 yum 缓存

    1
    2
    
    yum clean all
    yum makecache fast
    

安装 ClickHouse

  • 在每台 ClickHouse 服务器上执行如下操作
  • 安装 clickhouse-server 和 clickhouse-client
    1
    
    yum install clickhouse-server clickhouse-client
    

修改 ClickHouse 配置

  • 在每台 ClickHouse 服务器上执行如下操作

  • 我没用 /etc/metrika.xml 和 config.d 子目录,直接修改的 config.xml,先备份

    1
    2
    
    cd /etc/clickhouse-server/
    cp config.xml config.xml.origin
    
  • 编辑 /etc/clickhouse-server/config.xml,修改部分如下

      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
     88
     89
     90
     91
     92
     93
     94
     95
     96
     97
     98
     99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    
    <!-- 各节点用于集群内部通信的 eth1 网卡 IP -->
    <interserver_http_host>10.1.4.181</interserver_http_host> <!-- 10.0.4.181 -->
    <interserver_http_host>10.1.4.182</interserver_http_host> <!-- 10.0.4.182 -->
    <interserver_http_host>10.1.4.183</interserver_http_host> <!-- 10.0.4.183 -->
    <interserver_http_host>10.1.4.184</interserver_http_host> <!-- 10.0.4.184 -->
    <interserver_http_host>10.1.4.185</interserver_http_host> <!-- 10.0.4.185 -->
    <interserver_http_host>10.1.4.186</interserver_http_host> <!-- 10.0.4.186 -->
    
    <!-- 监听全部 IPV4 地址 -->
    <listen_host>0.0.0.0</listen_host>
    
    <!-- 默认数据目录,建议在该目录下挂载单独硬盘 -->
    <path>/var/lib/clickhouse/</path>
    
    <!-- 自定义存储策略,这里随便写了个 jbod,非必须配置 -->
    <storage_configuration>
        <disks>
            <default>
                <keep_free_space_bytes>1073741824</keep_free_space_bytes>
            </default>
            <disk1>
                <path>/clickhouse/disk1/</path> <!-- 该目录建议挂载单独硬盘 -->
            </disk1>
            <disk2>
                <path>/clickhouse/disk2/</path> <!-- 该目录建议挂载单独硬盘 -->
            </disk2>
        </disks>
        <policies>
            <policy_jbod>
                <volumes>
                    <disk_group>
                        <disk>disk1</disk>
                        <disk>disk2</disk>
                    </disk_group>
                </volumes>
            </policy_jbod>
        </policies>
    </storage_configuration>
    
    <!-- 内存锁定 -->
    <mlock_executable>true</mlock_executable>
    
    <!-- 集群配置,三分片双副本 -->
    <remote_servers>
        <cluster_3s2r>
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>10.1.4.181</host>
                    <port>9000</port>
                </replica>
                <replica>
                    <host>10.1.4.182</host>
                    <port>9000</port>
                </replica>
            </shard>
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>10.1.4.183</host>
                    <port>9000</port>
                </replica>
                <replica>
                    <host>10.1.4.184</host>
                    <port>9000</port>
                </replica>
            </shard>
            <shard>
                <internal_replication>true</internal_replication>
                <replica>
                    <host>10.1.4.185</host>
                    <port>9000</port>
                </replica>
                <replica>
                    <host>10.1.4.186</host>
                    <port>9000</port>
                </replica>
            </shard>
        </cluster_3s2r>
    </remote_servers>
    
    <!-- zookeeper 配置 -->
    <zookeeper>
        <node index="1">
            <host>10.0.4.101</host>
            <port>2181</port>
        </node>
        <node index="2">
            <host>10.0.4.102</host>
            <port>2181</port>
        </node>
        <node index="3">
            <host>10.0.4.103</host>
            <port>2181</port>
        </node>
    </zookeeper>
    
    <!-- 各节点的宏变量 -->
    <macros> <!-- 10.0.4.181 -->
        <shard>1</shard>
        <replica>10.1.4.181</replica>
    </macros>
    <macros> <!-- 10.0.4.182 -->
        <shard>1</shard>
        <replica>10.1.4.182</replica>
    </macros>
    <macros> <!-- 10.0.4.183 -->
        <shard>2</shard>
        <replica>10.1.4.183</replica>
    </macros>
    <macros> <!-- 10.0.4.184 -->
        <shard>2</shard>
        <replica>10.1.4.184</replica>
    </macros>
    <macros> <!-- 10.0.4.185 -->
        <shard>3</shard>
        <replica>10.1.4.185</replica>
    </macros>
    <macros> <!-- 10.0.4.186 -->
        <shard>3</shard>
        <replica>10.1.4.186</replica>
    </macros>
    

启动 ClickHouse

  • 在每台 ClickHouse 服务器上执行如下操作
  • 启动 clickhouse-server 服务
    1
    
    systemctl start clickhouse-server
    

查看集群状态

  • 在任一 ClickHouse 服务器上执行如下操作
  • 查询 system.cluster 表
    1
    
    SELECT * FROM system.clusters;
    

简单使用

  • 在任意节点上登陆 clickhouse

    1
    
    clickhouse-client -h 127.0.0.1
    
  • 创建数据库

    1
    2
    
    CREATE DATABASE db1 ON CLUSTER cluser_3s2r;
    USE db1;
    
  • 创建数据表

    1
    2
    3
    4
    5
    6
    7
    
    CREATE TABLE db1.t1_local
        ON CLUSTER cluster_3s2r (
        col1 UInt32,
        col2 String
    ) ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/t1_local', '{replica}')
    ORDER BY (col1)
    SETTINGS STORAGE_POLICY='policy_jbod';
    
  • 创建数据表对应的分布式代理表

    1
    2
    3
    4
    
    CREATE TABLE db1.t1
        ON CLUSTER cluster_3s2r
        AS db1.t1_local
        ENGINE = Distributed(cluster_3s2r, db1, t1_local, rand());
    
  • 通过分布式代理表写入和查询数据

    1
    2
    
    INSERT INTO db1.t1 values(1,'aa');
    SELECT * FROM db1.t1;