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
mysql和clickhouse数据同步 MaterializeMySQL 引擎_第1张图片

你可能感兴趣的:(mysql,数据库,java)