Canal实现MySQL数据库实时数据同步
Canal 实现 MySQL数据库实时数据同步
MySQL 数据库同步
1、简介
1.1 canal介绍
Canal是⼀个基于MySQL⼆进制⽇志的⾼性能数据同步系统。Canal⼴泛⽤于阿⾥巴巴集团(包括),以提供可靠的低延迟增量数据管道。
github地址:
Canal Server能够解析MySQL binlog并订阅数据更改,⽽Canal Client可以实现将更改⼴播到任何地⽅,例如数据库和Apache Kafka。
它具有以下功能:
⽀持所有平台。
⽀持由Prometheus提供⽀持的细粒度系统监控。
⽀持通过不同⽅式解析和订阅MySQL binlog,例如通过GTID。
⽀持⾼性能,实时数据同步。(详见Performance)
Canal Server和Canal Client都⽀持HA / Scalability,由Apache ZooKeeper提供⽀持
Docker⽀持。
缺点:
不⽀持全量更新,只⽀持增量更新。
完整wiki地址:
1.2 运作原理
原理很简单:
1. Canal模拟MySQL的slave的交互协议,伪装成mysql slave,并将转发协议发送到MySQL Master服务器。
2. MySQL Master接收到转储请求并开始将⼆进制⽇志推送到slave(即canal)。
3. Canal将⼆进制⽇志对象解析为⾃⼰的数据类型(原始字节流)
如图所⽰:
2、准备⼯作
2.1 下载解压canal-server
通过 github 下载 canal-server release 版本(本次安装⽂档使⽤v1.1.4)
root@locahost:/# wget  github/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.
解压
tar -zxvf canal.deployer-1.1.
2.2 下载解压 canal-adapter
通过 github 下载 canal-adapter release 版本(本次安装⽂档使⽤v1.1.4)
root@locahost:/# wget github/alibaba/canal/releases/download/canal-1.1.4/canal.adapter-1.1.
解压
tar -zxvf canal.adapter-1.1.
3、配置 canal-server
3.1 canal-server 配置
解压之后进⼊ conf⽂件夹中,修改 canal.properties 根据实际需要来修改(如果不使⽤kafka或MQ 默认tcp即可)
canal.destinations = prod # 指定instance的名字多个使⽤逗号分隔
保存之后在conf⽬录创建 prod ⽂件夹并将 example⽂件夹中的nstance.properties copy 到and_prod中
mkdir ant_prod  #创建⽂件夹
cp example/nstance.properties  prod/ # copy ⽂件
修改nstance.properties配置如下:
canal.instance.master.address=127.0.0.1:3306      # 源Mysql地址
canal.instance.dbUsername=canal                  # 源Mysql账号
canal.instance.dbPassword=canal                  # 源Mysql密码
tionCharset=UTF-8            # 与源数据库编码格式⼀致
canal.instance.defaultDatabaseName=test_database  # 默认监听源数据库
3.2 canal-server 启动
进⼊ canal-server bin ⽬录启动
cd canal-server/bin # 进⼊⽬录
./startup.sh & # 后台启动
查看⽇志,是否启动成功
cd canal-server/logs/ant_prod #进⼊⽇志⽬录
启动成功:
2020-06-09 17:13:04.956 [main] WARN  o.s.beans.GenericTypeAwarePropertyDescriptor - Invalid JavaBean property 'connectionCharset' being accessed! Ambiguous write methods found next to actually used [public void canal 2020-06-09 17:13:04.990 [main] INFO  i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [canal.properties]
2020-06-09 17:13:04.990 [main] INFO  i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [ant_prod/instance.properties]
2020-06-09 17:13:05.305 [main] INFO  canal.instance.spring.CanalInstanceWithSpring - start CannalInstance for 1-ant_prod
2020-06-09 17:13:05.311 [main] WARN  anal.sql.dbsync.LogEventConvert - --> init table filter : ^.*\..*$
2020-06-09 17:13:05.311 [main] WARN  anal.sql.dbsync.LogEventConvert - --> init table black filter :
2020-06-09 17:13:05.315 [main] INFO  AbstractCanalInstance -
2020-06-09 17:13:05.422 [destination = ant_prod , address = sql.rds.:3306 , EventParser] WARN  sql.rds.RdsBinlogEventParserProxy - ---> begin to find start position, it w 2020-06-09 17:13:05.423 [destination = ant_prod , address = sql.rds.:3306 , EventParser] WARN  sql.rds.RdsBinlogEventParserProxy - prepare to find start position just s 2020-06-09 17:13:06.483 [destination = ant_prod , address = sql.rds.:3306 , EventParser] WARN  sql.rds.RdsBinlogEventParserProxy - ---> find start position successfull 4、配置 canal-adapter
4.1 canal-adapter 配置
由于Mysql 是8.0 这⾥需要下载 mysql-connector-java-8.0.20.jar,并将其放⼊lib中
cp mysql-connector-java-8.0.20.jar /canal-adapter/lib/
解压之后进⼊ conf⽂件夹中,修改 l
server:
port: 8089
spring:
jackson:
date-format: yyyy-MM-dd HH:mm:ss
time-zone: GMT+8
default-property-inclusion: non_null
mode: tcp # kafka rocketMQ
canalServerHost: 127.0.0.1:11111
batchSize: 500
syncBatchSize: 1000
retries: 0
timeout:
accessKey:
secretKey:
# 源Mysql 地址账号密码等
srcDataSources:
defaultDS:
url: jdbc:mysql://localhost:3306/test_database?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
username: canal
password: canal
# 需要实时同步数据库,如果多个实例进⾏区分即可
canalAdapters:
- instance: prod # canal instance,在canal-server中指定instance的名称
groups:
- groupId: g1
mysql下载之后是个文件夹
outerAdapters:
- name: rdb
key: mysql1 # 唯⼀标⽰
properties:
jdbc.driverClassName: sql.jdbc.Driver
jdbc.url: jdbc:mysql://localhost:3306/test_database_01?useUnicode=true&characterEncoding=utf8&serverTimezone=Asia/Shanghai
jdbc.username: canal
jdbc.password: canal
编辑rdb⽬录下⾯表的映射⽂件,数据库/表(多个表创建多个映射⽂件,⽂件名对应表名)以此类推
dataSourceKey: defaultDS
destination: prod
outerAdapterKey: mysql1
concurrent: true
dbMapping:
database: test_database_01
table: test
targetTable: test_st
targetPk:
id: id
mapAll: true
4.1 canal-adapter 启动
进⼊ canal-adapter/bin ⽬录启动
cd canal-adapter/bin # 进⼊⽬录
./startup.sh & # 后台启动
查看⽇志,是否启动成功
cd canal-adapter/adapter/logs/ #进⼊⽇志⽬录
tail -f adapter.log # 查看⽇志是否启动成功
5、测试数据库同步
更新/删除/批量插⼊/批量更新/批量删除

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。