不适用的场景

首先副本表无法实现下图的设计,这是因为clickhouse中的副本是一张实实在在的物理表,而你不能在一台clickhouse服务器上创建两个相同的表

我们可以尝试一下,三分片一副本,按照上图中的逻辑配置,如下配置:

<!-- 三分片1副本 -->
<bdp_3S_1R><shard><replica><host>bdp-dc-001</host><port>9300</port></replica><replica><host>bdp-dc-002</host><port>9300</port></replica></shard><shard><replica><host>bdp-dc-002</host><port>9300</port></replica><replica><host>bdp-dc-003</host><port>9300</port></replica></shard><shard><replica><host>bdp-dc-003</host><port>9300</port></replica><replica><host>bdp-dc-001</host><port>9300</port></replica></shard>
</bdp_3S_1R>

不出意外重启后创建表报错

翻译:DB异常:在集群bdp_3S_1R中有两个完全相同的ClickHouse实例bdp-dc-001:9300。(不一致的集群定义)(版本22.2.3.1)

对于多个分片多个副本只能如下图:下图为两个分片,一个副本,最少需要四台clickhouse节点!

原理

副本表ReplicatedMergeTree完全依赖zookeeper,表的创建和写入数据都依赖zookeeper做通知,而副本表之所以副本就是在于创建表ReplicatedMergeTree后面跟的zookeeper的路径,如果两张表zookeeper路径不一致,则完全不会副本,故副本表中zookeeper路径是关键。

clickhouse中采用先建临时分区文件,最终完成后才会设置为正式分区文件

注意:副本在同步的时候会有延迟,因为主分区表会先将分区数据保存好再发送请求到zookeeper,此时副本表才会监听到消息从而向主表拉取数据,故会存在副本数据延迟。

实操

假设我们在bdp-dc-001、bdp-dc-002 两台服务器上创建副本表,希望实现任意一台服务器上新增数据,另一台服务器都能查看到相同数据副本,此副本表的创建有以下四种方式:

1、原生创建-不指定集群名,不使用宏变量

