clickhouse中使用ReplicatedMergeTree表引擎数据去重问题

news2024/11/15 20:10:25

问题:使用ReplicatedMergeTree表引擎,该引擎逻辑上是不会对于主键相同的数据,进行去重合并操作。如果想要去重,可以使用ReplacingReplicatedMergeTree表引擎。然后使用ReplicatedMergeTree表引擎进行数据insert 插入数据,插入相同主键的数据,数据去重了。排查原因。

副本表引擎:ReplicatedMergeTree
副本去重引擎:ReplacingReplicatedMergeTree

insert_deduplicate  (官网没找到,可能已经不在用了。用下面两个参数实现)
replicated_deduplication_window
non_replicated_deduplication_window

在这里插入图片描述

在这里插入图片描述

问题:clickhouse使用ReplicatedMergeTree引擎,为什么插入数据进行去重了?

当使用ReplicatedMergeTree引擎时,如果观察到数据去重的效果,这可能是由于其他因素导致的,而不是引擎本身提供的功能。

问题:数据写入表引擎为ReplicatedMergeTree的时候,过程是什么样的,副本间的数据如何同步的?是先插入一个节点,之后再同步呢?还是再插入数据的时候,同时向两个节点进行插入呢?

数据写入过程

  • 本地写入:
    • 当客户端向ClickHouse集群发送写入请求时,该请求首先被发送到集群中的一个节点(可以称为“主节点”或“接收节点”)。
    • 在该节点上,数据首先被写入到本地的临时目录中。
  • 记录日志:
    • 写入操作完成后,主节点会向ZooKeeper(ZK)的/log目录发送一个LogEntry,记录这次写入操作的相关信息,包括新数据分区的名称、类型等。
    • 这个LogEntry是数据同步的关键,因为它包含了所有副本节点需要知道的信息,以便它们能够获取并应用这些变更。
  • 副本同步:
    • 集群中的其他副本节点(从节点)会监听ZooKeeper中/log目录的变化。
    • 一旦检测到新的LogEntry,从节点会按照ZooKeeper中记录的顺序拉取这些变更日志。
    • 从节点根据拉取到的LogEntry信息,从主节点或其他已同步的节点上下载相应的数据分区。
    • 下载完成后,从节点将这些数据分区写入到本地的存储中,从而完成数据的同步。

副本间的数据同步机制

  • 基于ZooKeeper的同步:

    • ReplicatedMergeTree引擎通过ZooKeeper来协调不同副本节点之间的数据同步。
    • ZooKeeper作为一个分布式协调服务,负责存储和分发数据同步的元数据(如LogEntry)
    • 通过监听ZooKeeper的变更通知,副本节点能够实时地感知到数据的变化,并进行相应的同步操作
  • 数据一致性的保证:

    • 在同步过程中,如果某个副本节点因为故障而无法及时同步数据,那么当该节点恢复后,它会从ZooKeeper中拉取错过的变更日志,并重新进行同步。
    • 这种方式确保了即使在节点故障的情况下,数据的一致性也能够得到保持。

插入操作的细节
写入操作通常是由单个节点接收并处理的,同步操作是异步进行的,因此,数据并不是在插入时同时向两个节点进行插入的。而是首先写入到一个节点(接收节点),然后由该节点负责将数据同步到其他副本节点。这种方式既保证了数据的可靠性,又提高了写入操作的性能。

问题: replicated_deduplication_window这个参数默认值为100,作用在哪个过程呢?

  1. 控制ZooKeeper中保留的hash值数量。数据写入会划分一个个数据块block,对数据块进行校验,即生成hash值即block_id。(数据顺序,数据行,数据大小等信息生成的hash值)。100表示记录100个block数据块的hash值
  2. 防止数据块重复插入数据。
    • 在数据同步过程中,如果副本节点检测到新写入的数据块与ZooKeeper中已记录的某个数据块的校验和相同,那么它将认为这是一个重复的数据块,并可能选择忽略该数据块的插入。
    • 通过设置replicated_deduplication_window,可以限制这种去重机制回溯检查的数据块数量,从而在一定程度上控制去重操作的性能和资源消耗。

