Skip to content

部署目标

  • 在现有ClickHouse集群(包括3台zookeeper节点和4台数据节点)基础上,新增2个数据节点,最终扩容成3 zookeeper节点和6数据节点集群。

要点概览

  • 安装要点
    • 先在8台新节点安装好ClickHouse,将配置更改好,创建好原有表。注意:这个过程最耗时的是在新节点创建相关库表。 -- 这个步骤结束后是个里程碑,后续步骤终止也没有关系。不会影响集群的其他节点。
    • 新节点完全具备条件后,再更新老集群节点的配置。此时,整个集群就真正扩容成功了。
    • 更改数据写入程序的配置,也往新节点写入数据。
    • 注意配置新老节点的防火墙策略。
  • 配置要点
    • 基本可以在原来CK配置基础上修改,注意 宏定义部分(macro)每台节点不同。
    • 原有CK集群的配置如果有更改,不需要重启,CK会自动加载配置。

操作步骤

安装新节点

  • 创建2台VM主机

  • 修改主机名

    shell
    hostnamectl set-hostname ck05
    hostnamectl set-hostname ck06
  • 准备安装包

    ck01 上操作

    shell
    echo '192.168.107.20 ck05' >> /etc/hosts
    echo '192.168.107.21 ck06' >> /etc/hosts
    tail /etc/hosts
    ping -c 2 ck05
    ping -c 2 ck06
    
    cd ~
    scp clickhouse-*.rpm root@ck05:$PWD
    scp clickhouse-*.rpm root@ck06:$PWD
  • 在原有集群上进行操作:目的是模拟客户环境已经存在的数据表

    ck01 上操作

    shell
    CREATE DATABASE IF NOT EXISTS cluster_db ON CLUSTER cluster1;
    use cluster_db;
    
    
    CREATE TABLE user_logs_local ON CLUSTER cluster1
    (
        user_id UInt64 COMMENT '用户ID',
        event_type String COMMENT '事件类型',
        event_time DateTime COMMENT '事件时间',
        event_data String COMMENT '事件数据',
        ip_address String COMMENT 'IP地址'
    )
    ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/user_logs_local', '{replica}')
    PARTITION BY toYYYYMM(event_time)
    ORDER BY (user_id, event_time)
    SETTINGS index_granularity = 8192;
    
    
    CREATE TABLE user_logs_distributed ON CLUSTER cluster1
    (
        user_id UInt64,
        event_type String,
        event_time DateTime,
        event_data String,
        ip_address String
    )
    ENGINE = Distributed(cluster1, cluster_db, user_logs_local, rand());
    
    
    INSERT INTO user_logs_distributed (user_id, event_type, event_time, event_data, ip_address)
    VALUES
    (1, 'click', '2024-11-12 10:00:00', 'Clicked button', '192.168.1.1'),
    (2, 'view', '2024-11-12 10:05:00', 'Viewed page', '192.168.1.2'),
    (3, 'purchase', '2024-11-12 10:10:00', 'Purchased item', '192.168.1.3');
    
    
    SELECT * FROM user_logs_distributed;
  • 安装新节点

    ck05ck06 上操作。

    • 操作系统基本配置

    • 配置 hosts

      shell
      echo '192.168.107.8 ck01' >> /etc/hosts
      echo '192.168.107.9 ck02' >> /etc/hosts
      echo '192.168.107.10 ck03' >> /etc/hosts
      echo '192.168.107.11 ck04' >> /etc/hosts
      echo '192.168.107.20 ck05' >> /etc/hosts
      echo '192.168.107.21 ck06' >> /etc/hosts
      echo '192.168.107.12 keeper01' >> /etc/hosts
      echo '192.168.107.13 keeper02' >> /etc/hosts
      echo '192.168.107.14 keeper03' >> /etc/hosts
      
      # 验证
      tail -n 9 /etc/hosts
      ping -c 2 ck01
      ping -c 2 ck02
      ping -c 2 ck03
      ping -c 2 ck04
      ping -c 2 ck05
      ping -c 2 ck06
      ping -c 2 keeper01
      ping -c 2 keeper02
      ping -c 2 keeper03
    • 执行安装

      shell
      rpm -ivh ./*.rpm

      输入密码:p@$$W0rd

    • 更改数据目录

      以原有数据节点配置作为基础,稍作修改即可。

      shell
      mkdir -p /data01/clickhouse-server/data/
      mv /var/lib/clickhouse /data01/clickhouse-server/data/
      ln -s /data01/clickhouse-server/data/clickhouse /var/lib/clickhouse
      chown -R clickhouse:clickhouse /data01/clickhouse-server/data/clickhouse
      
      mkdir -p /data01/clickhouse-server/log/
      mv /var/log/clickhouse-server/ /data01/clickhouse-server/log/
      ln -s /data01/clickhouse-server/log/clickhouse-server /var/log/clickhouse-server
      chown -R clickhouse:clickhouse  /data01/clickhouse-server/log/
  • 修改新节点配置

    以原有数据节点配置作为基础,稍作修改即可。

    • 传输原有数据节点配置,在ck01上操作

      shell
      scp /etc/clickhouse-server/config.xml root@ck05:/root
      scp /etc/clickhouse-server/config.xml root@ck06:/root
      
      scp /etc/clickhouse-server/users.xml root@ck05:/root
      scp /etc/clickhouse-server/users.xml root@ck06:/root
    • 配置文件增加副本(假设解压之后的文件位于/opt/20250220/

      shell
      cd /opt/20250220/
      
      # 退出使用`:wq!`强制保存
      vim config.xml

      搜索关键字 shard,找到 <cluster1>包裹的内容,添加:

      xml
                  <shard>
                      <internal_replication>true</internal_replication>
                      <replica>
                          <host>ck05</host>
                          <port>9000</port>
                          <user>default</user>
                          <password>p@$$W0rd</password>
                      </replica>
                      <replica>
                          <host>ck06</host>
                          <port>9000</port>
                          <user>default</user>
                          <password>p@$$W0rd</password>
                      </replica>
                  </shard>

      注意:上面这部分内容,要添加到 </cluster> 前面。

    • (差异执行)修改宏定义(仍旧是上面的config.xml

      • (ck05)搜索关键字 macros,改为如下:

        xml
            <macros>
                <shard>03</shard>
                <replica>ck05</replica>
            </macros>
      • (ck06)搜索关键字 macros,改为如下:

        xml
            <macros>
                <shard>03</shard>
                <replica>ck05</replica>
            </macros>
    • 更改文件权限

      shell
      chown clickhouse:clickhouse *.xml
      ll -h
    • 替换配置

      shell
      cp -pf *.xml /etc/clickhouse-server/
  • 启动新节点

    shell
    systemctl start clickhouse-server
    systemctl status clickhouse-server
  • 验证

    ck05ck06上均执行

    sql
    CREATE DATABASE IF NOT EXISTS cluster_db;
    use cluster_db;
    
    
    CREATE TABLE user_logs_local
    (
        user_id UInt64 COMMENT '用户ID',
        event_type String COMMENT '事件类型',
        event_time DateTime COMMENT '事件时间',
        event_data String COMMENT '事件数据',
        ip_address String COMMENT 'IP地址'
    )
    ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/user_logs_local', '{replica}')
    PARTITION BY toYYYYMM(event_time)
    ORDER BY (user_id, event_time)
    SETTINGS index_granularity = 8192;
    
    
    CREATE TABLE user_logs_distributed
    (
        user_id UInt64,
        event_type String,
        event_time DateTime,
        event_data String,
        ip_address String
    )
    ENGINE = Distributed(cluster1, cluster_db, user_logs_local, rand());
    
    
    SELECT * FROM user_logs_distributed;

    预期能看到3条数据

    • 测试插入

      ck06上执行

      shell
      INSERT INTO user_logs_local (user_id, event_type, event_time, event_data, ip_address)
      VALUES
      (4, 'click--', '2024-11-12 10:00:00', 'Clicked button', '192.168.1.1'),
      (5, 'view--', '2024-11-12 10:05:00', 'Viewed page', '192.168.1.2'),
      (6, 'purchase--', '2024-11-12 10:10:00', 'Purchased item', '192.168.1.3');

      预期在 ck05查询本地表能看到副本

在原有节点上增加配置

ck01ck02ck03ck04 上均操作

  • 增加别名

    shell
    echo '192.168.107.20 ck05' >> /etc/hosts
    echo '192.168.107.21 ck06' >> /etc/hosts
    tail /etc/hosts
    ping -c 2 ck05
    ping -c 2 ck06
  • 修改配置文件

    • vim /etc/clickhouse-server/config.xml
    xml
                <shard>
                    <internal_replication>true</internal_replication>
                    <replica>
                        <host>ck05</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>p@$$W0rd</password>
                    </replica>
                    <replica>
                        <host>ck06</host>
                        <port>9000</port>
                        <user>default</user>
                        <password>p@$$W0rd</password>
                    </replica>
                </shard>
    • 更改文件权限

      shell
      ll -h /etc/clickhouse-server/config.xml
  • 无需重启,配置即可生效

  • 验证

    • 验证分片

      sql
      SELECT cluster, host_name FROM system.clusters;

      预期有cluster1

    • 验证宏定义

      sql
      SELECT * FROM system.macros;

      预期 ck01ck03shard01, ck02ck04 上shard为02ck05ck067 上shard为03replica为各主机名称。

一些细节

  • 如果4台节点是旧配置,两台新节点是新配置,从新旧数据节点查询到同一张表的数据是不同的。 -- 1)可以利用该特性,进行集群隔离 2) 如果旧节点上配置已经是最新,但是新节点上并没有对应的表,就会出现查询错误
  • 原有的库表(包括分布式表、本地表)、物化视图、projection等,都不会同步过来 -- 需要使用创建语句,可以添加 IF NOT EXISTS

基于 知识共享 CC BY-NC-SA 许可发布