源码分析 | ClickHouse和他的朋友们(13)ReplicatedMergeTree表引擎及同步机制

ClickHouse实战处理(一):MergeTree系列引擎 6、partition.dat与minmax_[Column].idx:如果指定了分区键,则会额外生成partition.dat与minmax索引文件,它们均使用二进制格式存储。data.bin:数据文件,使用压缩格式存储,默认为LZ4压缩格式,用于存储某一列的数据。MergeTree在写入一批数据时,数据总会以数据片段的形式写入磁盘,且数据片段在磁盘上不可修改。这里我们介绍下MergeTree引擎表对应到磁盘的数据目录,Clikchouse新版本与之前版本对比,数据对应的磁盘目录略有不同。 阅读详情

本文首发于 2020-09-15 20:15:14

《ClickHouse和他的朋友们》系列文章转载自圈内好友 BohuTANG 的博客,原文链接:
https://bohutang.me/2020/09/13/clickhouse-and-friends-replicated-merge-tree/
以下为正文。

在 MySQL 里,为了保证高可用以及数据安全性会采取主从模式,数据通过 binlog 来进行同步。

在 ClickHouse 里,我们可以使用 ReplicatedMergeTree 引擎,数据同步通过 zookeeper 完成。

本文先从搭建一个多 replica 集群开始,然后一窥底层的机制,简单吃两口。

1. 集群搭建

搭建一个 2 replica 测试集群,由于条件有限,这里在同一台物理机上起 clickhouse-server(2个 replica) + zookeeper(1个),为了避免端口冲突,两个 replica 端口会有所不同。

1.1 zookeeper

docker run  -p 2181:2181 --name some-zookeeper --restart always -d zookeeper

1.2 replica集群

replica-1 config.xml:

<zookeeper>
   <node index="1">
      <host>172.17.0.2</host>
      <port>2181</port>
   </node>
</zookeeper>

<remote_servers>
   <mycluster_1>
      <shard_1>
         <internal_replication>true</internal_replication>
         <replica>
            <host>s1</host>
            <port>9000</port>
         </replica>
         <replica>
            <host>s2</host>
            <port>9001</port>
         </replica>
      </shard_1>
   </mycluster_1>
</remote_servers>

<macros>
   <cluster>mycluster_1</cluster>
   <shard>1</shard>
   <replica>s1</replica>
</macros>


<tcp_port>9101</tcp_port>
<interserver_http_port>9009</interserver_http_port>
<path>/cluster/d1/datas/</path>

replica-2 config.xml:

<zookeeper>
   <node index="1">
      <host>172.17.0.2</host>
      <port>2181</port>
   </node>
</zookeeper>

<remote_servers>
   <mycluster_1>
      <shard_1>
         <internal_replication>true</internal_replication>
         <replica>
            <host>s1</host>
            <port>9000</port>
         </replica>
         <replica>
            <host>s2</host>
            <port>9001</port>
         </replica>
      </shard_1>
   </mycluster_1>
</remote_servers>

<macros>
   <cluster>mycluster_1</cluster>
   <shard>1</shard>
   <replica>s2</replica>
</macros>

<tcp_port>9102</tcp_port>
<interserver_http_port>9010</interserver_http_port>
<path>/cluster/d2/datas/</path>

1.3 创建测试表

CREATE TABLE default.rtest1 ON CLUSTER 'mycluster_1'
(
    `id` Int64,
    `p` Int16
)
ENGINE = ReplicatedMergeTree('/clickhouse/tables/replicated/test', '{replica}')
PARTITION BY p
ORDER BY id

1.4 查看 zookeeper

docker exec -it some-zookeeper bash
./bin/zkCli.sh

[zk: localhost:2181(CONNECTED) 17] ls /clickhouse/tables/replicated/test/replicas
[s1, s2]

两个 replica 都已经注册到 zookeeper。

2. 同步原理

如果在 replica-1 上执行了一条写入:

replica-1> INSERT INTO rtest VALUES(33,33);

数据是如何同步到 replica-2 的呢?

s1.  replica-1> StorageReplicatedMergeTree::write --> ReplicatedMergeTreeBlockOutputStream::write(const Block & block)
s2.  replica-1> storage.writer.writeTempPart,写入本地磁盘
s3.  replica-1> ReplicatedMergeTreeBlockOutputStream::commitPart
s4.  replica-1> StorageReplicatedMergeTree::getCommitPartOp,提交LogEntry到zookeeper,信息包括:
    ReplicatedMergeTreeLogEntry {
     type: GET_PART,
     source_replica: replica-1,
     new_part_name: part->name,
     new_part_type: part->getType
    }