问题: replicated_deduplication_window 参数,是记录数据块hash值个数存储在zookeeper中,用于数据块校验,副本节点同步数据时,拉取信息。那对于主节点而言呢,数据直接写入主节点,那么主节点根据什么进行数据块校验并确认数据块是否重复了呢?

replicated_deduplication_window参数主要是作用于副本同步数据过程中保证数据块block的唯一性,避免块级别的数据重复插入。对于主节点插入数据而言,参数无作用,主要根据merger合并操作实现数据块block级别的数据不重复。

需要注意的是,由于ClickHouse的ReplicatedMergeTree引擎并不保证严格的数据唯一性(特别是在高并发写入场景下),因此在需要严格保证数据唯一性的应用场景中,可能需要结合其他机制(如应用层面的唯一性约束、使用具有唯一性约束的表引擎等)来实现。

数据插入主节点过程

  1. 数据写入。首先数据写入到本地存储临时位置,并被切分为多个数据块block,数据块包含多条数据。
  2. 计算校验和。每个block计算hash值,用于后续数据同步数据块校验,以及数据完成性。
  3. 写入zookeeper。主节点将block校验值hash以及相关元数据(数据块名称,时间戳)记录到zookeeper指定目录,用于数据同步和数据块级别的去重。
  4. 主节点中数据合并去重。后台会定期进行数据合并merge操作。在合并过程中,如果存在具有相同排序键(ORDER BY子句指定的列)的数据块,并且这些数据块的内容也相同(通过校验和验证),则它们可能会被合并成一个数据块,从而间接实现了去重的效果。注意不是单条记录级别的。如果单条记录重复但分布在不同的数据块中,则可能不会被合并去重。
  5. 同步到副本节点。主节点在zookeeper记录后,开始进行副本同步。副本节点通过监听ZooKeeper中的变更来拉取新的数据块,并使用校验和来验证数据块的完整性和唯一性。

问题: ReplicatedMergeTree表引擎中,主节点(以及副本节点)在后台会定期执行数据合并(Merge)操作。这个实现数据去重。那这个引擎去重逻辑不就和ReplacingReplicatedMergeTree表引擎去重逻辑一样了吗?

  1. 去重级别:ReplicatedMergeTree的去重是基于数据块级别的,而ReplacingMergeTree的去重是基于数据行级别的。
  2. 触发时机:ReplicatedMergeTree的去重是在数据同步过程中通过校验和来避免的,而ReplacingMergeTree的去重是在数据合并期间触发的。
  3. 应用场景:ReplicatedMergeTree更适用于需要高可用性和容错性的场景,而ReplacingMergeTree则更适用于需要去除重复数据以节省空间的场景。

问题: placingReplicatedMergeTree和ReplicatedMergeTree表引擎都会在后台进行merge操作吗?区别?

  1. 两者都会在后台进行merge操作,但目的和去重机制不同。
  2. ReplicatedMergeTree侧重于数据的高可用性和容错性,通过多个副本节点来确保数据的持久性和一致性;而ReplacingMergeTree则侧重于解决数据重复问题,提供基于主键或排序键的数据去重功能。
  3. 在选择表引擎时,应根据具体的应用场景和需求来进行选择。如果需要高可用性和容错性,可以选择ReplicatedMergeTree;如果需要去除重复数据以节省空间,可以选择ReplacingMergeTree。

问题: clickhouse中,在插入MergeTree表时候,如何将数据分为多个block块?

数据插入是block的生成

  1. 数据写入
    • 当数据被插入MergeTree表时,数据首先以片段(fragment)的形式写入到磁盘的临时位置。
    • 这些片段在写入时并不是直接形成最终的block,而是作为合并(merge)过程的输入。
  2. 合并过程
    • ClickHouse的后台合并线程会定期选择一批片段进行合并操作。
    • 合并过程中,属于相同分区的多个片段会被合并成一个新的、更大的片段(也就是block)。
    • 合并后的block在物理存储上会更加紧凑,同时会重建索引,优化查询性能。

