• 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
    
    • 1
    • 2
    • 3

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

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

    (3)重启 MySQL

    sudo systemctl restart mysqld
    
    • 1

    开启 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
    在这里插入图片描述

  • 相关阅读:
    Docker基本命令
    [建图]2+ doors Codeforces1715D
    Amlogic S905X4 平台上针对HDMI TX(OUT) CEC操作
    windows/linux命令行操作快捷方式
    20240418金融读报:银行参考汇丰全球化布局&银行全球化布局现有路径&再读金融助力新型工业化
    XML|DTD声明
    matlab线性代数常用函数
    KKSwarm功能升级,低成本实现多车集群与避障
    C#泛型
    Java单例模式实现方式
  • 原文地址:https://blog.csdn.net/itlijinping_zhang/article/details/125410355