数据迁移实践 | MySQL到ClickHouse,HTAP黄金搭档

news2024/11/19 18:17:53

MySQL是世界上最流行的开源数据库,也是OLTP界的顶流,但是对于OLAP分析型业务场景的能力太弱。ClickHouse是最近几年数仓OLAP分析查询领域的黑马,当红炸子鸡,有意思的是天然兼容MySQL语法。所以很多用户喜欢OLTP放MySQL,OLAP放ClickHouse,中间加一层数据同步,称之为HTAP黄金搭档

我司的DBMotion是在线数据迁移SaaS服务,也可以docker run一键式本地化运行。对于MySQL迁移同步到ClickHouse,提供了结构迁移/全量初始化/增量同步/数据校验功能支持,并且为实时数据同步提供了精准一致性查询视图。里面一些功能点的设计,可以分享给大家,供参考。

全量初始化性能

ClickHouse全量初始化,往往是最耗时的,一般迁移工具都会采用多线程并发模式去拉取源端数据,然后并发load到目标端,多线程可以是行级并发或表级并发,DBMotion是采用的行级并发,因为如果有一些超大表,表级并发会受限于这些大表,我们处理的流程大致如下:

  • dbmotion核心模块会设定迁移任务的工作线程数,表数据切片行数split-rows,fetch批次大小等配置

  • 每张表,根据总行数,split-rows估算出切片数量,根据PK/唯一键或时间/数据字段,计算每个分片的where边界,最终会获得一张切片list

  • 将切片均匀分发给多线程去消费,每个线程负责这个切片的数据拉取和数据装载,直到所有切片都完成

一般我们切片大小设置为50000行,如果是超小表不足一个切片,这个线程会立刻完成,再处理其他切片,经过实际测试,每个线程的处理工作是比较均匀的,吞吐量基本可以打满主机网卡(生产注意流控)。

 

全量断点续传

只说增量需要断点续传,现在全量也要断点续传?其实这个需求是非常合理的,比如说一张表有5千万行,我初始化了4995万行的时候,机器网络抖了下,失败了,就差这5万行了,难道重新来一遍?

写过SQL的知道,游标fetch数据时,你是不知道他具体到了表的哪一行的,重新查询是没法从断点开始的。不过得益于全量切片的并发设计,我们保留了每一个切片的元数据,对于切片数据同步的行数,状态做了异步刷新。当一个迁移任务重新运行时,可以只处理失败的切片。由于切片粒度一般是50000行以内,少量失败切片处理起来会非常快,这个基本类似故障的断点续接了。

ClickHouse增量同步

MySQL增量数据的获取都是基于binlog event解析,根据他的前印象后印象,拼凑同步SQL,中间引入并发线程消费,控制好进度位点,DDL对齐,操作幂等,基本不会有什么问题。但是这套方式换到ClickHouse就很成问题,因为ClickHouse的常用存储引擎是LSM结构的MergeTree,而且是列存储,适合大批量插入,不适合update和delete。

你看他的update语句都是alter xxx update xxx = xxx,这种反常态的语法,骨子里就是要你别更新,别删除。而MySQL的增量数据,就是离散的I/U/D,没法控制的。如果硬套上ClickHouse的DML语法,同步性能是暴差的,也会引起很多无谓的part合并,所以我们是结合ClickHouse的ReplacingMergeTree解决了这个问题

  • binlog解析的所有数据,无论是u/d/i,都拼凑成insert语句,新增版本和event类型两个隐含字段,所有的DML都是以插入方式到达CK,适当的积累下批量,性能指标会很不错

  • 同一行数据,会因为更新删除而产生多行数据,ReplacingMergeTree的分区合并会自动滤重,保留最新版本的数据,而这个版本号是我们按照事务操作的顺序投放进来的,合乎逻辑

  • D类型的数据,DBMotion会有后台任务异步批量处理

  • 如果要使用partition分区,需要注意一点,ReplacingMergeTree只能保证一个分区内的合并去重,多分区需要保证分区维度和主键维度的一致性,否则最终结果会是重复的

查询一致性

对于上述经过增量同步的表,如果业务需要使用,还是得写段SQL的,重复数据,取其中版本最大的一条,并过滤掉Delete类型的数据。如果每张表你都要套这么大的SQL,会很麻烦,在此DBMotion会自动为同步表提供了查询视图,相信ClickHouse强悍的计算能力,处理这种分析函数,是so easy的。

最快的ClickHouse数据装载姿势

MySQL到CK,只是分析数据的冰山一角,很多页面、事件、日志、用户行为数据才是最大量的。要知道CK的主业,是根据分析师的模型跑大SQL,数据装载入库是迫不得已的副业。CK为这个副业也是绞尽脑汁,提供了很多方法。最有意思的当属clickhouse-local,官方文档对这个工具的解释是你无需安装启动clickhouse server端,仅仅用clickhouse-local就可以解析处理本地文件,它和clickhouse server有相同的核心。

