ClickHouse副本配置全攻略:基于ZooKeeper实现高可用部署

在大数据场景中,数据高可用是核心需求之一。ClickHouse作为高性能列式数据库,虽默认具备优异的查询性能,但需通过副本机制实现数据冗余与故障转移------这一点与MySQL主从架构思路相似,但ClickHouse副本无主从之分,配置更依赖ZooKeeper集群协调。本文将从架构解析、ZooKeeper搭建到ClickHouse副本配置,带你完整实现高可用部署。

一、ClickHouse副本架构解析

ClickHouse副本的核心目标是将数据冗余到多台机器,避免单点故障。其架构有两个关键特性:

  1. 无主从设计:任意副本节点均可写入数据,写入后会通过ZooKeeper自动同步至其他副本,无需指定"主节点"或"从节点"。
  2. ZooKeeper依赖:副本间的元数据同步、写入协调、节点状态管理均由ZooKeeper集群负责,确保各副本数据一致性。

下图为ClickHouse副本典型架构:

注:副本配置需针对表级实现,核心是使用ReplicatedMergeTree引擎(属于MergeTree家族),官方文档可参考ClickHouse Replication

二、前置准备:ZooKeeper集群搭建

ClickHouse副本依赖ZooKeeper协调,因此需先搭建3节点ZooKeeper集群(生产环境建议奇数节点,确保选举机制正常)。本次搭建使用机器IP为192.168.184.155192.168.184.156192.168.184.157,操作需在三台机器上同步执行。

2.1 下载并解压ZooKeeper

  1. 创建ZooKeeper数据目录并进入:

    bash 复制代码
    mkdir /data/zookeeper
    cd /data/zookeeper
  2. 下载指定版本(3.9.4)并解压:

    bash 复制代码
    wget https://dlcdn.apache.org/zookeeper/zookeeper-3.9.4/apache-zookeeper-3.9.4-bin.tar.gz
    tar zxvf apache-zookeeper-3.9.4-bin.tar.gz
    cd apache-zookeeper-3.9.4-bin/conf
  3. 复制默认配置文件并重命名:

    bash 复制代码
    cp zoo_sample.cfg zoo.cfg

2.2 修改ZooKeeper配置文件

  1. 编辑zoo.cfg,添加集群节点信息:

    bash 复制代码
    vim /data/zookeeper/apache-zookeeper-3.9.4-bin/conf/zoo.cfg
  2. 在文件末尾加入以下内容(指定各节点IP与端口):

    bash 复制代码
    server.1=192.168.184.155:2888:3888
    server.2=192.168.184.156:2888:3888
    server.3=192.168.184.157:2888:3888
    • 2888:节点间通信端口(Leader与Follower交互);
    • 3888:选举端口(节点选举Leader时使用)。

2.3 配置节点唯一标识(myid)

  1. 创建myid存储目录:

    bash 复制代码
    mkdir /tmp/zookeeper/
  2. 为不同节点写入唯一标识(每台机器需单独执行,值对应server.N中的N ):

    • 192.168.184.155:echo 1 > /tmp/zookeeper/myid
    • 192.168.184.156:echo 2 > /tmp/zookeeper/myid
    • 192.168.184.157:echo 3 > /tmp/zookeeper/myid

2.4 启动ZooKeeper集群

在三台机器上分别执行启动命令:

bash 复制代码
/data/zookeeper/apache-zookeeper-3.9.4-bin/bin/zkServer.sh start
  • 可通过zkServer.sh status查看节点状态(会显示LeaderFollower,确认集群正常运行)。

ZooKeeper 集群状态查看报错处理步骤

  1. 报错查看 :执行/data/zookeeper/apache-zookeeper-3.9.4-bin/bin/zkServer.sh status查看 ZooKeeper 节点状态,若出现 "Error contacting service. It is probably not running" 报错,通过tail -f /data/zookeeper/apache-zookeeper-3.9.4-bin/logs/zookeeper-root-server-maria-05.out查看日志文件
  2. 故障排除 :若日志显示类似java.net.AbstractPlainSocketImpl.connect的连接相关报错,在三台机器上执行iptables -F清除防火墙规则
  3. 重启验证:执行/data/zookeeper/apache-zookeeper-3.9.4-bin/bin/zkServer.sh restart重启 ZooKeeper,再运行状态查看命令,此时应显示正常状态(leader或follower)

三、ClickHouse副本配置与测试

完成ZooKeeper集群搭建后,开始配置ClickHouse副本。本次选择192.168.184.155192.168.184.156作为两个ClickHouse副本节点。

