ClickHouse同步MySQL数据

news2024/11/16 7:29:45

目录

  • 1 概述
    • 1.1 特点
    • 1.2 使用细则
  • 2 案例实操
    • 2.1 MySQL 开启 binlog 和 GTID 模式
    • 2.2 准备 MySQL 表和数据
    • 2.3 开启 ClickHouse 物化引擎
    • 2.4 创建复制管道
    • 2.5 修改数据
    • 2.6 删除数据
    • 2.7 删除表


1 概述

在这里插入图片描述

MySQL 的用户群体很大,为了能够增强数据的实时性,很多解决方案会利用 binlog 将数据写入到 ClickHouse。为了能够监听 binlog 事件,我们需要用到类似 canal 这样的第三方中间件,这无疑增加了系统的复杂度。
  ClickHouse 20.8.2.3 版本新增加了 MaterializeMySQL 的 database 引擎,该 database 能映 射 到 MySQL 中 的 某 个 database , 并 自 动 在 ClickHouse 中 创 建 对 应 的ReplacingMergeTree。ClickHouse 服务做为 MySQL 副本,读取 Binlog 并执行 DDL 和 DML 请求,实现了基于 MySQL Binlog 机制的业务数据库实时同步功能。

1.1 特点

  1. MaterializeMySQL 同时支持全量和增量同步,在 database 创建之初会全量同步MySQL 中的表和数据,之后则会通过 binlog 进行增量同步。

  2. MaterializeMySQL database 为其所创建的每张 ReplacingMergeTree

  自动增加了_sign 和 _version

字段。

其中,

   _version

用作 ReplacingMergeTree 的 ver 版本参数,每当监听到 insert、update 和 delete 事件时,在 databse 内全局自增。而

   _sign

则用于标记是否被删除,取值 1 或者 -1。

目前 MaterializeMySQL 支持如下几种 binlog 事件:

  • MYSQL_WRITE_ROWS_EVENT: _sign = 1,_version ++
  • MYSQL_DELETE_ROWS_EVENT: _sign = -1,_version ++
  • MYSQL_UPDATE_ROWS_EVENT: 新数据 _sign = 1
  • MYSQL_QUERY_EVENT: 支持 CREATE TABLE 、DROP TABLE 、RENAME TABLE 等。

1.2 使用细则

  1. DDL 查询
    MySQL DDL 查询被转换成相应的 ClickHouse DDL 查询(ALTER, CREATE, DROP, RENAME)。如果 ClickHouse 不能解析某些 DDL 查询,该查询将被忽略。
  2. 数据复制
    MaterializeMySQL 不支持直接插入、删除和更新查询,而是将 DDL 语句进行相应转换:
    MySQL INSERT 查询被转换为 INSERT with _sign=1。
    MySQL DELETE 查询被转换为 INSERT with _sign=-1。
    MySQL UPDATE 查询被转换成 INSERT with _sign=1 和 INSERT with _sign=-1。
  3. SELECT 查询
    如果在 SELECT 查询中没有指定_version,则使用 FINAL 修饰符,返回_version 的最大值对应的数据,即最新版本的数据。
    如果在 SELECT 查询中没有指定_sign,则默认使用 WHERE _sign=1,即返回未删除状态(_sign=1)的数据。
  4. 索引转换
    ClickHouse 数据库表会自动将 MySQL 主键和索引子句转换为ORDER BY 元组。
    ClickHouse 只有一个物理顺序,由 ORDER BY 子句决定。如果需要创建新的物理顺序,请使用物化视图。

2 案例实操

2.1 MySQL 开启 binlog 和 GTID 模式

  1. 确保 MySQL 开启了 binlog 功能,且格式为 ROW
    打开/etc/my.cnf,在[mysqld]下添加:
   server-id=1
   log-bin=mysql-bin
   binlog_format=ROW

  1. 开启 GTID 模式
    如果如果 clickhouse 使用的是 20.8 prestable 之后发布的版本,那么 MySQL 还需要配置开启 GTID 模式, 这种方式在 mysql 主从模式下可以确保数据同步的一致性(主从切换时)。
   gtid-mode=on
   enforce-gtid-consistency=1 # 设置为主从强一致性
   log-slave-updates=1 # 记录日志

