mysql-canal-rabbitmq 安裝部署教程


原文

1.1. 開啟 MySQL 的 binlog 日志

  1. 修改 my.cnfmy.ini(windows), 添加配置項:
# binlog 日志存放路徑
log-bin=D:\env\mysql-5.7.28-winx64\binlog
# 日志中記錄每一行數據被修改的形式
binlog-format=ROW
# 當前機器的服務 ID, 如果為集群時不能重復
server_id=1
  1. 重啟 mysql 服務后, 查看配置變量是否生效:
mysql> show variables like '%log_bin%';
+---------------------------------+----------------------+
| Variable_name                   | Value                |
+---------------------------------+----------------------+
| log_bin                         | ON                   |
| log_bin_basename                | D:\env\mysql-5       |
| log_bin_index                   | D:\env\mysql-5.index |
| log_bin_trust_function_creators | OFF                  |
| log_bin_use_v1_row_events       | OFF                  |
| sql_log_bin                     | ON                   |
+---------------------------------+----------------------+
6 rows in set, 1 warning (0.00 sec)
  1. 配置 mysql 數據庫的 canal 用戶

mysql -uroot -p 登錄 mysql, 創建並授權用戶 canal;

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

1.2. 配置 rabbitmq Exchanges 和 Queues

  1. 新建 Queue

  1. 新建 Exchange

  1. 設置 Queue 里的 Bindings, 填寫 Exchange 名稱, 以及路由 Routing key;

1.3. 安裝單機 canal

1.3.1. 下載安裝

下載 並解壓縮;

sudo wget https://github.com/alibaba/canal/releases/download/canal-1.1.4/canal.deployer-1.1.4.tar.gz
sudo tar -zxvf canal.deployer-1.1.4.tar.gz

最新版本 1.1.5的安裝

sudo wget https://github.com/alibaba/canal/releases/download/canal-1.1.5-alpha-1/canal.deployer-1.1.5-SNAPSHOT.tar.gz
sudo tar -zxvf canal.deployer-1.1.5-SNAPSHOT.tar.gz

1.3.2. 配置文件

1.3.2.1. 節點配置文件 canal.properties

# tcp bind ip, 當前節點的 IP 地址
canal.ip = 192.168.2.108
# register ip to zookeeper, 注冊到 ZK 的 IP 地址, 如下圖1.
canal.register.ip = 192.168.2.108

canal.zkServers = zk集群

# tcp, kafka, RocketMQ, 最新版本 1.1.5 可以直接連接 rabbitmq
canal.serverMode = rabbitmq

# destinations, 當前 server 上部署的 instance 列表, 對應各個實例文件夾(../conf/<instance_name>)名稱
canal.destinations = example2

# 設置 mq 服務器地址, 此處為 rabbitmq 的服務器地址
# !! 此處下載后默認的配置是有配置IP:端口的
# rabbitmq 此處則不需要配置端口
canal.mq.servers = 192.168.208.100

# 一下幾項均為 1.1.5 新版本新增支持 rabbitmq 的配置
canal.mq.vhost=/
canal.mq.exchange=example2-ex # 指定 rabbitmq 上的 exchange 名稱, "新建 `Exchange`" 步驟新建的名稱
canal.mq.username=admin # 連接 rabbitmq 的用戶名
canal.mq.password=**** # 連接 rabbitmq 的密碼
canal.mq.aliyunuid=

圖1. canal 注冊到 zk 上的節點

1.3.2.2. 實例配置文件 instance.properties

# position info, 數據庫的連接信息
canal.instance.master.address=192.168.2.108:3306
# 以下兩個配置, 需要在上面配置的 address 的數據庫中執行 `SHOW MASTER STATUS` 獲取的 `File` 和 `Position` 兩個字段值
canal.instance.master.journal.name=mysql-5.7
canal.instance.master.position=674996

# table meta tsdb info, 禁用 tsdb 記錄 table meta 的時間序列版本
canal.instance.tsdb.enable=false

# username/password, 實例連接數據的用戶名和密碼
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal

# table regex, 正則匹配需要監聽的數據庫表
canal.instance.filter.regex=ysb\\.useropcosttimes_prod

# mq config, 指定 rabbitmq 設置綁定的路由, 詳見"配置rabbitmq"步驟里的第三步配置的`Routing key`
canal.mq.topic=example2-routingkey

1.3.3. 啟動 canal 服務

Linux 對應的啟動腳本 ./bin/startup.sh, Windows 對應的啟動腳本 ./bin/startup.bat; 以 Windows 為例:

λ .\startup.bat
start cmd :  java   -Xms128m -Xmx512m -XX:PermSize=128m  -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dapplication.codeset=UTF-8 -Dfile.encoding=UTF-8  -server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=9099,server=y,suspend=n  -DappName=otter-canal -Dlogback.configurationFile="d:\env\green\canal-1.1.5\bin\\..\conf\logback.xml" -Dcanal.conf="d:\env\green\canal-1.1.5\bin\\..\conf\canal.properties" -classpath "d:\env\green\canal-1.1.5\bin\\..\conf\..\lib\*;d:\env\green\canal-1.1.5\bin\\..\conf" java   -Xms128m -Xmx512m -XX:PermSize=128m  -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dapplication.codeset=UTF-8 -Dfile.encoding=UTF-8  -server -Xdebug -Xnoagent -Djava.compiler=NONE -Xrunjdwp:transport=dt_socket,address=9099,server=y,suspend=n  -DappName=otter-canal -Dlogback.configurationFile="d:\env\green\canal-1.1.5\bin\\..\conf\logback.xml" -Dcanal.conf="d:\env\green\canal-1.1.5\bin\\..\conf\canal.properties" -classpath "d:\env\green\canal-1.1.5\bin\\..\conf\..\lib\*;d:\env\green\canal-1.1.5\bin\\..\conf" com.alibaba.otter.canal.deployer.CanalLauncher
Java HotSpot(TM) Server VM warning: ignoring option PermSize=128m; support was removed in 8.0
Listening for transport dt_socket at address: 9099

最后手動修改數據庫數據, 或者等待其他的修改, 再查看一下 rabbitmq 上的監控即可知道流程是否走通了.

1.4. 安裝集群 canal

1.4.1. 安裝 canal-admin

1.4.1.1. 下載安裝

下載並解壓縮

sudo wget https://github.com/alibaba/canal/releases/download/canal-1.1.5-alpha-1/canal.admin-1.1.5-SNAPSHOT.tar.gz
sudo tar -zxvf canal.admin-1.1.5-SNAPSHOT.tar.gz

1.4.1.2. 配置文件

application.yml

server:
  port: 8089
spring:
  jackson:
    date-format: yyyy-MM-dd HH:mm:ss
    time-zone: GMT+8

spring.datasource:
  address: 192.168.2.108:3306
  database: canal_manager
  username: canal
  password: canal
  driver-class-name: com.mysql.jdbc.Driver
  # 數據庫連接字符串末尾需添加`serverTimezone=UTC`, 否則啟動時會報時區異常;
  url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false&serverTimezone=UTC
  hikari:
    maximum-pool-size: 30
    minimum-idle: 1

canal:
  # 配置 canal-admin 的管理員賬號和密碼
  adminUser: admin
  adminPasswd: 123456

canal_manager.sql

在管理canal-admin數據的數據庫中執行該 sql 腳本, 初始化一些表;

1.4.1.3. 啟動 canal-admin 服務

Linux 對應的啟動腳本 ./bin/startup.sh, Windows 對應的啟動腳本 ./bin/startup.bat; 以 Windows 為例:

λ .\startup.bat
start cmd :  java   -Xms128m -Xmx512m  -Djava.awt.headless=true -Djava.net.preferIPv4Stack=true -Dapplication.codeset=UTF-8 -Dfile.encoding=UTF-8  -DappName=canal-admin -classpath "D:\env\green\canal-1.1.5-admin\bin\\..\conf\..\lib\*;D:\env\green\canal-1.1.5-admin\bin\\..\conf" com.alibaba.otter.canal.admin.CanalAdminApplication
2020-04-13 20:01:39.495 [main] INFO  com.alibaba.otter.canal.admin.CanalAdminApplication - Starting CanalAdminApplication on Memento-PC with PID 50696 (D:\env\green\canal-1.1.5-admin\lib\canal-admin-server-1.1.5-SNAPSHOT.jar started by Memento in D:\env\green\canal-1.1.5-admin\bin)
2020-04-13 20:01:39.527 [main] INFO  com.alibaba.otter.canal.admin.CanalAdminApplication - No active profile set, falling back to default profiles: default
2020-04-13 20:01:39.566 [main] INFO  o.s.b.w.s.c.AnnotationConfigServletWebServerApplicationContext - Refreshing org.springframework.boot.web.servlet.context.AnnotationConfigServletWebServerApplicationContext@13a5bf6: startup date [Mon Apr 13 20:01:39 CST 2020]; root of context hierarchy
2020-04-13 20:01:41.149 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat initialized with port(s): 8089 (http)
2020-04-13 20:01:41.166 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Initializing ProtocolHandler ["http-nio-8089"]
2020-04-13 20:01:41.176 [main] INFO  org.apache.catalina.core.StandardService - Starting service [Tomcat]
2020-04-13 20:01:41.177 [main] INFO  org.apache.catalina.core.StandardEngine - Starting Servlet Engine: Apache Tomcat/8.5.29
...
2020-04-13 20:01:42.996 [main] INFO  org.apache.coyote.http11.Http11NioProtocol - Starting ProtocolHandler ["http-nio-8089"]
2020-04-13 20:01:43.007 [main] INFO  org.apache.tomcat.util.net.NioSelectorPool - Using a shared selector for servlet write/read
2020-04-13 20:01:43.019 [main] INFO  o.s.boot.web.embedded.tomcat.TomcatWebServer - Tomcat started on port(s): 8089 (http) with context path ''
2020-04-13 20:01:43.024 [main] INFO  com.alibaba.otter.canal.admin.CanalAdminApplication - Started CanalAdminApplication in 3.919 seconds (JVM running for 5.241)

1.4.1.4. 注意事項

canal-admin 連接數據庫的賬號, 必須有建表, 讀寫數據的權限, 如果還是采用上文中創建的 canal 賬號, 需要另外擴展一下權限:

GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;

1.4.2. 添加單機 canal-server 節點

1.4.2.1. 啟動 canal-server 節點服務

單機 canal-server 照常啟動, 此時, canal-server 默認加載的 ../conf/canal.properties 里的配置信息, 可以從 ../bin/startup.bat[startup.sh] 腳本中獲悉, 獲取從執行的腳本命令提示里獲悉;

1.4.2.2. 新建單機 server

canal-admin 中新建一個單機 server

server 會自動識別已啟動的 canal-server 節點, 但是此時由 admin 接管后, 不會自動加載 ../conf/canal.properties 的配置文件, 點擊最右側的 操作-配置 查看, 該 server 加載的是默認的配置信息


需要手動將 1.3.2 中配置好的 ../conf/canal.properties 里的配置信息拷貝到該配置里進行覆蓋!

1.4.2.3. 新建實例 instance

手動在 canal-admin 中新建一個 instance, 對應單機 canal-server 配置下的實例 example2; 同樣, 需要手動將 ./conf/<實例名稱>/instance.properies 配置文件手動拷貝到 admin 中

!!注意
在新建或啟動 instance 實例時, 先刪除實例文件夾下的 meta.dat 文件, 並更新 canal.instance.master.journal.name=..., canal.instance.master.position=... 兩個配置項;

1.4.3. 添加集群 canal-server 節點

1.4.3.1. 新建集群

需要指定集群名稱, 以及配置集群綁定的 zookeeper 集群地址;

新建成功后, 在最右側的 操作-主配置 中配置集群的通用 server 配置信息