s5.  replica-1> zkutil::makeCreateRequest(zookeeper_path + "/log/log-0000000022"),更新log_pointer到zookeeper

s6.  replica-2> StorageReplicatedMergeTree::queueUpdatingTask(),定时pull任务
s7.  replica-2> ReplicatedMergeTreeQueue::pullLogsToQueue ,拉取
s8.  replica-2> zookeeper->get(replica_path + "/log_pointer") ,向zookeeper获取当前replica已经同步的位点
s9.  replica-2> zookeeper->getChildrenWatch(zookeeper_path + "/log") ,向zookeeper获取所有的LogEntry信息
s10. replica-2> 根据同步位点log_pointer从所有LogEntry中筛选需要同步的LogEntry,写到queue
s11. replica-2> StorageReplicatedMergeTree::queueTask,消费queue任务
s12. replica-2> StorageReplicatedMergeTree::executeLogEntry(LogEntry & entry),根据LogEntry type执行消费
s13. replica-2> StorageReplicatedMergeTree::executeFetch(LogEntry & entry) 
s14. replica-2> StorageReplicatedMergeTree::fetchPart,从replica-1的interserver_http_port下载part目录数据
s15. replica-2> MergeTreeData::renameTempPartAndReplace,把文件写入本地并更新内存meta信息
s16. replica-2> 数据同步完成

也可以进入 zookeeper docker 内部直接查看某个 LogEntry:

[zk: localhost:2181(CONNECTED) 85] get /clickhouse/tables/replicated/test/log/log-0000000022
format version: 4
create_time: 2020-09-13 16:39:05
source replica: s1
block_id: 33_2673203974107464807_7670041793554220344
get
33_2_2_0

3. 总结

本文以写入为例,从底层分析了 ClickHouse ReplicatedMergeTree 的工作原理,逻辑并不复杂。

