1. 程式人生 > 其它 >基於Canal實現MySQL 8.0 資料庫資料同步

基於Canal實現MySQL 8.0 資料庫資料同步

基於Canal實現MySQL 8.0 資料庫資料同步

0、前置資訊

0.1、伺服器資訊

主機名 作業系統 說明
192.168.91.131 CentOS 7 主庫所在伺服器
192.168.91.135 CentOS 7 canal資料同步所在伺服器

0.2、版本說明

MySQL版本:MySQL_8.0.23
Canal版本:Canal_1.1.5

0.3、安裝 MySQL8.0 資料庫

關於MySQL8.0資料庫的安裝,可參考之前的博文:https://www.cnblogs.com/cndarren/p/16161256.html

0.4、配置MySQL8.0資料庫

修改mysql配置檔案

vi /etc/my.cnf

新增如下配置,開啟MySQL binlog功能

# 服務編號, 與其它節點不衝突即可
server_id=1
log_bin=binlog
binlog_format=ROW

0.5、Canal簡介

關於canal簡介,這裡就不再闡述,具體可以參看官方文件介紹,地址如下:

https://github.com/alibaba/canal/wiki/%E7%AE%80%E4%BB%8B

1、主庫伺服器操作

1.1、連線主庫所在伺服器

# 連線主庫所在伺服器,即:192.168.91.131, 切換 root 賬號
su root

1.2、啟動MySQL8.0資料庫

systemctl start mysqld.service

1.3、建立複製賬號和密碼

連線主庫所在伺服器,即:192.168.91.131,執行MySQL 8.0資料庫,建立複製賬號和密碼,命令如下:

mysql> CREATE USER canal IDENTIFIED BY 'canal';  
mysql> GRANT SELECT, SHOW VIEW, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
mysql> FLUSH PRIVILEGES;

2、canal資料同步伺服器操作

2.1、建立canal資料夾

cd /usr/local
mkdir canal
cd canal
mkdir canal-package canal-adapter canal-deployer

2.2、安裝canal deployer和canal adapter

cd canal-package
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.deployer-1.1.5.tar.gz
wget https://github.com/alibaba/canal/releases/download/canal-1.1.5/canal.adapter-1.1.5.tar.gz
ls
tar -zxvf canal.adapter-1.1.5.tar.gz -C /usr/local/canal/canal-adapter
tar -zxvf canal.deployer-1.1.5.tar.gz -C /usr/local/canal/canal-deployer

2.3、配置和啟動canal-deployer

2.3.1、配置canal-deployer

由於此次同步為MySQL資料庫間的資料同步,所以此處不需要修改 canal.properties 配置檔案,只需修改 instance.properties 即可

cd /usr/local/canal/canal-deployer/conf/example
vi instance.properties

修改內容如下圖所示:

 

說明:instance.properties中同步資料表預設為同步資料庫下所有的表資訊,具體配置如下:

 

若需要同步某幾張表,可以參考如下配置:

# 同步某資料庫test1下的user表,test2資料庫下的所有表,所有庫下所有表資料
canal.instance.filter.regex=test1.user,test2\\..*,.*\\..*

2.3.2、啟動canal-deployer

cd /usr/local/canal/canal-deployer/bin
./startup.sh

檢視日誌確定是否啟動成功

cd /usr/local/canal/canal-deployer/logs/example
cat example.log

可能遇到的問題:

canal-deployer啟動之後,如果在 logs 資料夾下沒有 example 檔案,參考如下情況說明:

1、檢視 /usr/local/canal/canal-deployer/bin 資料夾下,是否存在以hs_err_pid開頭的檔案。

# 出現hs_err_pid開頭的檔案,主要原因有兩個:
1> 伺服器記憶體不足,導致服務啟動失敗,出現OOM問題,這時需要增加伺服器記憶體
2> 伺服器開啟的執行緒數達到上限,這時需要修改執行緒上限,操作如下:
vi /etc/security/limits.conf