此處也可以將之前配置的 ../conf/canal.properties 配置直接拷貝過來, 稍微修改一下就可以用了

# canal admin config
canal.admin.manager = 192.168.2.108:8089

canal.instance.global.mode = manager

1.4.3.2. 新建 server

指定所屬集群, 為 1.4.3.1 中設定的集群名稱;

如果先前已經啟動了 canal-server 節點服務, 則新建的 server 會自動識別為 啟動 狀態, 否則為 斷開 狀態;

這里有一點需要十分注意的地方

細心的人可能會發現, 除了 canal.properties 配置文件, 還有一個 canal_local.properties 的配置文件, 后者比前者的內容少了很多, 因為這個文件就是用於搭建 canal 集群時, 本地節點的配置文件, 而前者配置文件里的其他信息都是交由 canal-admin 集中配置管理的;

./bin/startup.bat[startup.sh] 啟動腳本里, 默認是加載 canal.properties 配置文件, 即以單機形式啟動的服務;

windows 在搭建 canal 集群時, 需要手動修改 startup.bat, 藍色標注處是加載 %canal_conf% 變量的配置文件路徑, 所以需要將紅色框內的變量調整為:

@rem set canal_conf=...
set canal_conf=%conf_dir%\canal_local.properties

使啟動時加載 canal_local.properties 的配置文件

1.4.3.3. 新建 instance

此處配置也可以基於單機 server 中的實例 1.4.2.3 配置進行調整使用;

# 2. position info, 指定 mysql 開始同步的 binlog 位置信息
canal.instance.master.address=192.168.0.25:63306
canal.instance.master.journal.name=mysql-bin.001349
canal.instance.master.position=198213313

# 3. username/password, 設置同步 mysql 的數據庫用戶名和密碼
canal.instance.dbUsername=xxxx
canal.instance.dbPassword=xxx

# 4. table regex, 正則匹配需要同步的數據表
canal.instance.filter.regex=xxxx

# 5. mq config, 指定 mysql 上的路由綁定, 見 `1.2.3`
canal.mq.topic=example2-routingkey

保存后即可在 操作 中啟動該實例

后話
如果此處的 instance 無法啟動, 按一下幾個步驟檢查操作一下試試:

  1. 檢查集群里的主配置里的canal.destinations是否包含新建的實例instance名稱;
  2. 檢查canal-server節點是否加載的canal_local.properties配置文件;
  3. 刪除實例文件夾下的 .db, .bat 文件, 更新實例配置文件中的 canal.instance.master.positionbinglog 位置后, 啟動 instance;

1.5. canal 配置說明

1.5.1. canal.properties

  1. canal.ip, 該節點 IP
  2. canal.register.ip, 注冊到 zookeeper 上的 IP
  3. canal.zkServers, zk 集群
  4. 是否啟用 tsdb, 開啟 table meta 的時間序列版本記錄功能
    // 5. canal.serverMode, 設置為 rabbitmq, 默認為 tcp
canal.instance.tsdb.enable = true
canal.instance.tsdb.dir = ${canal.file.data.dir:../conf}/${canal.instance.destination:}
canal.instance.tsdb.url = jdbc:h2:${canal.instance.tsdb.dir}/h2;CACHE_SIZE=1000;MODE=MYSQL;
canal.instance.tsdb.dbUsername = canal
canal.instance.tsdb.dbPassword = canal
  1. canal.destinations, 當前集群上部署的 instance 列表
  2. canal.mq.servers, 設置 Rabbitmq 集群地址, !! 此處不可以加上端口

1.5.2. instance.properties

  1. canal.instance.master.address, master 數據庫地址
  2. canal.instance.master.journal.name, 在數據庫中執行show master statusFile
  3. canal.instance.master.position, 在數據庫中執行show master statusPosition
  4. canal.instance.tsdb.enable=false, 禁用 tsdb
  5. canal.instance.dbUsername, 實例數據庫用戶名
  6. canal.instance.dbPassword, 實例數據庫密碼
  7. canal.instance.filter.regex, 匹配需要同步的表
  8. canal.mq.topic, canal 注冊 mq 的 topic 名稱