# bdp-dc-001
CREATE TABLE test_bdp.replicated_sales_0
(`id` String,`price` Float64,`create_time` DateTime
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/0/replicated_sales_0', 'bdp-dc-001')
PARTITION BY toYYYYMM(create_time)
ORDER BY id# bdp-dc-002
CREATE TABLE test_bdp.replicated_sales_0
(`id` String,`price` Float64,`create_time` DateTime
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/0/replicated_sales_0', 'bdp-dc-002')
PARTITION BY toYYYYMM(create_time)
ORDER BY id# bdp-dc-001插入数据
insert into replicated_sales_0 values('1',1.0,'2020-01-01')

结果:

2、通过宏变量创建表

宏变量的使用可以让副本表在创建的时候轻松很多,先修改config.xml文件:

<!-- 001宏变量 -->
<macros><shard>01</shard><replica>bdp-dc-001</replica>
</macros><!-- 002宏变量 -->
<macros><shard>01</shard><replica>bdp-dc-002</replica>
</macros>

修改后记得重启,然后分别在两台服务器上创建表:可以看到关键变量通过{}变量替换

# bdp-dc-001
CREATE TABLE test_bdp.replicated_sales_1
(`id` String,`price` Float64,`create_time` DateTime
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/replicated_sales_1', '{replica}')
PARTITION BY toYYYYMM(create_time)
ORDER BY id# bdp-dc-002
CREATE TABLE test_bdp.replicated_sales_1
(`id` String,`price` Float64,`create_time` DateTime
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/replicated_sales_1', '{replica}')
PARTITION BY toYYYYMM(create_time)
ORDER BY id# bdp-dc-001插入数据
insert into replicated_sales_1 values('1',1.0,'2020-01-01')

结果一致

3、通过指定集群名,使用宏变量

我们每次去两台服务器上操作太麻烦,这时可以通过集群标签解决,更改bdp-dc-001、bdp-dc-002 两台服务器上的config.xml

<!-- 1分片1副本-本地表使用副本表 -->
<bdp_1S_1R><shard><replica><host>bdp-dc-001</host><port>9300</port></replica><replica><host>bdp-dc-002</host><port>9300</port></replica></shard>
</bdp_1S_1R>

保存后重启,在bdp-dc-001服务器上执行命令:

# bdp-dc-001
CREATE TABLE test_bdp.replicated_sales_2 ON CLUSTER bdp_1S_1R
(`id` String,`price` Float64,`create_time` DateTime
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/{shard}/replicated_sales_2', '{replica}')
PARTITION BY toYYYYMM(create_time)
ORDER BY id

此时去bdp-dc-002服务器上可以看到此表:

新增数据:

# bdp-dc-001插入数据
insert into replicated_sales_2 values('1',1.0,'2020-01-01')

查看结果:

4、通过指定集群名,使用配置文件默认配置创建

虽然上面已经方便很多,但是依然要在ReplicatedMergeTree引擎上指定命令,十分麻烦,官方给出了一种更简约的写法:

更改config.xml:在默认配置中使用宏变量

<!-- bdp-dc-001默认配置 -->
<default_replica_path>/clickhouse/tables/{shard}/{database}/{table}</default_replica_path>
<default_replica_name>{replica}</default_replica_name><!-- bdp-dc-002默认配置 -->
<default_replica_path>/clickhouse/tables/{shard}/{database}/{table}</default_replica_path>
<default_replica_name>{replica}</default_replica_name>

更改后重启服务后创建表:

# bdp-dc-001
CREATE TABLE test_bdp.replicated_sales_3 ON CLUSTER bdp_1S_1R
(`id` String,`price` Float64,`create_time` DateTime
)
ENGINE = ReplicatedMergeTree
PARTITION BY toYYYYMM(create_time)
ORDER BY id

此时去bdp-dc-002服务器上可以看到此表:

新增数据:

# bdp-dc-001插入数据
insert into replicated_sales_3 values('1',1.0,'2020-01-01')

查看结果:

on cluster语法

on cluster不仅可以创建副本表,分布式表,还可以创建数据库,还可以创建mergeTree表,可以说on cluster是为了让用户不用到处去别的服务其创建表了,而是通过<remote_servers> 集群标签自动在里面的服务器上创建表或数据库

例如:快捷构建数据库

CREATE DATABASE test_bdp ON CLUSTER bdp_3S_0R;

此时各个节点上都应该存在此库

副本表唯一性功能

然后我们验证一下,发现确实数据如果一致确实有去重功能

但是注意,此去重是一批次的去重,而不是根据每一条数据的去重

ClickHouse副本表ReplicatedMergeTree实操相关推荐

  1. mysql查询学生表的总人数,MySQL(表)-实操数据查询

    MySQL(表)-实操数据查询 MySQL(表)-实操:数据查询 练习1:成绩表筛选 创建成绩表(exam): CREATE TABLE exam( id INT PRIMARY KEY AUTO_I ...

  2. oracle表分区实操训练

    关于网上oracle表分区介绍的的文档有很多(不过大概看了下基本都是一个模板刻出来的),看完后自己实际操练了下,虽然以前的项目中也用过,但是自己并没有参与弄过,今天就在本机的库上爽了一把. 操练环境: ...

  3. roc曲线的意义_实用!Biomarker表达差异图、ROC曲线amp;四格表的实操手册

    解螺旋·蘑菇老师详细讲解biomarker研究在课题设计方面需要注意的一些共性问题,包括标本类型.样本收集以及病例资料三大部分. 本期课程则汇总了biomarker研究中的典型图表以形成"图 ...

  4. [小小明]Python正则表达式速查表与实操手册

    v0.3下载地址:https://download.csdn.net/download/as604049322/14504394 目录 文章目录 文档简介 作者简介 阅读建议 版权声明 Python ...

  5. MySQL 到 ClickHouse 实时数据同步实操分享

  6. 纯html的form表单实操练习

    练习一 先看一下最终效果 代码如下 <!DOCTYPE html> <html lang="en"> <head><meta charse ...

  7. MySQL 到 MongoDB 实时数据同步实操分享

    MySQL数据怎么实时同步到 MongoDB 实践分享系列 摘要:很多 DBA 同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据.表多.数据量大等情况就难以同 ...

  8. MySQL 到 PostgreSQL 实时数据同步实操分享

    摘要:很多 DBA 和开发同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据.表多.数据量大等情况就难以同步.最近了解到一款实时数据同步工具 Tapdata C ...

  9. MySQL 到 MySQL 实时数据同步实操分享

    摘要:很多 DBA 和开发同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据.表多.数据量大等情况就难以同步.最近了解到一款实时数据同步工具 Tapdata C ...

最新文章

  1. python2和python3 在windows下公用 导致python2 pip无法使用 报ssl的错误
  2. OpenLayers加载搜狗地图
  3. 计算机专业教学团队建设规划,计信学院教学团队建设方案
  4. 智力面试题汇总,有意思!
  5. pt-archiver 数据归档bug
  6. 《Windows Communication Foundation之旅》系列之二
  7. Jersey注解详解
  8. 一些关于Viewport与device-width的东西~(转)
  9. idea快捷操作_IDEA插件系列 快捷键神器!Key Promoter X
  10. PyQt5 环境搭建+配置+怎样运行生成的.py程序
  11. php向前截取字符串函数,ThinkPHP 模板substr的截取字符串函数详解
  12. 开源的商业意义_为开源项目提供资金具有良好的商业意义
  13. linux socket 模式,pythonsockets:如何在linux中启用混杂模式
  14. (转)SQL Server 数据类型映射
  15. matlab数字仿真实验,matlab数值仿真
  16. RFC1738——Uniform Resource Locators统一资源定位器 (URL)
  17. 用迅雷下载百度网盘的文件
  18. iphone手机配置qq邮箱服务器设置,在iPhone中如何设置qq邮箱
  19. js获取当前时间并转换为一定的格式
  20. stata学习笔记|异方差问题

热门文章

  1. 电脑计算机软件满了怎么办,电脑C盘太满怎么办?一招教你清理60G
  2. LWN: kernel中GCC plugin的未来命运!
  3. How to make a ipcamera
  4. 本地消息表(异步确保)
  5. Xilinx原语的用法
  6. 夜里走了很多路,醒来还是在床上
  7. 悠然一指,点“识”成金
  8. lad梯形图编程顺序_重新思考编程:再次使顺序图更酷
  9. FMODxUnity联动的声音设计
  10. 为什么服务器运行失败怎么回事,服务器运行失败_Win7旗舰版提示服务器运行失败怎么解决...