修改內容可參考下面配置:
*          soft    nproc          102400
*          hard    nofile         102400
# 上述配置引數說明:
第一列:linux系統使用者名稱,*代表所有使用者
第二列:軟連線/硬連線
第三列:型別,nproc 程序的數量/nofile 檔案開啟數/core-core 檔案大小
第四列:數量

2、bin資料夾下不存在以hs_err_pid開頭的檔案,檢視logs資料夾下的canal資料夾下的canal_stdout.log檔案,命令如下:

cat /usr/local/canal/canal-deployer/logs/canal/canal_stdout.log

若出現如下報錯資訊:

OpenJDK 64-Bit Server VM warning: Ignoring option PermSize; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: Ignoring option MaxPermSize; support was removed in 8.0
OpenJDK 64-Bit Server VM warning: Option UseConcMarkSweepGC was deprecated in version 9.0 and will likely be removed in a future release.
Unrecognized VM option 'UseCMSCompactAtFullCollection'
Error: Could not create the Java Virtual Machine.
Error: A fatal exception has occurred. Program will exit.

解決方案:

出現此報錯的原因是由於當前伺服器安裝的jdk版本高於jdk8,此時需要修改 startup.sh 的啟動引數,操作如下:

cd /usr/local/canal/canal-deployer/bin
./stop.sh
vi startup.sh
# 找到下圖所展示位置,刪除 -XX:+UseCMSCompactAtFullCollection -XX:+UseFastAccessorMethods 引數
./startup.sh

2.4、配置和啟動canal-adapter

2.4.1、配置canal-adapter

1> 修改application.yml檔案

cd /usr/local/canal/canal-adapter/conf
vi application.yml

新增配置如下:

server:
  port: 8081
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8
    default-property-inclusion: non_null
canal.conf:
  mode: tcp
  flatMessage: true
  zookeeperHosts:
  syncBatchSize: 1000
  retries: 0
  timeout:
  accessKey:
  secretKey:
  consumerProperties:
    # canal tcp consumer
    # 修改位置:Canal客戶端所在主機IP
    canal.tcp.server.host: 192.168.91.135:11111
    canal.tcp.zookeeper.hosts:
    canal.tcp.batch.size: 500
    canal.tcp.username:
    canal.tcp.password:
    # kafka consumer
    kafka.bootstrap.servers: 127.0.0.1:9092
    kafka.enable.auto.commit: false
    kafka.auto.commit.interval.ms: 1000
    kafka.auto.offset.reset: latest
    kafka.request.timeout.ms: 40000
    kafka.session.timeout.ms: 30000
    kafka.isolation.level: read_committed
    kafka.max.poll.records: 1000
    # rocketMQ consumer
    rocketmq.namespace:
    rocketmq.namesrv.addr: 127.0.0.1:9876
    rocketmq.batch.size: 1000
    rocketmq.enable.message.trace: false
    rocketmq.customized.trace.topic:
    rocketmq.access.channel:
    rocketmq.subscribe.filter:
    # rabbitMQ consumer
    rabbitmq.host:
    rabbitmq.virtual.host:
    rabbitmq.username:
    rabbitmq.password:
    rabbitmq.resource.ownerId:
  # 修改位置:新增源庫配置資訊,此處為同步同庫下所有表資訊
  srcDataSources:
    defaultDS:
      url: jdbc:mysql://192.168.91.131:3306/test?useUnicode=true
      username: root
      password: 123456
    amsDS:
      url: jdbc:mysql://192.168.91.131:3306/nxgp_ams?useUnicode=true
      username: root
      password: 123456
  canalAdapters:
  - instance: example # canal instance Name or mq topic name
    groups:
    - groupId: g1
      outerAdapters:
      - name: logger
      - name: rdb
        key: mysql1
        properties:
          jdbc.driverClassName: com.mysql.jdbc.Driver
          jdbc.url: jdbc:mysql://192.168.91.135:3306/test?useUnicode=true
          jdbc.username: root
          jdbc.password: 123456
      - name: rdb
        key: mysql2
        properties:
          jdbc.driverClassName: com.mysql.jdbc.Driver
          jdbc.url: jdbc:mysql://192.168.91.135:3306/nxgp_ams?useUnicode=true
          jdbc.username: root
          jdbc.password: 123456
