详解 ClickHouse 的副本机制

一、简介

副本功能只支持 MergeTree Family 的表引擎,参考文档:https://clickhouse.tech/docs/en/engines/table-engines/mergetree-family/replication/

ClickHouse 副本的目的主要是保障数据的高可用性,即使一台 ClickHouse 节点宕机,那么也可以从其他服务器获得相同的数据。

二、原理

主要依赖 Zookeeper 来进行多个 ClickHouse 节点间数据的同步,各节点间没有主从关系

三、配置

以 3 台虚拟机节点集群为例

  • 在集群的一台节点 hadoop102 上修改配置文件

    shell 复制代码
    #1. 使用外部文件进行配置
    su root
    cd /etc/clickhouse-server/config.d
    vim metrika.xml
    
    #添加zookeeper信息
    <?xml version="1.0"?>
    <yandex>
        <zookeeper-servers>
            <node index="1">
                <host>hadoop102</host>
                <port>2181</port>
            </node>
            <node index="2">
                <host>hadoop103</host>
                <port>2181</port>
            </node>
            <node index="3">
                <host>hadoop104</host>
                <port>2181</port>
            </node>
        </zookeeper-servers>
    </yandex>
    
    #修改metrika.xml文件的所属用户及组
    chown clickhouse:clickhouse metrika.xml
    
    cd /etc/clickhouse-server
    vim config.xml
    
    #查找zookeeper位置,添加配置
    <zookeeper incl="zookeeper-servers" optional="true" />
    <include_from>/etc/clickhouse-server/config.d/metrika.xml</include_from>
    
    
    #2. 直接在 config.xml 中进行配置
    su root
    cd /etc/clickhouse-server
    vim config.xml
    
    #查找zookeeper位置,去掉<zookeeper></zookeeper>的注释并修改
    <zookeeper>
        <node>
            <host>hadoop102</host>
            <port>2181</port>
        </node>
        <node>
            <host>hadoop103</host>
            <port>2181</port>
        </node>
        <node>
            <host>hadoop104</host>
            <port>2181</port>
        </node>
    </zookeeper>
  • 同步配置文件到其他节点

    shell 复制代码
    /etc/clickhouse-server/config.d/metrika.xml
    /etc/clickhouse-server/config.xml
  • 启动 zookeeper 集群服务

  • 分别在 clickhouse 对应的节点启动服务

    shell 复制代码
    sudo clickhouse start

四、使用

  • 在集群一台节点 hadoop102 上进入 clickhouse 客户端并创建表

    sql 复制代码
    create table t_order_rep2 
    (
    	id UInt32,
    	sku_id String,
    	total_amount Decimal(16,2),
    	create_time Datetime
    ) 
    engine=ReplicatedMergeTree('/clickhouse/table/01/t_order_rep','rep_102')
    partition by toYYYYMMDD(create_time)
    primary key (id)
    order by (id,sku_id);
    
    --ReplicatedMergeTree中的参数说明:
    --1. '/clickhouse/table/01/t_order_rep':指定表的分片在 zookeeper 中的地址,一般按照 /clickhouse/table/{shard}/{table_name} 的格式,只有一个分片就写 01
    
    --2. 'rep_102':指定副本名称,相同的分片副本名称不能相同
  • 在集群另一台节点 hadoop103 上进入 clickhouse 客户端并创建表

    sql 复制代码
    create table t_order_rep2 
    (
    	id UInt32,
    	sku_id String,
    	total_amount Decimal(16,2),
    	create_time Datetime
    ) 
    engine=ReplicatedMergeTree('/clickhouse/table/01/t_order_rep','rep_103')
    partition by toYYYYMMDD(create_time)
    primary key (id)
    order by (id,sku_id);
  • 在 hadoop102 上向表中插入数据

    sql 复制代码
    insert into t_order_rep2 values
    (101,'sku_001',1000.00,'2020-06-01 12:00:00'),
    (102,'sku_002',2000.00,'2020-06-01 12:00:00'),
    (103,'sku_004',2500.00,'2020-06-01 12:00:00'),
    (104,'sku_002',2000.00,'2020-06-01 12:00:00'),
    (105,'sku_003',600.00,'2020-06-02 12:00:00');
  • 在 hadoop103 上查询表中数据,能正确返回则表示副本配置成功

    sql 复制代码
    select * from t_order_rep2;
相关推荐
暮冬-  Gentle°15 小时前
用Python批量处理Excel和CSV文件
jvm·数据库·python
2401_8916558115 小时前
MySQL安全加固十大硬核操作技术大纲
数据库·mysql·安全
hongtianzai15 小时前
Laravel9.X核心特性全解析
android·java·数据库
七夜zippoe15 小时前
OpenClaw 会话管理:单聊、群聊、多模型
大数据·人工智能·fastapi·token·openclaw
dovens15 小时前
从MySQL迁移到PostgreSQL的完整指南
数据库·mysql·postgresql
电商API_1800790524715 小时前
电商平台公开数据采集实践:基于合规接口的数据分析方案
开发语言·数据库·人工智能·数据挖掘·数据分析·网络爬虫
小陈工15 小时前
2026年3月22日技术资讯洞察:数据库优化进入预测时代,网络安全威胁全面升级
java·开发语言·数据库·python·安全·web安全·django
l1t16 小时前
DeepSeek总结的PostgreSQL 无需生产数据,即可获取生产查询计划
数据库·postgresql
m0_7301151116 小时前
用户认证与授权:使用JWT保护你的API
jvm·数据库·python
Irissgwe16 小时前
Mysql数据库基础
数据库·c++·mysql·mysql数据库基础