Bifrost ---- 面向生产环境的 MySQL 同步到Redis,ClickHouse等服务的异构中间件
Bifrost 支持界面上点点点进行配置将MySQL 里的数据 同步到 ClickHouse
1. Bifrost 安装
1.1 源码安装
git clone -b v1.6.x https://github.com/brokercap/Bifrost.git ./BifrostV1.6.x
cd ./BifrostV1.6.x
./build.sh linux amd64
cd tags/v1.6.0-beta.01/bifrost_v1.6.0-beta.01_Linux-amd64-bin
#根据需要自行修改配置文件
vim etc/Bifrost.ini
cd ./bin/
./Biforst-server start
当输出下面内容的下时候,说明启动成功了
___ ___ _
( _'\ _ /'___) ( )_
| (_) )(_)| (__ _ __ _ ___ | ,_) Bifrost v1.6.0-beta.01 amd64 Listen https://0.0.0.0:21036
| _ <'| || ,__)( '__)/'_'\ /',__)| |
| (_) )| || | | | ( (_) )\__, \| |_ Pid: 36919
(____/'(_)(_) (_) '\___/'(____/'\__) http://xbifrost.com
其他安装方式,进参考 https://wiki.xbifrost.com/install/
2. 管理系统配置同步
2.1 访问
https://192.168.220.142:21036/
通过 Http 访问,记得防火墙开放21036 端口
默认登入用户名 :Biforst
默认登入密码: Bifrost123
2.2 配置连接 ClickHouse 的目标库
1). 点击导航栏的 目标库列表,并拉到最 底部,添加 新目标库地址的模块
2). 给新的目标地址库,取一个全局唯一的名字,拼音或者数字,这个名字后面配置数据表同步的地方会用到
3). 在ConnUri 输入框,输入 边接 ClickHouse的连接
比如我这里是:
tcp://172.17.0.6:9000?username=&password |
ClickHouse 默认是监听的127.0.0.1 ,时区默认是UTC时区,这个需要自行修改
<listen_host>127.0.0.1</listen_host>
4). 点击 Check 按钮,验证连接地址是否生效,没有验证通过的情况下,是不能 提交的
5). 点击 提交 按钮
是可以实时看到 当前这个目标库,有多少个连接可以用,当前共有多少个连接的,也能提供了修改的方法
2.2 添加数据源
数据源是指连接MySQL ,进行读取数据
1). 给数据源取一个全局唯一的名字,我们这里取 mysqlSourceTest
2). ConnUri 输入框输入 连接 MySQL 的连接地址,并点击 Check 按钮 验证,假如没有验证通过后面是提交不了 保存的
连接帐号需要Super等权限 ,可以参考 WIKI : https://wiki.xbifrost.com/data_source/add/
假如是 阿里云,AWS 等云厂商的云数据库,则需要对SELECT 权限,保证能 SELECT所有表表结构,
选择框 验证是否有足够权限 ,假如选择了的情况下,会对 帐号 相对应的权限进行验证,比如 有没有 super 权限等
假如是 阿里云,AWS 等云厂商的云数据库,请不要钩选 验证是否有足够权限 。这个需要自行确认是否有权限,否则会通过不了
3). 点击了 Check 按钮后,会对 下面的 位点 ,及 ServerId 进行自动填充,也可以自行修改,记得,MySQL 需要开启了 Binlog 及 设置成 ROW 格式
4). 点击 提交 保证
5). 点击 数据源 列表 右边 的 Setting 按钮,进入到对数据表同步配置界面
2.3 数据表同步配置
我们这里的需求是将 binlog_field_test 前缀的所有表的数据 ,同步到 ClickHouse
2.3.1 设置表和通道进行绑定
选择 其中一个binlog_field_test 前缀的表,并点击 其右边的 ADD 按钮
在弹出的对话框里
设置 FuzzyMatching 为 YES
并将 TableName 修改为 binlog_field_test*
binlog_field_test* 代表是以 binlog_field_test为前缀的所有表,可以参考 WIKI :https://wiki.xbifrost.com/syncdata/sync_batch/
下面的 IgnoreTables 代表,不对哪些表进行匹配,这是特殊需求了,咋先不管这个
最后击点 保存 按钮
会提示 匹配到了哪些表,并让你确认
比如:
2.3.2 选择表并进行对表进行同步配置
在 2.3.1 点击了保存 绑定 表和通道 等配置后,在 TableList 列表最下面,会自动新增了 一个 binlog_field_test* 虚拟表,这是模拟匹配表才会自动新增,假如不是模拟匹配的话,是不会新增虚拟表的
并且相对应的 表的 ADD 按钮也全变成了 DEL 按钮,只有这个在这个 DEL 按钮出现了的表,才能对其进行 数据同步配置
2.3.2.1 选择需要配置同步的表
这里记得要占点表名,不是选择 右边那个复选框,而是点击 上面的图那里箭头那里,点击表名,让表名的背景色变成 绿色
2.3.2.2 设置同步配置
这里选择 刚才我们目标库添加的那个 目标库的名字
不同的目标库,这里配置是不一样的
然后点击 最后面的 提交 按钮
这里提一下,自动创建 CK库和自动创建CK表,需要 连接 ClickHouse 的帐号要有相对应的权限
同步到 ClickHouse 有三种模式,其实管理系统也说得比较清楚了
普通 模式 : mysql 里insert ,delete ,update 的数据 ,在 ClickHouse 也对执行相对应的操作,这个模式不支持 自动创建CK表,需要自行事先建表
日志模式-UPDATE :insert,update 都是和普通 模式一样,DELETE 会转成 UPDATE 执行,这个模式不支持 自动创建CK表,需要自行事先建表
日志模式-追加: 将所有 数据 ,转成 insert 的方式,写入到 ClickHouse,支持自动创建CK表
3. 全量任务
3.1 添加全量任务
在选中了 左边表至表背景为绿色的时候,按上图箭头位置按钮,点击 刷全量数据 按钮
TableName : 代表将会 对哪些表进行 SELECT 全量查询
ToServer : 代表将数据同步到哪些配置上,必须 配置了 第二步的同步配置后,才能点击配置全量任务,不然这里不会显示让你选择的
当然你也可以配置,多少个MYSQL 连接并发查询 数据表,开启多少个同步线程进行写入到 目标库
最后点击 保存 按钮
3.2 开启全量任务
点击 Start 按钮
可以对界面进行刷查看到 当前正在执行 查询哪一个表,每个表,共查询了多少条数据出来,每个连接从哪一行开始执行都有记录显示的,
3.3 结果验证
自行登入到 ClickHouse
275bd762391e :) show databases;
SHOW DATABASES
┌─name─────────┐
│ bifrost_test │
│ default │
│ mdbtest1 │
│ system │
│ test │
└──────────────┘
5 rows in set. Elapsed: 0.064 sec.
275bd762391e :) use bifrost_test;
USE bifrost_test
Ok.
0 rows in set. Elapsed: 0.018 sec.
275bd762391e :) show tables;
SHOW TABLES
┌─name───────────────┐
│ binlog_field_test │
│ binlog_field_test2 │
│ binlog_field_test3 │
│ binlog_field_test4 │
└────────────────────┘
4 rows in set. Elapsed: 0.003 sec.
275bd762391e :) select count(*) from binlog_field_test;
SELECT count(*)
FROM binlog_field_test
┌─count()─┐
│ 100001 │
└─────────┘
1 rows in set. Elapsed: 0.075 sec. Processed 100.00 thousand rows, 200.00 KB (1.33 million rows/s., 2.65 MB/s.)
275bd762391e :) show create table binlog_field_test;
SHOW CREATE TABLE binlog_field_test
┌─statement──────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┐
│ CREATE TABLE bifrost_test.binlog_field_test (`id` UInt32, `testdouble` Nullable(Float64), `testbit` Nullable(Int64), `testtinyblob` Nullable(String), `testbigint` Nullable(Int64), `testvarchar` Nullable(String), `testenum` Nullable(String), `testfloat` Nullable(Float32), `testtime` Nullable(String), `testdate` Nullable(Date), `testtext` Nullable(String), `testbool` Nullable(Int8), `test_unsinged_bigint` Nullable(UInt64), `testtinyint` Nullable(Int8), `testchar` Nullable(String), `test_unsinged_smallint` Nullable(UInt16), `test_unsinged_mediumint` Nullable(UInt32), `testyear` Nullable(String), `testdecimal` Nullable(String), `testlongblob` Nullable(String), `testmediumint` Nullable(Int32), `testint` Nullable(Int32), `testdatetime` Nullable(DateTime), `testmediumblob` Nullable(String), `test_unsinged_tinyint` Nullable(UInt8), `testset` Nullable(String), `testtimestamp` Nullable(DateTime), `test_unsinged_int` Nullable(UInt32), `testsmallint` Nullable(Int16), `testblob` Nullable(String), `bifrost_data_version` Nullable(Int64), `binlog_event_type` Nullable(String)) ENGINE = ReplacingMergeTree ORDER BY id SETTINGS index_granularity = 8192 │
└────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────────┘
1 rows in set. Elapsed: 0.003 sec.
275bd762391e :) select id,testvarchar,bifrost_data_version,binlog_event_type from binlog_field_test where id = 500;
SELECT
id,
testvarchar,
bifrost_data_version,
binlog_event_type
FROM binlog_field_test
WHERE id = 500
┌──id─┬─testvarchar─┬─bifrost_data_version─┬─binlog_event_type─┐
│ 500 │ c │ 1604500271068853243 │ insert │
└─────┴─────────────┴──────────────────────┴───────────────────┘
1 rows in set. Elapsed: 0.046 sec. Processed 8.19 thousand rows, 327.68 KB (176.14 thousand rows/s., 7.05 MB/s.)
在这里 我们 执行
select id,testvarchar,bifrost_data_version,binlog_event_type from binlog_field_test where id = 500;
结果 testvarchar 的值 是 c
后面我们增量的时候,用于验证数据有没有更新
4. 开启 增量
在数据源列表 点击 Start 按钮
4.1 数据验证
4.1.1 MySQL 操作数据
mysql> desc binlog_field_test;
+-------------------------+---------------------------+------+-----+---------------------+----------------+
| Field | Type | Null | Key | Default | Extra |
+-------------------------+---------------------------+------+-----+---------------------+----------------+
| id | int(11) unsigned | NO | PRI | NULL | auto_increment |
| testtinyint | tinyint(4) | NO | | -1 | |
| testsmallint | smallint(6) | NO | | -2 | |
| testmediumint | mediumint(8) | NO | | -3 | |
| testint | int(11) | NO | | -4 | |
| testbigint | bigint(20) | NO | | -5 | |
| testvarchar | varchar(10) | NO | | NULL | |
| testchar | char(2) | NO | | NULL | |
| testenum | enum('en1','en2','en3') | NO | | en1 | |
| testset | set('set1','set2','set3') | NO | | set1 | |
| testtime | time | NO | | 00:00:00 | |
| testdate | date | NO | | 0000-00-00 | |
| testyear | year(4) | NO | | 1989 | |
| testtimestamp | timestamp | NO | | CURRENT_TIMESTAMP | |
| testdatetime | datetime | NO | | 0000-00-00 00:00:00 | |
| testfloat | float(9,2) | NO | | 0.00 | |
| testdouble | double(9,2) | NO | | 0.00 | |
| testdecimal | decimal(9,2) | NO | | 0.00 | |
| testtext | text | NO | | NULL | |
| testblob | blob | NO | | NULL | |
| testbit | bit(8) | NO | | b'0' | |
| testbool | tinyint(1) | NO | | 0 | |
| testmediumblob | mediumblob | NO | | NULL | |
| testlongblob | longblob | NO | | NULL | |
| testtinyblob | tinyblob | NO | | NULL | |
| test_unsinged_tinyint | tinyint(4) unsigned | NO | | 1 | |
| test_unsinged_smallint | smallint(6) unsigned | NO | | 2 | |
| test_unsinged_mediumint | mediumint(8) unsigned | NO | | 3 | |
| test_unsinged_int | int(11) unsigned | NO | | 4 | |
| test_unsinged_bigint | bigint(20) unsigned | NO | | 5 | |
+-------------------------+---------------------------+------+-----+---------------------+----------------+
30 rows in set (0.00 sec)
mysql> select * from binlog_field_test limit 1 ;
+-----+-------------+--------------+---------------+---------+------------+-------------+----------+----------+---------+----------+------------+----------+---------------------+---------------------+-----------+------------+-------------+----------+----------+---------+----------+----------------+--------------+--------------+-----------------------+------------------------+-------------------------+-------------------+----------------------+
| id | testtinyint | testsmallint | testmediumint | testint | testbigint | testvarchar | testchar | testenum | testset | testtime | testdate | testyear | testtimestamp | testdatetime | testfloat | testdouble | testdecimal | testtext | testblob | testbit | testbool | testmediumblob | testlongblob | testtinyblob | test_unsinged_tinyint | test_unsinged_smallint | test_unsinged_mediumint | test_unsinged_int | test_unsinged_bigint |
+-----+-------------+--------------+---------------+---------+------------+-------------+----------+----------+---------+----------+------------+----------+---------------------+---------------------+-----------+------------+-------------+----------+----------+---------+----------+----------------+--------------+--------------+-----------------------+------------------------+-------------------------+-------------------+----------------------+
| 500 | -1 | -2 | -3 | -4 | -5 | c | c | en1 | set1 | 07:16:42 | 2020-07-10 | 2020 | 2020-07-10 07:16:42 | 2020-07-10 07:16:42 | 9.22 | 9.22 | 9.22 | text | blob | 8 | 0 | mediumblob | longblob | tinyblob | 1 | 2 | 3 | 4 | 5 |
+-----+-------------+--------------+---------------+---------+------------+-------------+----------+----------+---------+----------+------------+----------+---------------------+---------------------+-----------+------------+-------------+----------+----------+---------+----------+----------------+--------------+--------------+-----------------------+------------------------+-------------------------+-------------------+----------------------+
1 row in set (0.00 sec)
mysql> update binlog_field_test set testvarchar = "yes,test" where id = 500;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1 Changed: 1 Warnings: 0
mysql> select id,testvarchar from binlog_field_test where id = 500;
+-----+-------------+
| id | testvarchar |
+-----+-------------+
| 500 | yes,test |
+-----+-------------+
1 row in set (0.00 sec)
这里我们执行 SQL
update binlog_field_test set testvarchar = "yes,test" where id = 500;
将 testvarchar 值 修改为 yes,test
4.1.2 ClickHouse 验证数据增量
假如你只修改了一条数据 ,默认情况下,需要5秒后才会将数据同步到 ClickHouse
275bd762391e :) select id,testvarchar,bifrost_data_version,binlog_event_type from binlog_field_test where id = 500;
SELECT
id,
testvarchar,
bifrost_data_version,
binlog_event_type
FROM binlog_field_test
WHERE id = 500
┌──id─┬─testvarchar─┬─bifrost_data_version─┬─binlog_event_type─┐
│ 500 │ yes,test │ 1604501758828694890 │ update │
└─────┴─────────────┴──────────────────────┴───────────────────┘
┌──id─┬─testvarchar─┬─bifrost_data_version─┬─binlog_event_type─┐
│ 500 │ c │ 1604500271068853243 │ insert │
└─────┴─────────────┴──────────────────────┴───────────────────┘
在这里查询出来了2条数据 ,为什么会有2条数据呢?
Bifrost 自动创建 CK 表是是采用的 ReplacingMergeTree 引擎,理论上,后面进来的进来的会代表旧的数据 ,为什么会有2条数据 呢?
这里是由于 ReplacingMergeTree 引擎数据合并是不定时的
再看数据 本身
┌──id─┬─testvarchar─┬─bifrost_data_version─┬─binlog_event_type─┐
│ 500 │ yes,test │ 1604501758828694890 │ update │
└─────┴─────────────┴──────────────────────┴───────────────────┘
testvarchar 数据同步过来了
bifrost_data_version,binlog_event_type 字段 是 Bifrost 创建CK表的时候,自动添加的字段
bifrost_data_version 是数据版本号,是精确到纳秒的时间戳
binlog_event_type 是当前这条数据 ,在binlog事件里,属于什么事件,对应 update,delete,insert, commit
5. 小结
Bifrost 官网:https://www.xbifrost.com/
WIKI : https://wiki.xbifrost.com/
GitHub: https://github.com/brokercap/Bifrost
Gitee : https://gitee.com/jc3wish/Bifrost
来源:oschina
链接:https://my.oschina.net/u/4233862/blog/4703074