影响block划分的因素

  1. 数据插入频率和量。

    • 插入数据的频率和量会影响后台合并线程的工作量。频繁且大量的插入会导致更多的片段生成,进而触发更多的合并操作。
  2. MergeTree的配置

    • 通过调整MergeTree的配置参数,如merge_with_ttl_timeout、background_pool_size等,可以间接影响合并过程的执行频率和效果,从而影响block的划分。
    • 但需要注意的是,这些配置通常不是直接用来控制block的大小的,而是用来优化合并过程的性能和行为。
  3. 分区策略

    • 使用PARTITION BY子句可以为MergeTree表指定分区策略。不同的分区策略会影响数据的物理分布,但并不会直接影响block的划分。
    • 分区策略主要用于优化查询性能,减少查询时需要扫描的数据量。
  4. 数据特性

    • 数据的特性(如数据类型、分布情况等)也会对合并过程产生影响,进而影响block的划分。
    • 数据中存在大量的重复记录,那么在合并过程中可能会通过去重操作减少block的大小

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2067065.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

数据防泄密之源代码防泄密的七大要则!

在数字化时代,源代码的安全保护对企业至关重要。它是企业创新和竞争力的核心,一旦泄露,可能会带来不可估量的损失。因此,选择一款合适的源代码加密软件成为了企业信息安全的关键。SDC沙盒防泄密软件以其独特的技术优势和全面的功能…

Windows 11 时间显示 到秒

效果 第一步 win R --> regedit 打开注册表 第二步 打开该路径HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVersion\Explorer\Advanced 第三步 然后新建一个DWORD(32位)值。 第四步 文件命名为ShowSecondsInSystemClock,双…

Flask+LayUI开发手记(二):LayUI弹出层表单的校验

LayUI里面layer.open()弹出层是一个十分常用也十分强大的功能,比如我们经常是先把记录以数据表单datatable方式显示出来,然后增删改查的功能就利用layer.open调取另一个form表单页面来进行数据编辑并提交数据完成数据表的更新操作。 同样,Lay…

【Dash】feffery_antd_components 简单入门示例

一、简单了解 feffery_antd_components 简称 fac ,是一个基于 Ant Design 的 Dash 第三方组件,由Feffery 老师开源维护的 Python 网页开发组件库,它具有丰富的页面常用交互组件功能,使开发者可以使用纯Python的方式快速构建现代…

【工作记录】springboot中基于redis实现地理位置相关需求@20240822

背景 近期收到一个需求,有个事件管理系统,存储了用户上报上来的事件信息,其中包含了事件发生的经纬度,还有另外一个系统中保存了一系列的摄像头数据,也包含经纬度信息。 需求是这样的,用户点击某个事件的…

OpenSBI的PMP

概述 在RISC-V体系架构中,PMP是用于保护物理内存访问权限的机制。PMP机制允许为不同的物理内存区域指定访问权限(读、写、执行)。这种机制使得运行在RISC-V处理器上的软件只能访问被明确授权的物理地址空间,从而提高了系统的安全…

5.登录功能的开发

登录功能的开发 一、前端1.1首页跳转到登录页面1.2登录界面处理 二、后端2.1创建User实体类2.2创建UserDto类2.3创建UserServlet类 三、效果演示四、轻提示组件 一、前端 1.1首页跳转到登录页面 登录页面是一个单独的页面,我们需要从项目的首页跳转到登录页面。具…

OpenAI Whisper Cannot Import Numpy

题意:“OpenAI Whisper 无法导入 Numpy” 问题背景: I am trying to run the OpenAI Whisper model but running into the following error when trying to run my script: “我正在尝试运行 OpenAI Whisper 模型,但在运行脚本时遇到了以下…

【全网行为管理解决方案】上网行为系统有哪些?

全网行为管理系统是一种用于监控、管理和优化企业内部网络中所有用户活动及网络流量的技术解决方案。 这类系统可以帮助企业提高网络安全、优化网络性能,并确保网络使用符合公司政策及法规要求。以下是几种常用的上网行为管理系统: 一、安企神 特点&am…

