mysql和clickhouse数据同步 MaterializeMySQL 引擎

  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)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. 使用细则

(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 子句决定。如果需要创建新的物理顺序, 请使用物化视图。

  1. 案例实操

mysql 版本 8.0.28 clickhouse 22.5.1.2079
MySQL 开启 binlog 和 GTID 模式
(1)确保 MySQL 开启了 binlog 功能,且格式为 ROW
打开/etc/my.cnf,在[mysqld]下添加:

server-id=1
log-bin=mysql-bin
binlog_format=ROW

(2)开启 GTID 模式
如果如果 clickhouse 使用的是 20.8 prestable 之后发布的版本,那么 MySQL 还需要配置 开启 GTID 模式, 这种方式在 mysql 主从模式下可以确保数据同步的一致性(主从切换时)。

gtid-mode=on
enforce-gtid-consistency=1 # 设置为主从强一致性 
log-slave-updates=1 #记录日志

(3)重启 MySQL

sudo systemctl restart mysqld

开启 ClickHouse 物化引擎
set allow_experimental_database_materialize_mysql=1;
(1)ClickHouse 中创建 MaterializeMySQL 数据库
CREATE DATABASE test_binlog ENGINE =
MaterializeMySQL(‘hadoop1:3306’,‘testck’,‘root’,‘000000’);
其中 4 个参数分别是 MySQL 地址、databse、username 和 password。

注意:Code: 537. DB::Exception: Received from 127.0.0.1:9000. DB::Exception: Illegal MySQL variables, the MaterializedMySQL engine requires binlog_format=‘ROW’. (ILLEGAL_MYSQL_VARIABLE)
如果再执行 CREATE DATABASE test_binlog ENGINE =
MaterializeMySQL(‘hadoop1:3306’,‘testck’,‘root’,‘000000’);这个语句时候报这个错
请在mysql的 my.cnf加这个 default_authentication_plugin=mysql_native_password
在这里插入图片描述

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值