Canal叢集快速搭建

1、介紹說明

名稱:canal [kə‘næl]

譯意: 水道/管道/溝渠

語言: 純java開發

定位: 基於資料庫增量日誌解析,提供增量資料訂閱&消費,目前主要支援了mysql

2、工作原理

2.1、MySQL主備複製實現

Canal叢集快速搭建

從上圖來看,複製分成三步:

Master將改變記錄到二進位制日誌(binary log)中(這些記錄叫做二進位制日誌事件,binary log events,可以透過show binlog events進行檢視);

Slave將Master的binary log events複製到它的中繼日誌(relay log);

Slave重做中繼日誌中的事件,將改變反映它自己的資料。

2.2、Canal的工作原理

Canal叢集快速搭建

圖1

原理相對比較簡單:

Canal模擬MySQL Slave的互動協議,偽裝自己為MySQL Slave,向MySQL Master傳送dump協議

MySQL Master收到dump請求,開始推送binary log給Slave(也就是Canal)

Canal解析binary log物件(原始為byte流)

3、伺服器列表

主機IP

主機名稱

記憶體需求

作用說明

xxx。xxx。xxx。xxx

canal01

8G

Master

xxx。xxx。xxx。xxx

canal02

8G

Standby

xxx。xxx。xxx。xxx

canal03

8G

Standby

4。 環境要求

OS: Linux only, CentOS 6。5+

JDK: 1。8+ ,參見:Java環境快速搭建

Zokeerper: 3。4。5

Kafka: 2。11-1。0。1

5。 準備工作

Canal-1。1。3下載地址:https://github。com/alibaba/canal/releases/tag/canal-1。1。3

Canal GitHub:https://github。com/alibaba/canal

a) Canal的原理是基於MySQL binlog技術,所以這裡一定需要開啟Mysql的binlog寫入功能,建議配置binlog模式為row。

[mysqld]log-bin=mysql-bin #新增這一行就okbinlog-format=ROW #選擇row模式server_id=1 #配置MySQL replaction需要定義,不能和Canal的SlaveId重複

b) Canal的原理是模擬自己為MySQL Slave,所以這裡一定需要做為MySQL Slave的相關許可權。

CREATE USER canal IDENTIFIED BY ’canal‘; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *。* TO ’canal‘@’%‘;—— GRANT ALL PRIVILEGES ON *。* TO ’canal‘@’%‘ ;FLUSH PRIVILEGES;

6、HA配置

6。1、檔案解壓

mkdir canal-1。1。3tar -xzf canal。deployer-1。1。3-SNAPSHOT。tar。gz -C canal-1。1。3

6。2、canal。properties配置

vim $CANAL_HOME/conf/canal。properties

# zk叢集配置canal。zkServers = zk1:2181,zk2:2181,zk3:2181# 資料模式:tcp, kafka, RocketMQcanal。serverMode = kafka# binlog filter configcanal。instance。filter。druid。ddl = truecanal。instance。filter。query。dcl = truecanal。instance。filter。query。dml = falsecanal。instance。filter。query。ddl = truecanal。instance。filter。table。error = truecanal。instance。filter。rows = falsecanal。instance。filter。transaction。entry = false#監控例項,根據產品劃分,多個以逗號分割canal。destinations = test# Canal HA 配置canal。instance。global。spring。xml = classpath:spring/default-instance。xml# Kafka叢集配置canal。mq。servers = kafka1:9092,kafka2:9092,kafka3:9092

6。3、instance。properties配置

vim $CANAL_HOME/conf/產品ID/instance。properties

# 全域性唯一標識不能重複即可canal。instance。mysql。slaveId=11# MysQL的Binlog伺服器地址canal。instance。master。address=[host|ip]:portcanal。instance。dbUsername=使用者名稱canal。instance。dbPassword=密碼canal。instance。connectionCharset = UTF-8canal。instance。defaultDatabaseName = 預設庫名# Perl正則表示式過濾canal。instance。filter。regex=庫名1\\。。*,庫名2\\。。*# 資料裝載指定topiccanal。mq。topic=test

7、啟動Canal

# 啟動兩臺伺服器上的Canalcd canal-1。1。3。/bin/startup。sh# 啟動後,可以檢視logs/產品ID/產品ID。log,只會看到一臺機器上出現了啟動成功的日誌。

8、停止Canal

# 停止兩臺伺服器上的Canalcd canal-1。1。3。/bin/startup。sh

9、HA測試

zookeeper-client# 檢視Canal HA註冊主機節點[zk: localhost:2181(CONNECTED) 15] ls /otter/canal/destinations/產品ID/cluster# 檢視正在執行中的Canal節點[zk: localhost:2181(CONNECTED) 15] get /otter/canal/destinations/產品ID/running # 測試Kafka是否正常顯示消費Topic資料kafka-console-consumer。sh ——zookeeper zkHost:2181 ——topic 產品ID ——from-beginning

10、參考資料

Canal Wiki:https://github。com/alibaba/canal/wiki

總結:對於MySQL實時biglog採集Canal還是不錯的選擇,目前公司binlog採用則使用Canal進行資料收集。