详解 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;
相关推荐
Ai 编码助手8 分钟前
MySQL中distinct与group by之间的性能进行比较
数据库·mysql
Json_1817901448022 分钟前
An In-depth Look into the 1688 Product Details Data API Interface
大数据·json
陈燚_重生之又为程序员23 分钟前
基于梧桐数据库的实时数据分析解决方案
数据库·数据挖掘·数据分析
caridle25 分钟前
教程:使用 InterBase Express 访问数据库(五):TIBTransaction
java·数据库·express
白云如幻26 分钟前
MySQL排序查询
数据库·mysql
萧鼎28 分钟前
Python并发编程库:Asyncio的异步编程实战
开发语言·数据库·python·异步
^velpro^30 分钟前
数据库连接池的创建
java·开发语言·数据库
荒川之神35 分钟前
ORACLE _11G_R2_ASM 常用命令
数据库·oracle
IT培训中心-竺老师41 分钟前
Oracle 23AI创建示例库
数据库·oracle
小白学大数据1 小时前
JavaScript重定向对网络爬虫的影响及处理
开发语言·javascript·数据库·爬虫