mysql-canal-rabbitmq 安裝部署超詳細教程
原文
1.1. 開啟 MySQL 的 binlog 日志
1.修改 my.cnf
或 my.ini
(windows), 添加配置項:
# binlog 日志存放路徑 log-bin=D:\env\mysql-5.7.28-winx64\binlog # 日志中記錄每一行數據被修改的形式 binlog-format=ROW # 當前機器的服務 ID, 如果為集群時不能重復 server_id=1
2.重啟 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)
配置 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
2.新建 Exchange
3.設置 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.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 無法啟動, 按一下幾個步驟檢查操作一下試試:
檢查集群裡的主配置
裡的canal.destinations
是否包含新建的實例instance
名稱;檢查canal-server
節點是否加載的canal_local.properties
配置文件;刪除實例文件夾下的 .db
, .bat
文件, 更新實例配置文件中的 canal.instance.master.position
的 binglog
位置後, 啟動 instance
;
1.5. canal 配置說明
1.5.1. canal.properties
- canal.ip, 該節點 IP
- canal.register.ip, 註冊到 zookeeper 上的 IP
- canal.zkServers, zk 集群
- 是否啟用 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
5.canal.destinations, 當前集群上部署的 instance 列表
6.canal.mq.servers, 設置 Rabbitmq 集群地址, !! 此處不可以加上端口
1.5.2. instance.properties
- canal.instance.master.address, master 數據庫地址
- canal.instance.master.journal.name, 在數據庫中執行show master status的File值
- canal.instance.master.position, 在數據庫中執行show master status的Position值
- canal.instance.tsdb.enable=false, 禁用 tsdb
- canal.instance.dbUsername, 實例數據庫用戶名
- canal.instance.dbPassword, 實例數據庫密碼
- canal.instance.filter.regex, 匹配需要同步的表
- 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 # 時間序列版本的數據庫連接密碼
2.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.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
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 的增量訂閱和消費)
Canal Admin 搭建 Canal 集群以及體驗
canal 整合RabbitMQ
canal系列—配置文件介紹
到此這篇關於mysql-canal-rabbitmq 安裝部署超詳細教程的文章就介紹到這瞭,更多相關mysql-canal-rabbitmq 安裝部署內容請搜索WalkonNet以前的文章或繼續瀏覽下面的相關文章希望大傢以後多多支持WalkonNet!
推薦閱讀:
- Canal監聽MySQL的實現步驟
- 淺談MySQL與redis緩存的同步方案
- MySQL高性能實現Canal數據同步神器
- Spring Boot + Canal 實現數據庫實時監控
- Springboot2.3.x整合Canal的示例代碼