我们可以看看下面的示例:

echo  "1\t2023-4-21\n2\t2024-12-04\n3\t2025-9-07"| \clickhouse-local -S "id Int64,thetime String" -N "cktable" \-q "CREATE TABLE cklocal (id Int64,thetime Date) ENGINE = MergeTree() \PARTITION BY toYYYYMM(thetime) ORDER BY id;\INSERT INTO TABLE cklocal SELECT id,thetime FROM cktable;" --path /mydir

然后看看/mydir下出现了什么:​​​​​​​

# ls -l /mydirtotal 0drwxr-xr-x. 4 root root  34 Apr 20 14:52 datadrwxr-xr-x. 4 root root 150 Apr 20 14:52 metadatadrwxr-xr-x. 3 root root  17 Apr 20 14:52 storedrwxr-xr-x. 2 root root   6 Apr 20 14:52 user_defined

clickhouse-local可以直接将输入数据生成clickhouse server可以识别的数据文件,而这些数据文件挂载到server端,是直接能用的。

按照这个思路,我们可以将clickhouse-local分发给应用端,由他们事先生成好数据文件。这样算力消耗就分散在众多的业务机器,而不是服务端。后面再将这些文件,按照一定的规则上传copy到server端并挂载,从而实现了海量数据的快速装载。

从小编的使用经验看,clickhouse的内功是相当不错的,丰富的存储引擎,高压缩列存,数据预处理,强大的功能函数,爆表的性能等等,但外功就不是一般的差劲。运维管理一个多副本,分布式集群还是要花相当的功夫的,数据扩容伸缩也很原始。如果这些短板一直存在,后续被rockstar反超应该不会太久。最后来句硬广:上squids.cn,品全网ZUI低价数据库云服务,也包含ClickHouse哦!

更多内容请关注“云原生数据库”

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

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

相关文章

2023年湖北安全员ABC证报考条件都有哪些?甘建二告诉你

一、安全员ABC证是什么? 安全员A、B、C证属于建筑三类人员证书。建筑三类人员:是指建筑施工企业主要负责人、项目负责人和专职安全生产管理人员。 建筑企业的法人代表,必须取得A证才能担任法人代表 建造师必须取得B证才能担任项目负责人 …

FreeRTOS 信号量(一)

文章目录 一、信号量简介二、二值信号量1. 二值信号量简介2. 创建二值信号量①函数 vSemaphoreCreateBinary ()②函数 xSemaphoreCreateBinary()③函数 xSemaphoreCreateBinaryStatic() 3. 二值信号量创建过程分析4. 释放信号量①函数 xSemaphoreGive()②函数 xSemaphoreGiveFr…

UFD203A101 3BHE019361R0101电 工理论、电子技术、信息处理、控制理论、电力系统分析

UFD203A101 3BHE019361R0101电 工理论、电子技术、信息处理、控制理论、电力系统分析 作为电气工程及其自动化专业的大学生都会关心电气工程及其自动化就业方向是什么?电气工程专业就业方向怎样?自动化专业就业方向怎样? 对于很多本专业的在校…

实验06:哈夫曼编码

1.实验目的: 理解贪心算法的思想,掌握哈夫曼编码的技术和图像编解码算法的基本。 2.实验内容: 统计图像像素灰度值的分布特性,利用哈夫曼编码构造码表,实现对图像的编码和解码。 3.实验要求: 首先完成…

《JavaEE》InputStream, OutputStream 的用法

目录 File类 路径 绝对路径 相对路径 InputStream和OutputStream的使用 InputStream基本用法 OutputStream基本用法 功能实现 我们先来尝试着使用一些File类完成一些基本操作 我们查看这个文本是否存在 如果不存在我们创建一个新的文本出来 在当前文件夹中创建一个新…

MATLAB函数封装1:生成QT可以调用的.dll动态链接库

在进行相关算法的开发和设计过程中,MATLAB具有特别的优势,尤其是对于矩阵运算的处理,具有很多现成的方法和函数可以进行调用,同时MATLAB支持把函数封装成不同的语言方便完成算法的集成。 这里记录利用MATLAB封装成C动态链接库&…

git 自学笔记

git 自学笔记 git 是一个开源的分布式版本控制软件,可以敏捷的处理任何大小项目。 git 的工作流程大体如下: 首先克隆一个git资源作为工作目录 在克隆的资源上添加或者修改文件 如果其他人也修改了,就要对资源进行更新 在提交时也要查看有没有…

通过使用生成对抗市场模型改进基于强化学习的交易的泛化

Improving Generalization in Reinforcement Learning–Based Trading by Using a Generative Adversarial Market Model | IEEE Journals & Magazine | IEEE Xplore Improving Generalization in Reinforcement Learning–Based Trading by Using a Generative Adversaria…

ASEMI代理ADG736BRMZ-REEL7原装ADI车规级ADG736BRMZ-REEL7