#      - name: rdb
#        key: oracle1
#        properties:
#          jdbc.driverClassName: oracle.jdbc.OracleDriver
#          jdbc.url: jdbc:oracle:thin:@localhost:49161:XE
#          jdbc.username: mytest
#          jdbc.password: m121212
#      - name: rdb
#        key: postgres1
#        properties:
#          jdbc.driverClassName: org.postgresql.Driver
#          jdbc.url: jdbc:postgresql://localhost:5432/postgres
#          jdbc.username: postgres
#          jdbc.password: 121212
#          threads: 1
#          commitSize: 3000
#      - name: hbase
#        properties:
#          hbase.zookeeper.quorum: 127.0.0.1
#          hbase.zookeeper.property.clientPort: 2181
#          zookeeper.znode.parent: /hbase
#      - name: es
#        hosts: 127.0.0.1:9300 # 127.0.0.1:9200 for rest mode
#        properties:
#          mode: transport # or rest
#          # security.auth: test:123456 #  only used for rest mode
#          cluster.name: elasticsearch
#        - name: kudu
#          key: kudu
#          properties:
#            kudu.master.address: 127.0.0.1 # ',' split multi address

說明: 

i、其中 outAdapter 的配置: name統一為rdb, key為對應的資料來源的唯一標識需和下面的表對映檔案中的outerAdapterKey對應, properties為目標庫jdbc的相關引數

ii、adapter將會自動載入 conf/rdb 下的所有.yml結尾的表對映配置檔案

2> 修改canal-adapter/conf/rdb資料夾下的yml檔案

說明:canal-adapter/conf/rdb資料夾下的yml檔案可以同步資料庫下的一張表,也可以同步資料庫下的所有表(此處的前提是:同步資料的資料庫與主庫的schema一致)

(1)同步資料庫下的某張表,例如同步test資料庫下的user表,操作如下:

cd /usr/local/canal/canal-adapter/conf/rdb
cp mytest_user.yml test_user.yml
rm -rf mytest_user.yml
vi test_user.yml

配置資訊如下:

dataSourceKey: defaultDS        # 源資料來源的key, 對應上面配置的srcDataSources中的值
destination: example            # cannal的instance或者MQ的topic
groupId:                        # 對應MQ模式下的groupId, 只會同步對應groupId的資料
outerAdapterKey: mysql1         # adapter key, 對應上面配置outAdapters中的key
concurrent: true                # 是否按主鍵hash並行同步, 並行同步的表必須保證主鍵不會更改及主鍵不能為其他同步表的外來鍵!
dbMapping:
  database: test                # 源資料來源的database/schema
  table: user                   # 源資料來源表名
  targetTable: test.user        # 目標資料來源的庫名.表名
  targetPk:                     # 主鍵對映
    id: id                      # 如果是複合主鍵可以換行對映多個
  mapAll: true                  # 是否整表對映, 要求源表和目標表欄位名一模一樣 (如果targetColumns也配置了對映, 則以targetColumns配置為準)
  #targetColumns:               # 欄位對映, 格式: 目標表欄位: 源表字段, 如果欄位名一樣源表字段名可不填
  #  id:
  #  name:
  #  role_id:
  #  c_time:
  #  test1: 

(2)同步資料庫下所有表資料,例如:同步test資料庫下所有表資料,操作如下:

cd /usr/local/canal/canal-adapter/conf/rdb
cp mytest_user.yml test_user.yml
rm -rf mytest_user.yml
vi test_user.yml

配置如下:

## Mirror schema synchronize config
dataSourceKey: defaultDS
destination: example
groupId: g1
outerAdapterKey: mysql1
concurrent: true
dbMapping:
  mirrorDb: true
  database: test

2.4.2、啟動canal-adapter

cd /usr/local/canal/canal-adapter/bin
./startup.sh

檢視日誌資訊,確保正常啟動。

cd /usr/local/canal/canal-adapter/logs/adapter
cat adapter.log

3、連線資料庫管理工具測試

在主庫(192.168.91.131)test資料庫下的user表中插入資料,檢視canal所在資料庫test下的user表中是否同步。