防范小程序隐私合规风险,筑牢用户信任防线

随着国内APP软件生态的成熟,依托于头部APP的小程序逐渐成为零售、娱乐、出行等行业必选的获客渠道之一。较低的开发成本和成熟的用户营销功能,令小程序的数量在过去几年呈指数级增长。截止2023年,头部APP内集成的小程序总量已超千万。然而&am…

【业余玩儿AI】【文档问答】实操记录0822

电梯 前文回顾继续踩坑实录从头来过,docker部署Ollama我一定是被偷听了,大数据之神把我拉出泥潭时间回到白天,模型初窥时间回到开心的链接上Ollama那一刻 按捺住乱撞的小鹿,我去准备下文的剧情了 前文回顾 这里书接上文,上文说到: 目标是文档问答,先是本地部署了Marker,然后又…

计算机二级题--指针 章节

1.概念 1.函数名代表函数的入口地址 2.交换地址 1.*s,说明s是一个指针变量 2.s&k;说明让s指向k地址 3.所以*sk实际上与上面那句是等价的,因此m一直都没有什么变化依然是3 4.k是全局变量所以是5 3,7;改变s指向之后,又将值赋给了s指向的…

WS2812B硬件电路设计总结

一、WS2812b的电压是多少? WS2812B的电压通常在3.5到5.3V之间。 WS2812B是一种流行的可编程LED,也称为NeoPixel。它集成了RGB LED和控制电路,可以通过单个数据线进行串联连接。这种LED的输入电源电压范围为3.5到5.3V,这意味着它…

WPF中的XAML是如何转换成对象的?

起因 最近有遇到有小伙伴在实现TreeView不同层级使用不同数据模板时,遇到了一些问题。 经过查阅资料,我提供了两种解决方案。 第一种是使用TemplateSelector,这种方式可以根据ViewModel设置不同的数据模板。 第二种是根据数据动态创建数据…

中兴 随身WIFI 5产品参数

产品参数 无线参数无线速率2.4GHz, 300Mbps天线类型内置Wi-Fi天线软件功能手机App中兴ZTE Link APP Pro更多功能移动网络(4G/3G)接入、Wi-Fi接入、Wi-Fi加密认证、WebUI、PIN保护、FOTA升级等硬件规格接口Micro USB/标准SIM卡(2FF&#xff0…

软件测试 缺陷报告处理流程

系统软件 操作系统 软件缺陷 缺陷报告 当测试人员发现了一个缺陷,需要填写一份 缺陷报告 来记录这个缺陷,并通过这个缺陷报告告知开发人员所发生的问题————缺陷报告是测试人员和开发人员交流沟通的重要工具。 缺陷报告的组成 1、缺陷ID 缺陷编号&…

JuiceFS 在多云架构中加速大模型推理

在大模型的开发与应用中,数据预处理、模型开发、训练和推理构成四个关键环节。本文将重点探讨推理环节。在之前的博客中,社区用户 BentoML 和贝壳的案例提到了使用 JuiceFS 社区版来提高模型加载的效率。本文将结合我们的实际经验,详细介绍企…

Linux——网络(2)

一、通信 --- 不同主机上进程间的通信 1、IP和端口号 IP:标识网络中的一台主机 本质上 32位的整型数据 端口号: 标识某个进程 本质上 16位的整型数据 2、udp和tcp udp的特点: 1.无连接 2.不可靠 tcp的特点: 1.面…

【赵渝强老师】执行Oracle的冷备份与冷恢复

冷备份与冷恢复是指发生在数据库已经正常关闭的情况下进行的备份和恢复。由于此时数据库已经关闭,通过冷备份可以将数据库的关键性文件拷贝到另外存储位置。冷备份因为只是拷贝文件,因此备份的速度非常快。在执行恢复时,只需将文件再拷贝回去…

命令模式:如何利用命令模式实现手游后端架构?

成长路上不孤单😊【14后boy,C爱好者,持续分享所学,如有需要欢迎收藏转发😊😊😊😊😊😊😊!!!接上篇博文&#xf…