编辑:ll ASEMI代理ADG736BRMZ-REEL7原装ADI车规级ADG736BRMZ-REEL7 型号:ADG736BRMZ-REEL7 品牌:ADI /亚德诺 封装:MSOP-10 批号:2023 安装类型:表面贴装型 引脚数量:10 类型&#xff1…

c/c++:指针p+p-p*p/,数组a+1,指针减指针,指针实现strlen函数,指针的比较运算,指针数组,多级指针

c: 2022找工作是学历、能力和运气的超强结合体,遇到寒冬,大厂不招人,此时学会c的话, 我所知道的周边的会c的同学,可手握10多个offer,随心所欲,而找啥算法岗的,基本gg 提…

IMX6ULLPRO单独编译kernel+dtb内核模块以及uboot

目录 为什么编译驱动程序之前要先编译内核? 驱动程序要用到内核文件: 编译内核 编译安装内核模块 编译内核模块 安装内核模块到 Ubuntu 某个目录下备用 安装内核和模块到开发板上 Bootloader 介绍 编译 u-boot 镜像 为什么编译驱动程序之前要先编…

4.4 使用分组聚合进行组内计算

4.4 使用分组聚合进行组内计算 4.4.1 使用groupby方法拆分数据groupby方法的参数及其说明:groupby对象常用的描述性统计方法如下: 4.4.2 使用agg方法聚合数据agg函数和aggregate函数的参数说明1、使用agg求出当前数据对应的统计量2、使用agg分别求字段的…

X509证书中的Subject Public Key Info

SubjectPublicKeyInfo在TBSCertificate的第七项: 对于ECC id-ecPublicKey OBJECT IDENTIFIER :: { iso(1) member-body(2) us(840) ansi-X9-62(10045) keyType(2) 1 } id-ecPublicKey 是必须的 ECParameters :: CHOICE {namedCurve OBJECT IDENTIFIER -- implicitCurve NULL -…

java day10

第10章 创建Swing界面 10.1 Swing的特性10.1.1 标准对话框1. 确认对话框2. 输入对话框3.消息对话框4. 选项对话框 10.1.2 使用对话框10.1.3 滑块10.1.4 滚动窗格10.1.5 工具栏10.1.6 进度条10.1.7 菜单10.1.8 选项卡式窗格 10.1 Swing的特性 10.1.1 标准对话框 JOptionPane类…

HTML5 <rt> 标签、HTML5 <ruby> 标签

HTML5 <rt> 标签 实例 HTML5 <rt>标签用于表示为<ruby>标签中的注释内容。 一个 ruby 注释&#xff1a; <ruby> 漢 <rt> ㄏㄢˋ </rt> </ruby> 尝试一下 浏览器支持 IE 9、Firefox、Opera、Chrome 和 Safari 支持 <rt> 标…

增广拍卖——二跳页下的拍卖机制探索

1. 引言 本文提出的方案已被WSDM 2023接收&#xff0c;论文&#xff1a;Boosting Advertising Space: Designing Ad Auctions for Augment Advertising&#xff0c; 下载&#xff1a;https://dl.acm.org/doi/abs/10.1145/3539597.3570381 信息流产品为了保障用户体验通常会严格…

关于python爬虫解析的问题

在进行Python爬虫解析时&#xff0c;需要注意以下事项&#xff1a; 1、良好的网站使用协议&#xff1a;需要遵守网站的robots.txt文件&#xff0c;以确保你的爬虫程序不会将网站拦截下来。 2、编码问题&#xff1a;需要正确设置HTTP头和解析器的编码&#xff0c;以确保爬虫程…

低代码开发重要工具:jvs-logic(逻辑引擎)可视化设计要素

逻辑引擎可视化的交互 可视化的服务编排是逻辑引擎的核心功能&#xff0c;逻辑引擎的界面可视化设计是为了方便用户使用和操作逻辑引擎而设计的。一个好的界面设计能够提高用户的工作效率和使用体验&#xff0c;同时也能增加软件的可靠性和可维护性。 以下是逻辑引擎界面可视化…

python数据分析综合案列--星巴克门店数据分析及可视化

本实训针对一组关于全球星巴克门店的统计数据&#xff0c;分析了在不同国家和地区以及中国不同城市的星巴克门店数量。 获取数据&#xff0c;数据放在directory.csv 这个案例主要分为以下几个部分&#xff1a; 数据清洗和预处理&#xff1a;使用 Pandas 进行数据清洗和预处理&…

windows下安装emscripten

Qt系列文章目录 文章目录 Qt系列文章目录前言一、Emscripten SDK介绍二、Emscripten SDK安装Get the emsdk repoEnter that directory 前言 由于Web端需要处理大量图像&#xff0c;大量图片的分辨率8k*8k&#xff0c;使用Canvas API&#xff08;画布&#xff09;是在HTML5中新…