1.5.3. properties 配置文件

properties 配置分為兩部分

canal.properties (系統根配置文件)
instance.properties (instance 級別的配置文件, 每個實例一份)

  1. canal.properties
canal.destinations # 當前 server 上部署的 instance 列表
canal.conf.dir # conf 目錄所在路徑
canal.auto.scan # 開啟 instance 自動掃描
# 如果配置為 true, canal.conf.dir 目錄下的 instance 配置變化會自動觸發
# 1. instance 目錄新增: 觸發 instance 配置載入, lazy 為 true 時則自動啟動;
# 2. instance 目錄刪除: 卸載對應 instance 配置, 如已啟動則進行關閉;
# 3. instance.properties 文件變化: reload instance 配置, 如已啟動則自動進行重啟操作;
canal.auto.scan.interval # instance 自動掃描間隔時間, 單位 s
canal.instance.global.mode # 全局配置加載方式
canal.instance.global.lazy # 全局 lazy 模式
canal.instance.global.manager.address # 全局的 manager 配置方式的鏈接信息
canal.instance.global.spring.xml # 全局的 spring 配置方式的組件文件
canal.instance.example.mode
canal.instance.example.lazy
canal.instance.example.spring.xml
# instance 級別的配置定義, 如有配置, 會自動覆蓋全局配置定義模式

canal.instance.tsdb.enable # 是否開啟 table meta 的時間序列版本記錄功能
canal.instance.tsdb.dir # 時間序列版本的本地存儲路徑, 默認為 instance 目錄
canal.instance.tsdb.url # 時間序列版本的數據庫連接地址, 默認為本地嵌入式數據庫
canal.instance.tsdb.dbUsername # 時間序列版本的數據庫連接賬號
canal.instance.tsdb.dbPassword # 時間序列版本的數據庫連接密碼
  1. instance.properties
canal.id # 每個 canal server 實例的唯一標識
canal.ip # canal server 綁定的本地 IP 信息, 如果不配置, 默認選擇一個本機 IP 進行啟動服務
canal.port # canal server 提供 socket 服務的端口
canal.zkServers # canal server 連接 zookeeper 集群的連接地址, 例如: 10.20.144.22:2181,10.20.144.23:2181
canal.zookeeper.flush.period # canal 持久化數據到 zookeeper 上的更新頻率, 單位 ms
canal.instance.memory.batch.mode # canal 內存 store 中數據緩存模式
# 1. ITEMSIZE: 根據 buffer.size 進行限制, 只限制記錄的數量
# 2. MEMSIZE: 根據 buffer.size * buffer.memunit 的大小, 限制緩存記錄的大小;
canal.instance.memory.buffer.size # canal 內存 store 中可緩存 buffer 記錄數, 需要為 2 的指數
canal.instance.memory.buffer.memunit # 內存記錄的單位大小, 默認為 1KB, 和 buffer.size 組合決定最終的內存使用大小
canal.instance.transactions.size # 最大事務完整解析的長度支持, 超過該長度后, 一個事務可能會被拆分成多次提交到 canal store 中, 無法保證事務的完整可見性
canal.instance.fallbackIntervalInSeconds # canal 發生 mysql 切換時, 在新的 mysql 庫上查找 binlog 時需要往前查找的時間, 單位 s
# 說明: mysql 主備庫可能存在解析延遲或者時鍾不一致, 需要回退一段時間, 保證數據不丟
canal.instance.detecting.enable # 是否開啟心跳檢查
canal.instance.detecting.sql # 心跳檢查 sql, insert into retl.xdual values(1,now()) on duplicate key update x=now()
canal.instance.detecting.interval.time # 心跳檢查頻率, 單位 s
canal.instance.detecting.retry.threshold # 心跳檢查失敗重試次數
canal.instance.detecting.heatbeatHaEnable # 心跳檢查失敗后, 是否開啟 mysql 自動切換
# 說明: 比如心跳檢查失敗超過閾值后, 如果該配置為 true, canal 會自動連到 mysql 備庫獲取 binlog 數據
canal.instance.network.receiveBufferSize # 網絡連接參數, SocketOptions.SO_RCVBUF
canal.instance.network.sendBufferSize # 網絡連接參數, SocketOptions.SO_SNDBUF
canal.instance.network.soTimeout # 網絡連接參數, SocketOptions.SO_TIMEOUT