GTID 是 MySQL 复制增强版,从 MySQL 5.6 版本开始支持,目前已经是 MySQL 主流复制模式。它为每个 event 分配一个全局唯一 ID 和序号,我们可以不用关心 MySQL 集群主从拓扑结构,直接告知 MySQL 这个 GTID 即可。
\3. 重启 MySQL

   sudo systemctl restart mysqld
  

2.2 准备 MySQL 表和数据

  1. 在 MySQL 中创建数据表并写入数据
   CREATE DATABASE testck;
   CREATE TABLE `testck`.`t_organization` (
   	`id` int(11) NOT NULL AUTO_INCREMENT,
   	`code` int NOT NULL,
   	`name` text DEFAULT NULL,
   	`updatetime` datetime DEFAULT NULL,
   	PRIMARY KEY (`id`),
   	UNIQUE KEY (`code`)
   ) ENGINE=InnoDB;
   
   INSERT INTO testck.t_organization (code,name,updatetime) VALUES(1000,'Realinsight',NOW());
   INSERT INTO testck.t_organization (code,name,updatetime) VALUES(1001, 'Realindex',NOW());
   INSERT INTO testck.t_organization (code,name,updatetime) VALUES(1002,'EDT',NOW());
  1. 创建第二张表
   CREATE TABLE `testck`.`t_user` (
   	`id` int(11) NOT NULL AUTO_INCREMENT,
   	`code` int,
   	PRIMARY KEY (`id`)
   ) ENGINE=InnoDB;
   
   INSERT INTO testck.t_user (code) VALUES(1);

2.3 开启 ClickHouse 物化引擎

set allow_experimental_database_materialize_mysql=1;

2.4 创建复制管道

  1. ClickHouse 中创建MaterializeMySQL 数据库
   CREATE DATABASE test_binlog ENGINE = MaterializeMySQL('hadoop1:3306','testck','root','000000');
  

其中 4 个参数分别是 MySQL 地址、databse、username 和 password。

  1. 查看 ClickHouse 的数据
   use test_binlog;
   show tables;
   select * from t_organization;
   select * from t_user;

2.5 修改数据

  1. 在 MySQL 中修改数据:

    update t_organization set name = CONCAT(name,'-v1') where id = 1
    1
    
  2. 查看 clickhouse 日志可以看到 binlog 监听事件,查询clickhouse

    select * from t_organization;
    1
    

2.6 删除数据

  1. MySQL 删除数据:
   DELETE FROM t_organization where id = 2;
  
  1. ClicKHouse,日志有 DeleteRows 的 binlog 监听事件,查看数据:
   select * from t_organization;
  
  1. 在刚才的查询中增加 _sign 和 _version 虚拟字段
   select *,_sign,_version from t_organization order by _sign desc,_version desc;
   

在这里插入图片描述

在查询时,对于已经被删除的数据,_sign=-1,ClickHouse 会自动重写 SQL,将 _sign =1 的数据过滤掉;
对于修改的数据,则自动重写 SQL,为其增加 FINAL 修饰符。

   select * from t_organization
   等同于
   select * from t_organization final where _sign = 1

2.7 删除表

  1. 在 mysql 执行删除表
   drop table t_user;
   
  1. 此时在 clickhouse 处会同步删除对应表,如果查询会报错
   show tables;
   select * from t_user;
   DB::Exception: Table scene_mms.scene doesn't exist.. 
   
  1. mysql 新建表,clickhouse 可以查询到
   CREATE TABLE `testck`.`t_user` (
   `id` int(11) NOT NULL AUTO_INCREMENT,
   `code` int,
   PRIMARY KEY (`id`)
   ) ENGINE=InnoDB;
   
   INSERT INTO testck.t_user (code) VALUES(1);
   
   #ClickHouse 查询
   show tables;
   select * from t_user;

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

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

