Bifrost 同步数据库实现微服务跨库数据同步
Bifrost
Bifrost 可以在同步各种数据数据,类似于 Canal
当前支持的数据库
- Redis
- MongoDB
- ClickHouse(DDL suppoted)
- MySQL(DDL supported)
- Memcache
- RabbitMQ
- ActiveMQ
- Kafka
- ElasticSearch
- Http 自定义服务
- Hprose RPC 自定义服务
使用场景
- 微服务场景中,因为数据库也是根据业务模块进行拆分,不同的业务逻辑中有些维度表,订单表等可能会在不同的微服务中跨表查询,此时如果使用 feign 或者接口方式获取数据再与本地表结合查询,当关联数据较多时,系统查询效率会非常低,还可能失效,此时较好的方式是将其他微服务数据库中的一些需要用到的表通过 Bifrost 同步到本微服务数据库中,同步过来的数据表只能查询使用,不能修改和删除数据,确保数据一致性;
- 实现 MySQL 同 Redis、MQ、Kafka 等存储中的数据实时同步;
MySQL 同步到 MySQL
本处场景为将 IP1 上的数据库 test 中的 user 表同步到 IP2 上的数据库的 test_bifrost 库中的 user 表;
安装/配置
此处通过 Docker 进行安装
拉取镜像
# docker pull jc3wish/bifrost
配置
创建保存配置及数据文件夹
# mkdir -p /home/data/dockerfile/bifrost
# cd /home/data/dockerfile/bifrost
创建配置文件
# vim Bifrost.ini
[user]
#登 入 用 户 名 和 密 码
#用 户 名 在 前 , = 号 后 面 是 密 码
Bifrost=Bifrost123
BifrostMonitor=Bifrost123
[groups]
#administrator 管 理 人 员 可 以 添 加 删 除 等 操 作
#monitor 只 能 查 看 数 据
Bifrost=administrator
BifrostMonitor=monitor
[Bifrostd]
#log写 到 入 的 文 件 夹 , 默 认 为 启 动 文 件 所 在 文 件 夹 下 的 logs目 录
#log_dir=/data/log/
#监 听 端 口 ,默 认 0.0.0.0:21036
listen=0.0.0.0:21036
#通 过 界 面 配 置 的 信 息 保 存 文 件 夹 ,默 认 为 启 动 文 件 所 在 文 件 夹 下 的 data目 录
data_dir=./
#设 置 同 步 给 第 三 方 服 务 的 队 列 大 小 , 默 认 5000
toserver_queue_size=5000
#通 道 队 列 的 大 小 , 默 认 1000
channel_queue_size=1000
#是 否 支 持 动 态 加 plugin so 插 件 , 默 认 为 false
#这 个 参 数 只 在 linux 下 有 效 , 其 他 平 台 全 部 为 false
dynamic_plugin=false
#是 否 支 持 https
tls=true
#server.key 及 server.crt 相 对 于 Bifrost 的 路 径 , 也 可 以 填 绝 对 路 径
tls_key_file=./etc/server.key
tls_crt_file=./etc/server.crt
#采 用 什 么 方 式 存 储 ,默 认 文 件 方 式
#meta_storage_type=redis
#存 储 介 质 的 连 接 地 址
#meta_storage_path=127.0.0.1:6379
#用 于 区 别 实 例 的 名 字
#cluster_name=bifrostTestClusterName
生成 https 证书
# mkdir etc
# cd etc
# openssl genrsa -out server.key 2048
# openssl req -new -x509 -sha256 -key server.key -out server.crt -days 3650
生成证书文件:server.crt 和 server.key
运行 Docker
# docker run -d -p21036:21036 -v /etc/localtime:/etc/localtime -v /home/data/dockerfile/bifrost:/linux/data jc3wish/bifrost
端口为 21036
添加 DNS
(named 服务之前已经安装过)
将 bifrost.zsoft.com 到 安装主机IP 的解析添加到 named 服务的 zsoft.com.zone 配置文件中,并重启 named 服务;
页面访问
用浏览器访问 https://bifrost.zsoft.com 打开管理页面
用户名、密码是在配置文件中配置的:Bifrost / Bifrost123
配置数据同步
登录网页后台 https://bifrost.zsoft.com
本例实现 IP1 上的 test 库的 user 表同步到 IP2 上的 test_bifrost 库的 user 表;
创建数据源
点击页面上方“数据源”,进入数据源配置页面;
Add new DB:
- Name:user|test|80 // 表示 80 服务器上的 test 数据库的 user 表
- ConnUri:root:root@tcp(IP1:3306)/test // IP1 是数据库 test 所在机器的 IP 地址
- 其他不变
点击“提交”
创建目标库
创建完数据源后系统会自动跳转到创建“目标库列表”页(点击页面顶端的“目标库列表”按钮同样进入此页面);
Add new Server:
- ToServerKey:user|test_bifrost|82
- Plugin:mysql - v1.7.3
- ConnUri:root:7654321@tcp(IP2:3306)/test_bifrost // IP2 是目标库所在服务器 IP
- MinConn:0
- MaxConn:20
- Notes:同步 80 服务器的 test 库的 user 表
点击“提交”
配置数据同步
切换到“数据源”页面,在已经创建好的 user|test|80 数据源最后点击“Setting”按钮;
左侧选择 test 数据库,在中间 Table List 中点击 user 表后的 “ADD” 按钮,点击“保存”,然后点击表明 user,在右侧进行配置:
- ToServerKey:mysql -- user|test_bifrost|82
- 同步模式:普通模式
- Fields:勾选要同步的列,我在此处全部选中
- 选择数据库:test_bifrost
- 选择表:user
- BatchSize:500
- Null 转成默认值:False
- MustBeSuccess:True
- FilterQuery:False
- FilterUpdate:True
点击“提交”
在“数据源”页面,在配置好的 user|test|80 项的 ConnStatus 中点击“Start”,状态变为“running”;
此时在 IP1 服务器的 test 库的 user 表添加一条数据:
INSERT INTO user values('1004', now(), now(), '赵六','pic04',1);
在 IP2 服务器的 test_bifrost 库的 user 表中就会看到数据已经同步过来!