不同 replica 的数据同步需要 zookeeper(目前社区有人在做etcd的集成 pr#10376)做元数据协调,是一个订阅/消费模型,涉及具体数据目录还需要去相应的 replica 通过 interserver_http_port 端口进行下载。

replica 的同步都是以文件目录为单位,这样就带来一个好处:我们可以轻松实现 ClickHouse 的存储计算分离,多个 clickhouse-server 可以同时挂载同一份数据进行计算,而且这些 server 每个节点都是可写,虎哥已经实现了一个可以 work 的原型,详情请参考下篇 <存储计算分离方案与实现>。

4. 参考


欢迎关注我的微信公众号【数据库内核】:分享主流开源数据库和存储引擎相关技术。

标题网址
GitHubhttps://dbkernel.github.io
知乎https://www.zhihu.com/people/…
思否(SegmentFault)https://segmentfault.com/u/db…
掘金https://juejin.im/user/5e9d3e…
开源中国(oschina)https://my.oschina.net/dbkernel
博客园(cnblogs)https://www.cnblogs.com/dbkernel
clickhouse中使用ReplicatedMergeTree表引擎数据去重问题 然后使用ReplicatedMergeTree表引擎进行数据insert 插入数据,插入相同主键的数据,数据去重了。需要注意的是,由于ClickHouse的ReplicatedMergeTree引擎并不保证严格的数据唯一性(特别是在高并发写入场景下),因此在需要严格保证数据唯一性的应用场景中,可能需要结合其他机制(如应用层面的唯一性约束、使用具有唯一性约束的表引擎等)来实现。:数据写入表引擎为ReplicatedMergeTree的时候,过程是什么样的,副本间的数据如何同步的?对于主节点插入数据而言, 阅读详情

相关推荐

Clickhouse系列三:表引擎副本机制

Clickhouse通过表数据的冗余存储,来达到防止数据丢失的问题。这也就是常说的数据副本机制,但是副本数据和真实数据都存储了,服务器的容量就不够了,这时我们就需要实现数据的水平切分,来解决单个服务器容量不够的问题。这就是常说的数据分片机制数据副本机制ClickHouse依靠ReplicatedMergeTree引擎族与ZooKeeper实现了复制表机制, 成为其高可用的基础.ReplicatedMergeTree引擎族包含如下的表种类目前阶段只有上面这些表种类支持副本机制。

qq_35667076的博客 2210

ClickHouse 副本协同原理:ReplicatedMergeTree引擎

文章目录ReplicatedMergeTree引擎特点数据结构ZooKeeper内的节点结构Entry日志对象的数据结构副本协同的核心流程INSERTMERGEMUTATIONALTER ReplicatedMergeTree引擎 ReplicatedMergeTree是MergeTree的派生引擎,它在MergeTree的基础上加入了分布式协同的能力,只有使用了ReplicatedMergeTree复制表系列引擎,才能应用副本的能力。或者用一种更为直接的方式理解,即使用ReplicatedMergeTr

凌桓丶的博客 5754

ClickHouse副本表ReplicatedMergeTree实操

ClickHouse副本表ReplicatedMergeTree实操

探索大数据世界 - 深入解析数据存储、分布式计算与人工智能 3664

Clickhouse之ReplicatedMergeTree原理详解

ReplicatedMergeTree作为Clickhouse(下文简称CK)复制表系列的基础表引擎,包涵了CK数据副本最核心的逻辑,本文详细介绍了ReplicatedMergeTree的核心原理,以便于更好地去使用ReplicatedMergeTree系列的表引擎。 在ReplicatedMergeTree的核心逻辑中,大量使用了ZooKeeper分布式协同的能力,来实现多个ReplicatedMergeTree副本实例之间的协同,包括主副本选举、副本状态感知、操作日志分...

u011611051的博客 1万+

学习海康VisionMaster之路径提取

这里也需要注意下,这里有两种模式,在运行参数的这一栏有“等距离取点”和“查找边缘点”两个检测模式,说实话,那个等距离取点我也没搞懂有什么用,我拿了OK和NG的图片去对比,好像没有什么实际用处,无法检测(不知道有没有小伙伴知道这个模式到底是怎么用的!2:应用场景:典型的场景是点胶检测,判断胶路质量,有没有断胶等,一开始这胶路检测,真的是难倒我了,特别是不规则图像如何检测,学习了这个算子后,思路一下子打开了,原来还可以这么搞!四:实测:上述设定好参数,开始实际测量看看效果,不同的检测模式下的检测效果。

yuhouxiyang的专栏 1487

WebRTC音频传输实战:从采集到播放的完整链路解析(附RTP包处理细节)

本文深入解析了WebRTC音频传输的完整链路,从麦克风采集、音频处理与编码,到RTP打包、网络发送,再到接收端的NetEQ抗抖动处理与最终播放。文章以Linux PulseAudio为例,详细剖析了线程模型、缓冲区管理及RTP包处理等关键细节,旨在帮助开发者优化实时音频应用的延迟、卡顿与回声问题。

tea88的博客 853

【ClickHouse源码】ReplicatedMergeTree之数据同步流程

ReplicatedMergeTree之数据同步流程 在创建了ReplicatedMergeTree后,会有几个taskHolder在后台去监听zk的log并向queue添加,监听mutations的变化并触发mutation相关操作。这里先不对mutation相关操作做分析,主要先说明一下正常的数据插入和正常的数据复制流程。 首先了解一个taskHolder queue_task_handle:...

一只努力的微服务 3648

ANSYS MAXWELL内置式永磁同步电机(IPMSM)转矩最大时输入电流相位的确定

1.在转子转速为零时看一个周期内的转矩变化

qq_41752507的博客 6517

ClickHouse实战--同步mysql(二)源码解析

六 、源码分析 6.1 概述 在最新源码 (v20.13.1.1) 中,ClickHouse 官方对 DatabaseMaterializeMySQL 引擎的相关源码进行了重构,并适配了 GTID 同步模式。ClickHouse 整个项目的入口 main 函数在 /ClickHouse/programs/main.cpp 文件中,主程序会根据接收指令将任务分发到 ClickHouse/programs 目录下的子程序中处理。本次分析主要关注 Server 端 MaterializeMySQL 引擎的工作流.

写轮眼之大数据 633

wsl2内核版本和模块版本不一致解决方法

** /lib/modules/…build: No such file or directory错误解决办法这篇文章历时1个月整,从4月5日一直到5月5日,这一问题才得以解决。

m0_60634555的博客 5104

zabbix监控深信服下一代防火墙配置

深信服下一代防火墙v8.0管理界面,zabbix,SNMP

weixin_43996471的博客 6875

clickhouse系列学习笔记——(四)引擎详解--->(1)Log系列引擎

四 引擎详解 表引擎是ClickHouse设计实现中的一大特色 ,数据表拥有何种特性、数据以何 种形式被存储以及如何被加载。ClickHouse拥有非常庞大的表引擎体 系,截至本书完成时,其共拥有合并树、外部存储、内存、文件、接口 和其他6大类20多种表引擎。而在这众多的表引擎中,又属合并树 (MergeTree)表引擎及其家族系列(*MergeTree)最为强大,在生产 环境的绝大部分场景中,都会使用此系列的表引擎。因为只有合并树系 列的表引擎才支持主键索引、数据分区、数据副本和数据采样这些特 性,同时也

niuyan666的博客 401

SPME/IP PPT详解

什么是中间件?它是操作系统与应用程序之间的一块代码,它对于应用程序提供了一些标准接口,屏蔽了应用程序与底层的一些交互,上层应用程序只要和中间件进行交互就可以了,这样就可以达到一个解耦的目的。SOMEIP其实是一个中间件,它是操作系统与应用程序之间的一段代码,它是可以运行在TCP/IP之上的,可以在很多平台上使用,可以适配较多的操作系统,可以提供很多接口。经过序列化之后,在网络上传输的是一些101010这样的二进制流。SOME/IP可以承接应用层的一些数据,进行打包放到传输层。

usstmiracle的博客 620

ClickHouse表引擎(二)之Log系列

Log引擎是为了需要写入许多小数据量(少于一百万行)的表的场景而开发的。面对的数据查询场景也比较简单,并且往往是一次写入多次查询,则日志家族系列的表引擎将会是一种不错的选择。 共同点 数据存储在磁盘上,如果是linux系统使用的是直接IO。 写入时将数据追加在文件末尾。 不支持突变操作也就是不支持update和delete操作。 不支持索引。 这意味着 SELECT 在范围查询时效率不高。 非原子地写入数据。 如果某些事情破坏了写操作,例如服务器的异常关闭,你将会得到一张包含了损坏数据的表。 差异化 Log

style_boy的博客 862

ABAP Cloud 里的高性能日志:CL_BALI_LOG、XCO_CP_BAL 与 AML 的性能对比与选型指南

ABAP日志框架性能对比与选型建议 本文对比了ABAP Cloud中三种主流日志框架的性能表现与适用场景: 标准BALI:适合明确需要保存日志的场景,保存路径短,性能较好 XCO_CP_BAL:API更现代但性能较低,适合需要即时可见性的场景 AML:开源框架,擅长消息缓冲,适合批量处理时暂存消息 测试结果表明: 纯记录不落库时AML最快 需要保存时BALI性能最优 second connection不提升性能但能确保日志留存 选型建议: 高频批处理优先AML+BALI组合 故障诊断考虑XCO的即时可见性

2007 年 ~ 2025 年,深耕 SAP 技术 18 年 215

使用CloudCompare和CANUPO进行点云分类的编程指南

在本文中,我们将介绍如何使用CloudCompare和CANUPO库进行点云分类的编程。CloudCompare是一款功能强大的开源点云处理软件,而CANUPO是一个用于点云分类和分割的C++库。这只是一个简单的点云分类示例,CANUPO库还提供了其他更高级的功能和算法,以满足各种点云分类需求。该函数接受点云数据、地面点掩码和非地面点掩码作为输入,并将分类结果存储在这两个掩码向量中。完成安装后,我们可以开始编写点云分类的代码。最后,我们遍历点云数据,并根据地面点和非地面点的掩码将结果打印出来。

ByteWhisper的博客 1060

clickhouse 副本ReplicateMergeTree实现原理及导致的数据一致性问题

ReplicateMergeTree副本表原理 insert 副本同步 update/delete操作副本同步 副本表数据一致性问题 副本表数据一致性

lixia0417mul2的博客 2340

精雕软件(JDpaint) 5.5 绿色版

精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版精雕软件(JDpaint) 5.5 绿色版

ClickHouse源码简析

ClickHouse源码简析

driftingman的专栏 1787

VB摄像头监控

该VB模块可对摄像头捕获的画面进行录像等,可在创建的窗口进行控制

android 蓝牙通讯demo

android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。

ClickHouse之ReplicatedMergeTree引擎介绍

clickhouse高可用副本集群搭建

bboy66的博客 4840

jdk-8u144-linux-x64.tar.gz.

该资源为搭建Linux系统Java环境用,资源的后缀为tar.gz格式的压缩包

ClickHouse存储引擎初识

本文介绍了ClickHouse中的几种主要存储引擎:MergeTree、ReplicatedMergeTree、SummingMergeTree、AggregatingMergeTree和Distributed,以及它们的工作原理、使用场景和优缺点。了解这些存储引擎有助于您根据实际需求选择合适的引擎,从而充分利用ClickHouse的强大功能。

weixin_59801183的博客 1298

ClickHouse ReplicatedMergeTree家族引擎

ClickHouse 中的所有MergeTree家族引擎前面加上Replicated就成了支持副本的合并树引擎. 本文以ReplicatedMergeTree引擎作为演示,其他副本合并树引擎是一个道理. ReplicatedMergeTree如果有两个副本的话,相当于分布在两台clickhosue节点中的两个表,但是这个两个表具有协调功能,无论是哪个表执行insert或者alter操作,都会同步到另外一张表,这样子很好理解,副本就是相互同步数据的表. 复制合并树只有进行INSERT或者ALTER或者TRUN

qq_28603127的博客 1万+

ClickHouse分布式高可用实战:ReplicatedMergeTree引擎深度解析与代码实践

ReplicatedMergeTree是ClickHouse实现高可用架构的基石。通过本文的实战演示,你已经掌握了:✅ 多副本表创建✅ 数据自动复制验证✅ 集群状态监控官方文档直达(关注我,获取更多大数据实战技巧!技术标签#大数据#分布式系统#数据复制#高可用架构。

weixin_44313745的博客 984

Clickhouse学习之路(五)-- 集群方案研究

方案一:MergeTree + Distributed 架构图 架构解析: MergeTree + Distributed的分布式架构方案,利用的是Distributed表的特性+MergeTree表的特性,分布式表不存储数据,数据来自本地表,将分布式表的数据分为3个shard,每台节点存储三分之一的数据,用户查询的时候是从分布式表所在的节点聚合从Ck1,CK2,CK3的查询结果,然后返回用户,写入数据可以写入分布式表,当然这样的写入方式问题很多,一般是禁止写入分布式表的,那么选择写入本地表的化,需要将数

BIackMamba的博客 2378

大数据-141 ClickHouse 副本实战 | ReplicatedMergeTree + ZooKeeper 从 0–1:创建、选举、日志复制、排障

ClickHouse 副本全链路:ZK/Keeper 准备、macros 宏配置、集群 ON CLUSTER 一致建表、写入去重与复制机制、system.* 视图健康检查、insert_quorum 一致性、Distributed 跨分片查询;提供性能与延迟观测项、replication_queue 积压定位、典型报错处理(Not connected、Replica already exists、Too many parts)与标准回滚步骤。含可直接执行的 SQL 与配置片段。

谢谢你的喜欢 我们一起无限进步 1万+

ClickHouse高可用集群分片-副本实操(四)

数据分片-允许多台机器/节点同并行执行查询,实现了分布式并行计算分片间的数据是不同的,不同的服务器存储同一张表的不同部分,作用是为了水平切分表,缓解单节点的压力。

点滴记忆,分享成长之路 2810

ClickHouse-ReplicatedMergeTree主备同步

了解到,分布式DDL功能对Zookeeper的依赖情况还是比较轻量级的,接下来介绍的ReplicatedMergeTree表引擎对Zookeeper的依赖可以说是所有表操作全方面的依赖,真实集群中大量的ReplicatedMergeTree表会对Zookeeper造成非常大的请求压力,需要用户关注Zookeeper的运维。 ReplicatedMergeTree表引擎实现的主备同步和传统主备同步有很大的差异:1)它不是一个(抢主,主节点执写入更新,备节点同步follow)的模型,ClickHouse的主节

qq_42016966的博客 6817
上一篇: 源码分析 | ClickHouse和他的朋友们(12)神奇的物化视图(Materialized View)与原理
下一篇: 源码分析 | ClickHouse和他的朋友们(14)存储计算分离方案与实现
dbkernel
博客等级 码龄4年 60粉丝 42原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值