clickhouse 同步mysql_ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式
原文出自:https://bohutang.me/2020/08/26/clickhouse-and-friends-mysql-gtid-replication/
最后更新: 2020-09-03
<MySQL实时复制原理篇>
几天前 ClickHouse 官方发布了 v20.8.1.4447-testing(https://github.com/ClickHouse/ClickHouse/releases/tag/v20.8.1.4447-testing),这个版本已经包含了 MaterializeMySQL 引擎,实现了 ClickHouse 实时复制 MySQL 数据的能力,感兴趣的朋友可以通过官方安装包来做体验,安装方式参考: https://clickhouse.tech/#quick-start,需要注意的是要选择 testing 分支。
基于位点同步
MaterializeMySQL 在 v20.8.1.4447-testing 版本是基于 binlog 位点模式进行同步的。
每次消费完一批 binlog event,就会记录 event 的位点信息到 .metadata 文件:
Version: 1Binlog File: mysql-bin.000002Binlog Position: 328Data Version: 1
这样当 ClickHouse 再次启动时,它会把 {'mysql-bin.000002', 328} 二元组通过协议告知 MySQL Server,MySQL 从这个位点开始发送数据:
s1> ClickHouse 发送 {'mysql-bin.000002', 328} 位点信息给 MySQLs2> MySQL 找到本地 mysql-bin.000002 文件并定位到 328 偏移位置,读取下一个 event 发送给 ClickHouses3> ClickHouse 接收 binlog event 并更新 .metadata位点
看起来不错哦,但是有个问题:如果 MySQL Server 是一个集群(比如1主2从),通过 VIP 对外服务,MaterializeMySQL 的 host 指向的是这个 vip。当集群主从发生切换后,{binlog-name, binlog-position} 二元组其实是不准确的,因为集群里主从 binlog 不一定是完全一致的(binlog 可以做 reset 操作)。
s1> ClickHouse 发送 {'mysql-bin.000002', 328} 给集群新主 MySQLs2> 新主 MySQL 发现本地没有 mysql-bin.000002 文件,因为它做过 reset master 操作,binlog 文件是 mysql-bin.000001... oops ...
为了解决这个问题,我们开发了 GTID 同步模式,废弃了不安全的位点同步模式,目前已被 upstream merged #PR13820 (https://github.com/ClickHouse/ClickHouse/pull/13820),下一个 testing 版本即可体验。
着急的话可以自己编译或通过 ClickHouse Build Check for master-20.9.1 (https://clickhouse-builds.s3.yandex.net/0/2b8ad576cc3892d2d760f3f8b670adf17db0c2a0/clickhouse_build_check/report.html) 下载安装。
基于GTID同步
GTID 是 MySQL 复制增强版,从 MySQL 5.6 版本开始支持,目前已经是 MySQL 主流复制模式。
它为每个 event 分配一个全局唯一ID和序号,我们可以不用关心 MySQL 集群主从拓扑结构,直接告知 MySQL 这个 GTID 即可,.metadata变为:
Version: 2Executed GTID: f4aee41e-e36f-11ea-8b37-0242ac110002:1-5Data Version: 1
f4aee41e-e36f-11ea-8b37-0242ac110002
是生成 event的主机UUID,1-5
是已经同步的event区间。
这样流程就变为:
s1> ClickHouse 发送 GTID:f4aee41e-e36f-11ea-8b37-0242ac110002:1-5 给 MySQLs2> MySQL 根据 GTID:f4aee41e-e36f-11ea-8b37-0242ac110002:1-5 找到本地位点,读取下一个 event 发送给 ClickHouses3> ClickHouse 接收 binlog event 并更新 .metadata GTID信息
MySQL开启GTID
那么,MySQL 侧怎么开启 GTID 呢?增加以下两个参数即可:
--gtid-mode=ON --enforce-gtid-consistency
比如启动一个启用 GTID 的 MySQL docker:
docker run -d -e MYSQL_ROOT_PASSWORD=123 mysql:5.7 mysqld --datadir=/var/lib/mysql --server-id=1 --log-bin=/var/lib/mysql/mysql-bin.log --gtid-mode=ON --enforce-gtid-consistency
注意事项
启用 GTID 复制模式后,metadata Version 会变为 2,也就是老版本启动时会直接报错,database 需要重建。
总结
MaterializeMySQL 引擎还处于不停迭代中,对于它我们有一个初步的规划:
稳定性保证 这块需要更多测试,更多试用反馈
索引优化 OLTP 索引一般不是为 OLAP 设计,目前索引转换还是依赖 MySQL 表结构,需要更加智能化
可观测性 在 ClickHouse 侧可以方便的查看当前同步信息,类似 MySQL
show slave status
数据一致性校验 需要提供方式可以校验 MySQL 和 ClickHouse 数据一致性
MaterializeMySQL 已经是社区功能,仍然有不少的工作要做。期待更多的力量加入,我们的征途不止星辰大海。
全文完。
Enjoy ClickHouse :)
叶老师的「MySQL核心优化」大课已升级到MySQL 8.0,扫码开启MySQL 8.0修行之旅吧
clickhouse 同步mysql_ClickHouse和他的朋友们(11)MySQL实时复制之GTID模式相关推荐
- clickhouse 同步mysql_ClickHouse和他的朋友们(9)MySQL实时复制与实现
很多人看到标题还以为自己走错了夜场,其实没有. ClickHouse 可以挂载为 MySQL 的一个从库 ,先全量再增量的实时同步 MySQL 数据,这个功能可以说是今年最亮眼.最刚需的功能,基于它我 ...
- clickhouse 同步mysql_ClickHouse单机部署以及从MySQL增量同步数据
背景: 随着数据量的上升,OLAP一直是被讨论的话题,虽然druid,kylin能够解决OLAP问题,但是druid,kylin也是需要和hadoop全家桶一起用的,异常的笨重,再说我也搞不定,那只能 ...
- clickhouse 同步 mysql数据
前言 通过前面的篇章,我们了解到clickhouse是一款性能很高的OLAP数据存储.数据分析型数据库引擎,主要用于在线分析处理查询(OLAP),能够使用 SQL 查询实时生成分析数据报告,基于此,在 ...
- clickhouse 增量更新_Clickhouse單機部署以及從mysql增量同步數據
背景: 隨着數據量的上升,OLAP一直是被討論的話題,雖然druid,kylin能夠解決OLAP問題,但是druid,kylin也是需要和hadoop全家桶一起用的,我也搞不定,那只能找我能搞定的技術 ...
- MySQL 到 MySQL 实时数据同步实操分享
摘要:很多 DBA 和开发同学经常会遇到要从一个数据库实时同步到另一个数据库的问题,同构数据还相对容易,遇上异构数据.表多.数据量大等情况就难以同步.最近了解到一款实时数据同步工具 Tapdata C ...
- mysql主从复制、基于GTID的主从、半同步
使用的mysql版本5.7.17 一.主从复制 原理: 主从复制一共有三个进程,从库生成两个线程,一个I/O线程,一个SQL线程: i/o线程去请求主库的binlog,并将得到的binlog日志写到r ...
- mysql并行复制降低主从同步延时的思路与启示
mysql并行复制降低主从同步延时的思路与启示 一.缘起 mysql主从复制,读写分离是互联网用的非常多的mysql架构,主从复制最令人诟病的地方就是,在数据量较大并发量较大的场景下,主从延时会比较严 ...
- ClickHouse到底牛逼在哪里?为什么比MySQL快831倍!
ClickHouse到底牛逼在哪里?为什么比MySQL快831倍! 这两年 ClickHouse 非常的火,尤其是在大数据领域. 刚好这两天也有群友在群里说起 ClickHouse,这款来自俄罗斯 Y ...
- MySQL 8 复制(二)——半同步复制
目录 一.简介 二.性能提升 1. 支持发送二进制日志事件和接收ACK的异步化 2. 控制主库接收确认反馈从库的数量 3. 二进制日志互斥锁改进 三.数据一致性 1. 源码剖析 2. rpl_semi ...
最新文章
- J2EE分布式框架之开发环境部署(上)
- dmidecode 命令详解(获取硬件信息)
- Eclipse中,多参列表光标跳转至第2个参数快捷键,及其他常用快捷键
- java 枚举类型enum
- 总结:JavaEE完整体系架构
- Blockchain.com,Eden Block,DACM等知名公司加入Pocket生态
- 【Qt教程】1.5 - Qt5内存回收机制-对象树、窗口坐标系
- VGG11、VGG13、VGG16、VGG19网络结构图
- window7磁盘分区
- 20210406森林里的兔子
- (已解决)win10重装后无法开启双显示屏
- C# Pdf转Png,提取Pdf中的图片
- 编程语言学习——0基础C语言入门
- MySQL 10060错误 解决方法
- EPS是什么文件格式
- MODBUS-RTU数据帧格式、报文解析
- 6GK5116-0BA00-2AB2的技术参数说明
- 记录:谷歌地图google map api实现基本测距功能
- 【USACO-Chapter1-1.3】【贪心】Barn Repair
- 悟透delphi 第二章 DELPHI与WIN32时空