详解 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;
相关推荐
芝麻开门-新起点39 分钟前
第11章 线上/线下交易系统
大数据
杜子不疼.41 分钟前
Spring AI 与向量数据库:构建企业级 RAG 智能问答系统
数据库·人工智能·spring
山峰哥1 小时前
Python爬虫实战:从零构建高效数据采集系统
开发语言·数据库·爬虫·python·性能优化·架构
_OP_CHEN2 小时前
【C++数据结构进阶】从B + 树 / B * 树到数据库索引:B树的进化之路与 MySQL 实战解析
数据结构·数据库·b树·mysql·innodb·b+树·mylsam
第二只羽毛2 小时前
Java图书管理系统的设计与实现
java·大数据·安全·系统安全
云老大TG:@yunlaoda3608 小时前
华为云国际站代理商TaurusDB的成本优化体现在哪些方面?
大数据·网络·数据库·华为云
TG:@yunlaoda360 云老大8 小时前
华为云国际站代理商GeminiDB的企业级高可用具体是如何实现的?
服务器·网络·数据库·华为云
面向Google编程9 小时前
Flink源码阅读:窗口
大数据·flink
老蒋新思维9 小时前
知识IP的长期主义:当AI成为跨越增长曲线的“第二曲线引擎”|创客匠人
大数据·人工智能·tcp/ip·机器学习·创始人ip·创客匠人·知识变现
QQ142207844910 小时前
没有这个数据库账户,难道受到了sql注入式攻击?
数据库·sql