问题现象

使用JDBC接口向Clickhouse数据库中批量写入数据,数据表使用ReplicatedMergeTree引擎,写入完成后统计条数,发现比文件实际条数少了几条,多次测试均发现有此问题,且clickhouse日志中未发现错误信息。

  • clickhouse版本:21.9.2.1.
  • 写入数据量:>1000w条

原因排查

首先能想到的是数据问题,但是通过实验,发现同一批数据多次写入,每次丢失的条数还不一致,而且将数据表引擎切换为MergeTree后,数据一条没少,因此可以排除是数据本身的问题。然后在github上查找是否有人遇到过类似的问题,确实也有相关的issue:

  1. Data loss when using jdbc batch insert to ReplicatedMergeTree engine#5027
  2. Merge parts cause data loss #35704

通过评论区的只言片语中发现一点思路,那就是可能和数据去重有关,但是如何能验证呢?直到看到如下这篇文章:Insert Deduplication / Insert idempotency

总结一下要点:

  • Replicated*系列的表有一个插入去重的开关,且是默认开启状态,MergeTree引擎则是默认关闭;
  • 此去重是针对数据块级别的去重,即两个数据块如果有相同的记录,且顺序一致,则只会写入一次;这种设计是为了避免由于网络不稳定,导致同一批数据多次重复写入的问题;
  • 发生此现象在日志中的关键字是:Block with ID ... already exists locally as part ... ignoring it
  • 避免出现此现象的方法:在服务器配置中增加insert_deduplicate = 0的选项,关闭插入去重。

然后我在我自己的日志中检索了一下关键字,确实发现了如上所述的“证据”:

关闭插入去重的选型后,再次进行写入测试,发现数据不再丢失。

最后,是否真的有必要关闭这个选项呢?这个就要看你实际的应用场景了,其实仔细想想也许默认开启也是合理的,毕竟大部分情况数据重复录入是我们更不希望看到的。还有需要注意的就是这个开关只是控制块级别的数据去重的,即使开着,也无法保证写入的数据中一定不存在重复的记录,比如这些重复的记录出现在不同的数据块中的时候。

为什么写入ReplicatedMergeTree引擎表里的数据少了?相关推荐

  1. Docker下运行两个ClickHouse容器后 ReplicatedMergeTree引擎借助Zookeeper将数据无法同步的解决方案,提示错误为“DNS_ERROR”

    前置准备 目的 依照官网对ReplicatedMergeTree引擎的创建方式Docker服务下运行两个ClickHouse容器,分别修改CK的config.xml文件使其能顺利连通Zookeeper ...

  2. ClickHouse 副本协同原理:ReplicatedMergeTree引擎

    文章目录 ReplicatedMergeTree引擎 特点 数据结构 ZooKeeper内的节点结构 Entry日志对象的数据结构 副本协同的核心流程 INSERT MERGE MUTATION AL ...

  3. mysql 大量数据 更改索引_一文看懂ICP原理--MySQL用索引去表里取数据的一种优化...

    概述 今天主要介绍一下mysql的ICP特性,可能很多人都没听过,这里用一个实验来帮助大家加深一下理解. 一.Index_Condition_Pushdown Index Condition Push ...

  4. asp写入mysql拿shell_mysql误删数据快速恢复

    相信后端研发的同学在开发过程经常会遇到产品临时修改线上数据的需求,如果手法很稳那么很庆幸可以很快完成任务,很不幸某一天突然手一抖把表里的数据修改错误或者误删了,这个时候你会发现各种问题反馈接踵而来.如 ...

  5. ClickHouse源码阅读(0000 0110) —— 使用ReplicatedMergeTree引擎时的副本选择问题

    在使用ReplicatedMergeTree引擎和Distributed引擎的时候,对于同一张表,服务器上存在多个副本,在查询数据的时候,是如何在这些副本之间进行选择的呢?结合源码来试着分析一下... ...

  6. 将表里的数据批量生成INSERT语句的存储过程 增强版

    原文:将表里的数据批量生成INSERT语句的存储过程 增强版 将表里的数据批量生成INSERT语句的存储过程 增强版 有时候,我们需要将某个表里的数据全部或者根据查询条件导出来,迁移到另一个相同结构的 ...

  7. 将表里的数据批量生成INSERT语句的存储过程 继续增强版

    文章继续 桦仔兄的文章 将表里的数据批量生成INSERT语句的存储过程 增强版 继续增强... 本来打算将该内容回复于桦仔兄的文章的下面的,但是不知为何博客园就是不让提交!.... 所以在这里贴出来吧 ...

  8. 撕起来了!谁说数据少就不能用深度学习?这锅俺不背!

    作者 | Andrew L. Beam 编译 | AI100 撕逼大战,从某种角度,标志着一个产业的火热. 最近,大火的深度学习,也开始撕起来了. 前几日,有一篇帖子在"Simply Sta ...

  9. SAP HANA Cloud 学习教程之二: 如何往SAP BTP 上 HANA Cloud 实例的数据库表里插入数据

    这个教程的前一篇文章,SAP HANA Cloud 学习教程之一: 如何在 SAP BTP 上创建 SAP HANA Cloud 实例,我们已经成功在 SAP BTP HANA Cloud Servi ...

最新文章

  1. php动态引入js文件路径问题,JavaScript_动态加载外部css或js文件,原理解析:第一步:使用dom创 - phpStudy...
  2. 2020-10-25(极客pyc题目)
  3. 海华·垃圾分类AI挑战赛baseline分享,评测得分最高至0.85
  4. (转) 淘淘商城系列——CMS内容管理系统工程搭建
  5. Java Servlet request
  6. oracle中季末最后一天,oracle有关时间计算,得到季度第一天、最后一天
  7. 核心网upf作用_高性能5G核心网,动力从何而来? 核心网,是整个通信网络的大脑,是不可或缺的重要组成部分。 网络的管理控制、鉴权认证等关键功能,主要由核心网负责。核心网的... - 雪球...
  8. 如何正确上传一张图片?
  9. Visual Studio中实用工具VAssistX
  10. 华为USB线刷工具的使用
  11. 常用颜色及RGB配色表
  12. github 443问题
  13. Java实现eml文件的解析
  14. 工作站 linux系统安装win7,Dell T7500工作站 Win7/RHEL5.5双系统启动菜单修复
  15. centos7.1中安装calamari
  16. 手机令牌 dKey M6介绍
  17. 长安链---从零到一部署Chainmaker-2.0.0
  18. 李善友:中国可以活3年以上的企业不到10%
  19. 搭建pxe远程安装服务器
  20. 安装SecureCRT和SecureFX踩过得坑

热门文章

  1. 转录组+代谢组联合分析
  2. 解决浏览器下用Debug Flash Player 访问游戏崩溃问题(2012-2-19)
  3. Python基础篇1:输入直角三角形的两个直角边的长度a、b,求斜边c的长度
  4. 教你如何用91行代码实现一朵玫瑰花的绘制
  5. 做技术要有一颗平常心
  6. 基于matlab的QPSK系统仿真
  7. 基于Java小案例家庭收入支出记录
  8. 什么是PHP无限级分类
  9. 2023免费PPT网站12个
  10. Learn Python the hard way 2nd(Python 2.7) ex43 编写一个游戏