相关文章

通过response.body()返回的json报文,直接生成对应结构体,实现数据绑定

作者:非妃是公主 专栏:《Golang》 博客地址:https://blog.csdn.net/myf_666 个性签:顺境不惰,逆境不馁,以心制境,万事可成。——曾国藩 文章目录 序一、解决办法二、相关测试代码1. json body…

Origin选取一定间隔的数据点并作图

有些时候我们发现用origin绘制的图数据点太密,抖动太剧烈: 所以我们最好是隔几个点采样一次,方法如下。 假如我们一共有五列数据,我们再扩充六列(其中一列是放隔点采样的横坐标): 然后选中扩充…

Java企业级开发学习笔记(2.4)利用MyBatis实现条件查询

该文章主要为完成实训任务,详细实现过程及结果见【http://t.csdn.cn/AZM1g】 文章目录 一、创建学生映射器配置文件二、配置学生映射文件三、创建学生映射器接口四、测试学生映射器接口任务1. 查询女生记录任务2. 查询19岁的女生任务3. 查询姓吴的19岁女生任务4. 查…

css预处理器:less

1.css常见单位 绝对单位 只需要掌握px,国外in用得更多 相对单位 em em相对于自身的font-size,如果自身未定义,则相对于继承的父元素font-size rem rem可以做移动端的适配,依然很重要,如淘宝m站在使用;但是趋势是rem转vw rem是相对于html的font-size,html默认字体大小为1…

ROS学习第二十五节——rqt工具箱

1.安装 一般只要你安装的是desktop-full版本就会自带工具箱 如果需要安装可以以如下方式安装 $ sudo apt-get install ros-noetic-rqt $ sudo apt-get install ros-noetic-rqt-common-plugins2.启动 rqt的启动方式有两种: 方式1:rqt 方式2:rosrun rqt_gui rqt_gui 3.基本使…

知识图谱实战应用5-基于知识图谱的创建语义搜索功能

大家好,我是微学AI,今天给大家讲一下知识图谱实战应用5-基于知识图谱的创建语义搜索功能。基于知识图谱的语义搜索功能是一种能够理解用户意图、并根据语义关系在知识图谱中进行查询的搜索方式。相比于传统的文本搜索,它可以更准确地回答用户…

Ubuntu 23.04 正式发布

Ubuntu 23.04 “Lunar Lobster” 是 Ubuntu 操作系统的最新短期支持版本,该版本将获得 9 个月的支持,直到 2024 年 1 月。如果你需要长期支持,建议使用 Ubuntu 22.04 LTS 代替。 Linux 内核 Ubuntu 23.04 采用了新的 Linux 6.2 内核。 值得注…

PySide6/PyQT多线程的使用

前言 上一篇文章介绍了在PySide6中使用多线程去解决PySide6/PyQT的界面卡死问题,这次来具体介绍下多线程在使用上的一些细节。 本文尝试对以下两个问题进行解决: 对 PySide6/PyQT 多线程的使用不熟悉;在 PySide6/PyQT 的应用程序里有耗时任…

prompt的演变

随着功能的增加,提示工程的复杂性将不可避免地增加。在这里,我解释了如何将复杂性引入到提示工程的过程中。 静态prompt 如今,试验prompt和提示工程已司空见惯。通过创建和运行提示的过程,用户可以体验 LLM 的生成能力。 文本生…

STM32 学习笔记_4 GPIO:LED,蜂鸣器,按键,传感器的使用

GPIO 通用 IO General Purpose Input Output. 可配置为8种输入输出模式。通常0~3.3V,部分引脚允许 5V。 上面的虚线方框是输入模块,下面的是输出模块。 推挽输出是1输出高电平,0输出低电平。开漏输出正好相反,因此没有高电平驱…