1.5.4. canal.mq.dynamicTopic

參考: https://github.com/alibaba/canal/wiki/Canal-Kafka-RocketMQ-QuickStart?tdsourcetag=s_pctim_aiomsg

1.6. 問題處理

  1. windows 下執行 startup.bat 啟動 canal 時, 出現如下異常
Failed to instantiate [ch.qos.logback.classic.LoggerContext]
Reported exception:
ch.qos.logback.core.LogbackException: Unexpected filename extension of file [file:/D:/env/green/canal/conf/]. Should be either .groovy or .xml
        at ch.qos.logback.classic.util.ContextInitializer.configureByResource(ContextInitializer.java:79)
        at ch.qos.logback.classic.util.ContextInitializer.autoConfig(ContextInitializer.java:152)
        at org.slf4j.impl.StaticLoggerBinder.init(StaticLoggerBinder.java:85)
        at org.slf4j.impl.StaticLoggerBinder.<clinit>(StaticLoggerBinder.java:55)
        at org.slf4j.LoggerFactory.bind(LoggerFactory.java:141)
        at org.slf4j.LoggerFactory.performInitialization(LoggerFactory.java:120)
        at org.slf4j.LoggerFactory.getILoggerFactory(LoggerFactory.java:331)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:283)
        at org.slf4j.LoggerFactory.getLogger(LoggerFactory.java:304)
        at com.alibaba.otter.canal.deployer.CanalLauncher.<clinit>(CanalLauncher.java:29)

解決方法:
startup.bat 里的一下這行代碼注釋打開
@rem set logback_configurationFile=%conf_dir%\logback.xml

注, 新版 1.1.5 不存在該問題, 1.1.5這個文件中的這一行是沒有注釋掉的.

  1. 1.1.5新版本 canal-admin 啟動時出現如下異常:
2020-04-10 18:55:40.406 [main] ERROR com.zaxxer.hikari.pool.HikariPool - HikariPool-1 - Exception during pool initialization.
java.sql.SQLException: The server time zone value '�й���׼ʱ��' is unrecognized or represents more than one time zone. You must configure either the server or JDBC driver (via the serverTimezone configuration property) to use a more specifc time zone value if you want to utilize time zone support.

解決方法

spring.datasource.url 配置的 mysql 連接地址后面加上參數 &serverTimezone=UTC

  1. Instance 日志里出現異常 errno = 1236, sqlstate = HY000 errmsg = log event entry exceeded max_allowed_packet;
2020-04-13 13:06:09.507 [destination = example3 , address = /192.168.2.108:3306 , EventParser] ERROR com.alibaba.otter.canal.common.alarm.LogAlarmHandler - destination:example3[java.io.IOException: Received error packet: errno = 1236, sqlstate = HY000 errmsg = log event entry exceeded max_allowed_packet; Increase max_allowed_packet on master; the first event 'mysql-5.7' at 671745, the last event read from 'D:\env\mysql-5.7' at 673181, the last byte read from 'D:\env\mysql-5.7' at 673200.
	at com.alibaba.otter.canal.parse.inbound.mysql.dbsync.DirectLogFetcher.fetch(DirectLogFetcher.java:102)
	at com.alibaba.otter.canal.parse.inbound.mysql.MysqlConnection.dump(MysqlConnection.java:235)
	at com.alibaba.otter.canal.parse.inbound.AbstractEventParser$3.run(AbstractEventParser.java:265)
	at java.lang.Thread.run(Unknown Source)
]

解決方法

刪除 canal/conf 下對應實例里的 meta.dat 文件, 讓 canal-admin 自動再生成即可;

1.7. 參考資料


免責聲明!

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



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