Bifrost Document

Version 1.6.x

Bifrost ---- 面向生产环境的 MySQL 同步到 Redis,MongoDB,ClickHouse 等服务的异构中间件

ClickHouse

必须先选择 MySQL 的表后,再选择 ClickHouse 插件,再选择 ClickHouse 库表的时候,如果ClickHouse表字段和MySQL表字段一致的情况下会自动填充

在没有选择 ClickHouse 数据表的时候,在同步过程中,将会根据数据类型自动创建ClickHouse表结构

假如没有选择ClickHouse 数据库名,则会根据 MySQL 里的数据库名,自动创建表( 只有有数据同步的时候,才会自动建表,没有数据同步之前,是不会自动建表的 )

假如选择了ClickHouse 数据库名,没有选择表名,则会自动创建根据字段类型自动创建表

自动创建表 规则

会被强制转成 日志模式-追加(InsertAll) 同步模式

自动创建表为 ReplacingMergeTree 引擎

会自动新新增 bifrost_data_version,binlog_event_type 两个字段,对应 {$BifrostDataVersion},{$EventType} 标签

源端少了或者多了字段 ,并与 ClickHouse 表字段对应不上,ClickHouse 里的字段数据按自动填充默认值

源端没有自增字段的表,会自动放弃该表的同步

在设置 FilterQuery : False 的时候,支持 DDL 同步

 

ClickHouse 对应用MySQL里的存储类型

括号里的代表是ClickHouse里的存储类型

TINYINT ( Int8 | UInt8 ) , SMALLINT ( Int16 | UInt16 ) , MEDIUMINT ( Int32 | UInt32 ), INT ( Int32 | UInt32 ) , BIGINT ( Int64 | UInt64 )

FLOAT ( Float64 ) , DOUBLE ( Float64 ) ,REAL ( Float64 )

NUMERIC( Float64 )

DECIMAL( DECIMAL32 ==> Decimal32 , DECIMAL64 ==> Decimal64 , DECIMAL128 | DECIMAL256 ==> String )

DATE ( Date )

TIME ( String )

YEAR ( Int16 )

DATETIME , TIMESTAMP ( DateTime )

CHAR , VARCHAR ( String )

TEXT , TINYTEXT , MEDIUMINTTEXT , LONGTEXT ( String )

BLOB, TINYBLOB , MEDIUMINTBLOB , LONGBLOB ( String )

ENUM ( String )

SET ( String )

BIT ( Int64 )

BOOL ( Int8 )

JSON ( String )

 

DDL同步

版本要求:Bifrost 1.7+

不选择表,让Bifrost 自动建表

设置 FilterQuery : False

支持 DDL 类型

  • ADD COLUMN 加字段

  • CHANGE COLUMN 修改字段类型(不支持修改字段名,字段名修改会被放弃那个字段的DDL操作)

  • RENAME 修改表名

 

LowerCaseTableNames 参数

0(不转) : 按源表大小写直接创建表

1(小写) : 库表名及字段转成小写

2(大写) : 库表名及字段转成大写

 

连接配置

eg : tcp://127.0.0.1:9000?Database=test&username=&compress=true

同步方式

**普通模式(Normal) : **

源insert,update,delete, 目标库也对应insert,update,delete , 建议 ClickHouse 表中新增一个名为 bifrost_data_version 的字段,使用{$BifrostDataVersion} 标签,用于异步删除数据安全

**日志模式-追加(InsertAll) : **

将DELETE ,UPDATE 转成 INSERT 语句往 ClickHouse 新增一条记录

这个操作,在ClickHouse 表里新增一个叫 EventType(String) 的字段, 在配置同步的时候, EventType 字段 在input 框中 填写 {$EventType} 标签

这个操作是将 数据源里的操作记录,全打到 ClickHouse 里进行存储

**日志模式-UPDATE(LogUpdate) : **

将DELETE ,UPDATE 转成 INSERT 语句往 ClickHouse 新增一条记录

这个操作,在ClickHouse 表里新增一个叫 EventType(String) 的字段, 在配置同步的时候, EventType 字段 在input 框中 填写 {$EventType} 标签

这个操作是将 数据源里的操作记录,全打到 ClickHouse 里进行存储

标签

{$Timestamp} : 同步的时间戳,并不是 Binlog 发生的时间

{$EventType} : 事件类型,insert delete update 三个字符串

{$BinlogTimestamp} : Binlog记录的时间戳

{$BinlogFileNum} : Binlog文件编号,并不是 整个Binlog文件名,比如 binlog 文件是 mysql-bin.000001 那这个 BinlogFileNum 的值 是1

{$BinlogPosition} : Binlog position 位点

{$BifrostDataVersion} : 数据版本号,字段类型必须 为 Int64 或者 UInt64 ,异步删除的时候会用到,保证数据安全

DECIMAL

在 1.6及之前版本 Decimal 类型自动那家表的时候,都强制转成 String 类型

在1.7+版本之后, Deciaml(M,D) ,在 M <= 18 的时候,转成 Deciaml64, 转则转成 String

当前 Bifrost CK 插件 不支持 Deciaml128 和 Decimal256

自动过滤规则(普通同步方式)

假如同一个主键的数据,在同一批次刷数据,会自动过滤多余操作

 

  1. 假如 id = 1 这条数据,连接有 insert ,delete ,update 操作

则只会执行最后的 update 操作,不会执行前面insert 及 delete操作

 

  1. 假如 id = 1 这条数据,连接有 insert ,delete ,insert ,delete 顺序操作

则只会执行最后的 delete 操作一次,不会执行 insert

 

update 操作是转换成 delete 再 insert 两次操作

 

备注

ClickHouse 18+ 版本

假如源端是 decimal或者 varchar 等字符串类型, 目标端ClickHouse 是 Float32,Float64 或者 Decimal 类型,数据类型转换,可能存在精度精失的,如果要确保精度不丢失,ClickHouse 端使用 String 类型

不支持 NULL 值字段,假如数据源为 Null ,将强制转换成 0, 0.00 或者 空字符串

假如目标字段是Date,DateTime类型,数据源为空字符串将强制转成 Date,DateTime 默认值

假如数据源是String类型,Ck表结构是 Int 或者 Float 类型,数据类型转换失败,并不报错,将强制转换成 0 或者 0.00

BatchSize参数代表累积多少条数据刷一次数据到ClickHouse,假如一直没有数据从 MySQL 过来,则默认5秒超时,也会进行刷一次

{$BifrostDataVersion} 标签的字段 必须为 Int64 或者 UInt64 数据类型

Last updated on 30 Jan 2021
Edit on GitHub