3.1 修改ClickHouse配置文件

  1. 编辑ClickHouse主配置文件config.xml

    bash 复制代码
    vim /etc/clickhouse-server/config.xml
  2. 搜索并修改zookeeper节点,指向已搭建的ZooKeeper集群(使用域名maria-01/maria-02/maria-03简化配置):

    xml 复制代码
    <zookeeper>
        <node>
            <host>maria-05</host>
            <port>2181</port>
        </node>
        <node>
            <host>maria-06</host>
            <port>2181</port>
        </node>
        <node>
            <host>maria-07</host>
            <port>2181</port>
        </node>
    </zookeeper>
  3. 配置域名解析(若系统无法识别maria-05等域名,需在三台机器/etc/hosts中添加映射):

    bash 复制代码
    vim /etc/hosts
    # 加入以下内容
    192.168.184.155 maria-05
    192.168.184.156 maria-06
    192.168.184.157 maria-07
  4. 重启ClickHouse服务(两台副本节点均需执行):

    bash 复制代码
    /etc/init.d/clickhouse-server restart

3.2 创建副本表(ReplicatedMergeTree引擎)

ClickHouse副本通过表级配置实现,需在两个副本节点上分别创建表,核心是确保ReplicatedMergeTree引擎的ZooKeeper路径一致。

步骤1:在192.168.184.155(副本1)创建表
  1. 进入ClickHouse客户端:clickhouse-client -m

  2. 执行建库与建表语句:

    sql 复制代码
    -- 创建数据库
    create database db_repl;
    -- 创建副本表
    CREATE TABLE db_repl.repl_test
    (
        EventDate DateTime,  -- 时间字段
        CounterID UInt32,    -- 计数器ID
        UserID UInt32        -- 用户ID
    ) 
    ENGINE = ReplicatedMergeTree(
        '/clickhouse/tables/repl_test',  -- ZooKeeper中存储表元数据的路径(需一致)
        'maria01'                        -- 副本名称(每个副本唯一,如maria01、maria02)
    )
    PARTITION BY toYYYYMM(EventDate)    -- 按年月分区
    ORDER BY (CounterID, EventDate, intHash32(UserID))  -- 排序键
    SAMPLE BY intHash32(UserID);        -- 采样键(用于近似查询)
步骤2:在192.168.184.156(副本2)创建表

与副本1语句基本一致,仅需修改副本名称maria02

sql 复制代码
create database db_repl;
CREATE TABLE db_repl.repl_test
(
    EventDate DateTime,
    CounterID UInt32,
    UserID UInt32
) 
ENGINE = ReplicatedMergeTree(
    '/clickhouse/tables/repl_test',  -- 路径与副本1完全一致
    'maria02'                        -- 副本名称唯一
)
PARTITION BY toYYYYMM(EventDate)
ORDER BY (CounterID, EventDate, intHash32(UserID))
SAMPLE BY intHash32(UserID);

关键原则:只要两个表在ZooKeeper中的路径(第一个参数)一致,即可自动同步数据。

3.3 测试副本数据同步

  1. 在副本1(192.168.184.155)插入测试数据:

    sql 复制代码
    insert into db_repl.repl_test values ('2030-01-01 12:00:00', 1, 1);
  2. 在副本2(192.168.184.156)查询数据,验证同步结果:

    sql 复制代码
    select * from db_repl.repl_test;

    若查询结果显示插入的(2030-01-01 12:00:00, 1, 1),则说明副本同步正常。

同步测试效果示意图:

四、总结

ClickHouse副本配置的核心是"ZooKeeper协调+ReplicatedMergeTree引擎",关键要点可归纳为三点:

  1. ZooKeeper集群需确保奇数节点,配置myidserver.N对应,保证选举与通信正常;
  2. ClickHouse副本表的ReplicatedMergeTree引擎,需统一ZooKeeper路径、区分副本名称;
  3. 数据同步无需手动触发,写入任意副本后,ZooKeeper会自动协调其他副本拉取数据。

通过以上步骤,即可实现ClickHouse数据的高可用冗余,应对单点故障风险,适合生产环境部署使用。

相关推荐
ezreal_pan1 天前
Kafka Docker 部署持久化避坑指南:解决重启后 Cluster ID 不匹配问题
分布式·docker·zookeeper·容器·kafka·devops
pray~2 天前
海外Linux Debian环境临时安装依赖包
linux·运维·debian
neo33012 天前
debian MEDIATEK Corp. Device 7925 无线网卡驱动安装
运维·服务器·debian
vortex53 天前
Debian 包管理全指南:从底层 dpkg 到高层 apt 及其日志追踪
linux·运维·debian
chenqianghqu4 天前
debian系统程序自动运行
debian
韩明君5 天前
OpenClaw安全部署实现
linux·人工智能·安全·debian·本地部署·ai agent·openclaw
独隅5 天前
ZooKeeper 基础原理深度解析
分布式·zookeeper·云原生
嘿嘿潶黑黑6 天前
关于Debian源速度慢的解决方法
运维·debian
富士康质检员张全蛋6 天前
ZooKeeper性能调优终 关键配置提升集群吞吐量
zookeeper
4t4run7 天前
1、clickhouse 安装
数据库·clickhouse