10分钟了解人工智能(最通俗的语言)

最通俗的语言:15分钟了解人工智能;唯一优点,受众完全听懂 无人驾驶、智能家居、远程医疗……如今,人工智能(AI)技术已被广泛应用于金融、交通、医疗、安防、教育等领域,成为经济增长新动能 一 什么是人工智能 人工智能…

动态规划之-不同路径 II-滚动数组_20230421

DP动态规划之-滚动数组 前言 在学习 不同路径II 的动态规划过程中,从介绍资料中了解到 滚动数组可以进一步降低动态规划解空间的复杂度,更高效利用计算机的储存空间。动态规划中的滚动数组究竟能发挥哪些作用,在常规的动态规划中&#xff0…

REDIS02_RDB概述及作用、自动触发、手动触发、优势劣势、触发场景、配置项详解

文章目录 ①. RDB概述及作用②. RDB - 自动触发③. 手动触发 - save、bgsave④. RDB - 优势体现⑤. RDB - 劣势体现⑥. 哪些情况会触发RDB快照⑦. RDB优化配置项详解 ①. RDB概述及作用 ①. RDB概述:在指定的时间间隔,执行数据集的时间点快照 实现类似照片记录效果的方式,就是…

MapReduce高级篇——全局计数器

MapReduce Counter 计数器 概念 在执行MapReduce程序的时候,控制台输出日志中通常下面片段,可以发现输出信息中的核心词是counter,中文叫做计数器 在执行MapReduce城西过程中,许多时候,用户希望了解程序的运行情况,H…

白话文讲计算机视觉-第十讲-灰度阈值分割

灰度阈值是啥意思呢?我们慢慢说。 1.灰度图 我们现在有一张彩色图,我们给它用黑白的方式变现,就形成灰度图,如图所示。 图1 那究竟怎么转换的呢?很简单,我们根据如下公式,把BGR三个通道换成一个…

【算法题解】26. 求串联子串的位置

这是一道 困难 题 来自: https://leetcode.cn/problems/substring-with-concatenation-of-all-words/ 题目 给定一个字符串 s 和一个字符串数组 words。 words 中所有字符串 长度相同。 s 中的 串联子串 是指一个包含 words 中所有字符串以任意顺序排列连接起来的…

REXROTH液压方向阀安装须知

安装规程 阀安装到系统之前,应该对照订货型号比较其型号说明。 确认阀的连接表面和底板无水分,没有油。 - 清洁: ‧ 安装元件时,确认工业阀和周围干净 ‧ 油箱须密闭,以防止外部污染 ‧ 安装之前&…

【youcans的深度学习 D02】PyTorch例程:创建 LeNet 模型进行图像分类

欢迎关注『youcans的深度学习』系列 【youcans的深度学习 D02】PyTorch例程:创建 LeNet 模型进行图像分类 1. PyTorch 深度学习建模的基本步骤2. 加载 CIFAR-10 数据集3. 定义 LeNet-5 模型类3.1 LeNet 网络3.2 LeNet-5 网络3.3 定义 LeNet-5 网络模型类3.4 构建网络…

AI大模型加速RPAxAI时代到来,谁会是RPA领域的杀手级应用?

GPT等AI大模型震撼来袭,基于RPA的超级自动化仍是最佳落地载体 对话弘玑CPO贾岿,深入了解国产RPA厂商对AI大模型的探索与实践 文/王吉伟 关于RPA已死的说法,在中国RPA元年(2019年)投资机构疯狂抢项目之时就已经有了。…

算法训练Day39:62.不同路径 63. 不同路径 II 动态规划

文章目录 不同路径题解(动态规划)数论方法 [不同路径 II](https://leetcode.cn/problems/unique-paths-ii/description/)题解 不同路径 CategoryDifficultyLikesDislikesContestSlugProblemIndexScorealgorithmsMedium (67.70%)17460--0 Tags Companies 一个机器人位于一个 …