Canal 實現 MySQL數據庫實時數據同步


Canal 實現 MySQL數據庫實時數據同步

MySQL 數據庫同步

1、簡介

1.1 canal介紹

Canal是一個基於MySQL二進制日志的高性能數據同步系統。Canal廣泛用於阿里巴巴集團(包括https://www.taobao.com),以提供可靠的低延遲增量數據管道。

github地址:https://github.com/alibaba/canal

Canal Server能夠解析MySQL binlog並訂閱數據更改,而Canal Client可以實現將更改廣播到任何地方,例如數據庫和Apache Kafka。

它具有以下功能:

  • 支持所有平台。

  • 支持由Prometheus提供支持的細粒度系統監控。

  • 支持通過不同方式解析和訂閱MySQL binlog,例如通過GTID。

  • 支持高性能,實時數據同步。(詳見Performance)

  • Canal Server和Canal Client都支持HA / Scalability,由Apache ZooKeeper提供支持

  • Docker支持。

缺點:

不支持全量更新,只支持增量更新。

完整wiki地址:https://github.com/alibaba/canal/wiki

1.2 運作原理

原理很簡單:

  1. Canal模擬MySQL的slave的交互協議,偽裝成mysql slave,並將轉發協議發送到MySQL Master服務器。

  2. MySQL Master接收到轉儲請求並開始將二進制日志推送到slave(即canal)。

  3. Canal將二進制日志對象解析為自己的數據類型(原始字節流)

如圖所示:

image

2、准備工作

2.1 下載解壓canal-server

通過 github 下載 canal-server release 版本(本次安裝文檔使用v1.1.4)

root@locahost:/# wget  https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz

解壓

tar -zxvf canal.deployer-1.1.4.tar.gz

2.2 下載解壓 canal-adapter

通過 github 下載 canal-adapter release 版本(本次安裝文檔使用v1.1.4)

root@locahost:/# wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.adapter-1.1.4.tar.gz

解壓

tar -zxvf canal.adapter-1.1.4.tar.gz

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密碼
canal.instance.connectionCharset=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 com.alibaba.otter.canal.parse.inbound.mysql.AbstractMysqlEventParser.setConnectionCharset(java.nio.charset.Charset)]: [public void com.alibaba.otter.canal.parse.inbound.mysql.AbstractMysqlEventParser.setConnectionCharset(java.lang.String)]
2020-06-09 17:13:04.990 [main] INFO c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [canal.properties]
2020-06-09 17:13:04.990 [main] INFO c.a.o.c.i.spring.support.PropertyPlaceholderConfigurer - Loading properties file from class path resource [ant_prod/instance.properties]
2020-06-09 17:13:05.305 [main] INFO c.a.otter.canal.instance.spring.CanalInstanceWithSpring - start CannalInstance for 1-ant_prod
2020-06-09 17:13:05.311 [main] WARN c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table filter : ^.*\..*$
2020-06-09 17:13:05.311 [main] WARN c.a.o.canal.parse.inbound.mysql.dbsync.LogEventConvert - --> init table black filter :
2020-06-09 17:13:05.315 [main] INFO c.a.otter.canal.instance.core.AbstractCanalInstance - start successful....
2020-06-09 17:13:05.422 [destination = ant_prod , address = rm-wz99s5v03gso12521.mysql.rds.aliyuncs.com/192.xxxxxx:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> begin to find start position, it will be long time for reset or first position
2020-06-09 17:13:05.423 [destination = ant_prod , address = rm-wz99s5v03gso12521.mysql.rds.aliyuncs.com/192.xxxxxx:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - prepare to find start position just show master status
2020-06-09 17:13:06.483 [destination = ant_prod , address = rm-wz99s5v03gso12521.mysql.rds.aliyuncs.com/192.xxxxxx:3306 , EventParser] WARN c.a.o.c.p.inbound.mysql.rds.RdsBinlogEventParserProxy - ---> find start position successfully, EntryPosition[included=false,journalName=mysql-bin.000234,position=6676924,serverId=184376678,gtid=,timestamp=1591693973000] cost : 1051ms , the next step is binlog dump

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文件夾中,修改 application.yml

server:
port: 8089
spring:
jackson:
  date-format: yyyy-MM-dd HH:mm:ss
  time-zone: GMT+8
  default-property-inclusion: non_null
canal.conf:
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
    outerAdapters:
    - name: rdb
      key: mysql1 # 唯一標示
      properties:
        jdbc.driverClassName: com.mysql.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_database_01.test
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、測試數據庫同步

更新/刪除/批量插入/批量更新/批量刪除


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM