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 表中就会看到数据已经同步过来!