mysql-canal-rabbitmq 安裝部署教程
阿新 • • 發佈:2021-03-08
[原文](https://www.cnblogs.com/memento/p/14497908.html)
## 1.1. 開啟 MySQL 的 binlog 日誌
1. 修改 `my.cnf` 或 `my.ini`(windows), 新增配置項:
```ini
# binlog 日誌存放路徑
log-bin=D:\env\mysql-5.7.28-winx64\binlog
# 日誌中記錄每一行資料被修改的形式
binlog-format=ROW
# 當前機器的服務 ID, 如果為叢集時不能重複
server_id=1
```
2. 重啟 mysql 服務後, 檢視配置變數是否生效:
```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)
```
3. 配置 mysql 資料庫的 `canal` 使用者
`mysql -uroot -p` 登入 mysql, 建立並授權使用者 `canal`;
```mysql
CREATE USER canal IDENTIFIED BY 'canal';
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;
```
## 1.2. 配置 rabbitmq Exchanges 和 Queues
1. 新建 `Queue`
![](https://img2020.cnblogs.com/blog/335284/202103/335284-20210308091134562-1825999838.png)
2. 新建 `Exchange`
![](https://img2020.cnblogs.com/blog/335284/202103/335284-20210308091134832-2001082232.png)
3. 設定 Queue 裡的 Bindings, 填寫 `Exchange` 名稱, 以及路由 `Routing key`;
![](https://img2020.cnblogs.com/blog/335284/202103/335284-20210308091135214-1447572207.png)
## 1.3. 安裝單機 canal
### 1.3.1. 下載安裝
[下載](https://github.com/alibaba/canal/releases) 並解壓縮;
```
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
```conf
# 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/)名稱
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 上的節點](https://img2020.cnblogs.com/blog/335284/202103/335284-20210308091135467-237960350.png)
#### 1.3.2.2. 例項配置檔案 instance.properties
```conf
# 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 上的監控即可知道流程是否走通了.
![](https://img2020.cnblogs.com/blog/335284/202103/335284-20210308091135741-972822539.png)
## 1.4. 安裝叢集 canal
### 1.4.1. 安裝 canal-admin
#### 1.4.1.1. 下載安裝
[下載](https://github.com/alibaba/canal/releases/download/canal-1.1.5-alpha-1/canal.admin-1.1.5-SNAPSHOT.tar.gz)並解壓縮
```
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`
![](https://img2020.cnblogs.com/blog/335284/202103/335284-20210308091136005-1069218663.png)
該 `server` 會自動識別已啟動的 `canal-server` 節點, 但是此時由 `admin` 接管後, 不會自動載入 `../conf/canal.properties` 的配置檔案, 點選最右側的 `操作-配置` 檢視, 該 server 載入的是預設的配置資訊
![](https://img2020.cnblogs.com/blog/335284/202103/335284-20210308091136233-2091708899.png)
![](https://img2020.cnblogs.com/blog/335284/202103/335284-20210308091136474-160987792.png)
需要手動將 `1.3.2` 中配置好的 `../conf/canal.properties` 裡的配置資訊拷貝到該配置裡進行覆蓋!
#### 1.4.2.3. 新建例項 instance
手動在 `canal-admin` 中新建一個 `instance`, 對應單機 `canal-server` 配置下的例項 `example2`; 同樣, 需要手動將 `./conf/<例項名稱>/instance.properies` 配置檔案手動拷貝到 admin 中
![](https://img2020.cnblogs.com/blog/335284/202103/335284-20210308091136869-972020812.png)
![](https://img2020.cnblogs.com/blog/335284/202103/335284-20210308091137163-1746575513.png)
**!!注意**
在新建或啟動 `instance` 例項時, 先刪除例項資料夾下的 `meta.dat` 檔案, 並更新 `canal.instance.master.journal.name=...`, `canal.instance.master.position=...` 兩個配置項;
### 1.4.3. 新增叢集 canal-server 節點
#### 1.4.3.1. 新建叢集
需要指定叢集名稱, 以及配置叢集繫結的 `zookeeper` 叢集地址;
![](https://img2020.cnblogs.com/blog/335284/202103/335284-20210308091137394-1518151164.png)
新建成功後, 在最右側的 `操作-主配置` 中配置叢集的通用 server 配置資訊
![](https://img2020.cnblogs.com/blog/335284/202103/335284-20210308091137622-888447436.png)
此處也可以將之前配置的 `../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` 中設定的叢集名稱;
![](https://img2020.cnblogs.com/blog/335284/202103/335284-20210308091137963-2003338516.png)
如果先前已經啟動了 `canal-server` 節點服務, 則新建的 server 會自動識別為 `啟動` 狀態, 否則為 `斷開` 狀態;
![](https://img2020.cnblogs.com/blog/335284/202103/335284-20210308091138203-1070724378.png)
**這裡有一點需要十分注意的地方**
細心的人可能會發現, 除了 `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` 的配置檔案
![](https://img2020.cnblogs.com/blog/335284/202103/335284-20210308091138420-198461428.png)
#### 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
```
儲存後即可在 操作 中啟動該例項
![](https://img2020.cnblogs.com/blog/335284/202103/335284-20210308091138728-288682447.png)
> 後話
> 如果此處的 instance 無法啟動, 按一下幾個步驟檢查操作一下試試:
>
> 1. 檢查叢集裡的`主配置`裡的`canal.destinations`是否包含新建的例項`instance`名稱;
> 2. 檢查`canal-server`節點是否載入的`canal_local.properties`配置檔案;
> 3. 刪除例項資料夾下的 `.db`, `.bat` 檔案, 更新例項配置檔案中的 `canal.instance.master.position` 的 `binglog` 位置後, 啟動 `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
```conf
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
```
5. canal.destinations, 當前叢集上部署的 instance 列表
6. canal.mq.servers, 設定 Rabbitmq 叢集地址, !! 此處不可以加上埠
### 1.5.2. instance.properties
1. canal.instance.master.address, master 資料庫地址
2. canal.instance.master.journal.name, 在資料庫中執行`show master status`的`File`值
3. canal.instance.master.position, 在資料庫中執行`show master status`的`Position`值
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
```conf
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 # 時間序列版本的資料庫連線密碼
```
2. instance.properties
```conf
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://img2020.cnblogs.com/blog/335284/202103/335284-20210308091138976-1761814551.png)
> 參考:
## 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.(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.(CanalLauncher.java:29)
```
**解決方法**:
將 `startup.bat` 裡的一下這行程式碼註釋開啟
`@rem set logback_configurationFile=%conf_dir%\logback.xml`
注, 新版 `1.1.5` 不存在該問題, `1.1.5`這個檔案中的這一行是沒有註釋掉的.
2. `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`
3. `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. 參考資料
- [canal(基於 mysql 資料庫 binlog 的增量訂閱和消費)](https://www.jianshu.com/p/6299048fad66)
- [Canal Admin 搭建 Canal 叢集以及體驗](https://www.itgrocery.cn/posts/99c08147/)
- [canal 整合RabbitMQ](https://www.jianshu.com/p/60a9176a8825)
- [canal系列—配置檔案介紹](https://blog.csdn.net/u012758088/article/details/7