「從零單排canal 02」canal集羣版 + admin控制檯 最新搭建姿式(基於1.1.4版本)

canal [kə'næl],譯意爲水道/管道/溝渠,主要用途是基於 MySQL 數據庫增量日誌解析,提供增量數據 訂閱 和 消費。應該是阿里雲DTS(Data Transfer Service)的開源版本,開源地址:
https://github.com/alibaba/canal。mysql

canal從1.1.4版本開始引入了admin控制檯,有了不少不同的配置方式。在搭建過程當中若是僅僅按照wiki的用戶手冊,仍是容易踩不少坑的。所以,將筆者在搭建過程當中的步驟記錄下來,做爲官方wiki的 補充,但願能有所幫助。git

根據本文內容與搭建順序 ,並搭配對應的官網文檔連接,應該就能快速搭建完成了,enjoy~github

1. 部署canal-admin

1)部署服務

官方文檔地址:
https://github.com/alibaba/canal/wiki/Canal-Admin-QuickStartspring

主要配置application.yml文件sql

server:
  port: 8089

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

spring.datasource:
  address: 127.0.0.1:3306
  database: canal_manager
  username: xxxx
  assword: xxxxx
  driver-class-name: com.mysql.jdbc.Driver
  url: jdbc:mysql://${spring.datasource.address}/${spring.datasource.database}?useUnicode=true&characterEncoding=UTF-8&useSSL=false
  hikari:
    maximum-pool-size: 30
    minimum-idle: 1

canal:
  adminUser: admin
  adminPasswd: admin

 

這裏須要注意,canal的adminPasswd並非登錄admin的密碼,登錄admin的密碼是設置在對應的數據庫中的,默認爲123456。數據庫

另外,由於 Canal Admin 是一個管理系統,須要使用數據庫存放配置信息,只用在 MySQL 中執行 Canal Admin 提供的數據庫初始化文件便可,該文件在「conf/canal_manager.sql」路徑下面。json

2)登錄瀏覽器訪問

上面的 Canal Admin 配置好了以後直接根據「/bin/startup.sh」啓動 Canal Admin 便可,在瀏覽器上面輸入 hostip:8089 便可進入到管理頁面,若是使用的默認的配置信息,用戶名入」admin」,密碼輸入」123456」便可訪問首頁。瀏覽器

進入到首頁點擊集羣的菜單欄,而後選擇新建集羣。bash

在裏面輸入集羣的名稱以及 Zookeeper便可,這裏的集羣目前尚未任務節點,後續經過配置 Canal Server 的自動註冊功能,即可以查看該集羣下面擁有的節點。app

建立集羣后,須要先配置集羣 主配置,載入模板便可。

若是沒有載入這個模版,那麼在canal-server執行 sh bin/startup.sh local 命令,讀取canal_local.propeties配置啓動時,會報錯

1 Caused by: com.alibaba.otter.canal.common.CanalException: requestGet for canal config error: canal.properties config is empty

 

注意,在主配置中,仍是須要記得加入zk的地址配置,跟上面配置集羣名字的時候輸入的zk無關 (那個zk地址不知道有啥用):

canal.zkServers = xxx.xx.xx.xx:2181,xxx.xx.xx.xx:2181,xxx.xx.xx.xx:2181

 

若是但願使用canal的集羣模式(推薦使用),記得更改配置使用default-instance.xml,不要使用file-instance.xml配置,以下:

#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml
#canal.instance.global.spring.xml = classpath:spring/file-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml

2. 部署canal-server

注意,建議先部署好admin,再來部署canal-server,省事很多。

官方文檔地址:
https://github.com/alibaba/canal/wiki/QuickStart

注意,不一樣於單機版的properties配置,使用admin後,各類配置經過admin全局管理,因此只須要配置canal_local.properties便可。canal_local.properties內容以下:

# register ip
canal.register.ip =

# canal admin config
canal.admin.manager = 127.0.0.1:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = xxxxxxxxxxxxxx

# admin auto register
canal.admin.register.auto = true
canal.admin.register.cluster =

 

對各個參數說明一下:

  • canal.register.ip:用來指定當前 Canal Server 的 IP 信息,若是主機是多網卡,能夠避免 IP 信息錯亂的問題。
  • canal.admin.passwd:這裏的密碼就是以前配置 Canal Admin 裏面配置的adminPasswd,只不過這裏並非明文展現,使用 MySQL 的」select password("admin")」語句查詢處理過的密碼,注意查詢結果前面的」*」要去掉。
  • canal.admin.register.auto:這裏是自動註冊的意思,若是沒有配置,Canal Server 啓動後須要自行在 Canal Admin 上面添加。
  • canal.admin.register.cluster:這個配置若是不寫表明當前的 Canal Server 是一個單機節點,若是添加的名字在 Canal Admin 上面沒有提早註冊,Canal Server 啓動時會報錯。

啓動server,切記切記帶上參數local,這樣纔會讀取canal_local.properties的配置

sh bin/startup.sh local
啓動完成後,能夠在admin界面看到server的鏈接信息
canal集羣版 + admin控制檯 最新搭建姿式(基於1.1.4版本)

 

同時,登錄zk,查看是否已經註冊成功。

canal集羣版 + admin控制檯 最新搭建姿式(基於1.1.4版本)

 

3. 配置canal-server

採用admin的集羣模式後,集羣內的canal-server經過zk作HA,所以,canal-server的配置也只能經過集羣作全局配置。

就是前面的集羣配置-主配置進入。

canal集羣版 + admin控制檯 最新搭建姿式(基於1.1.4版本)

 

另外,canal做爲一個增量數據抓取模塊,抓到變動信息後須要投遞。

經過canal.sererMode配置

這裏也限制了,一個集羣內的canal只能支持一種投遞模式。

咱們目前暫時以投遞RocketMQ爲例進行配置。

官方文檔地址:
https://github.com/alibaba/canal/wiki/Canal-Kafka-RocketMQ-QuickStart

最終配置文件的配置以下:

#################################################
#########         common argument        #############
#################################################

# tcp bind ip
canal.ip =

# register ip to zookeeper
canal.register.ip =
canal.port = 11111
canal.metrics.pull.port = 11112

# canal instance user/passwd
canal.user = xxxx
canal.passwd = xxxxxxxxxxxxxxxxxxx

# canal admin config
canal.admin.manager = 127.0.0.1:8089
canal.admin.port = 11110
canal.admin.user = xxxx
canal.admin.passwd = xxxxxxxxxxxxxx
canal.zkServers = xx.xx.xx.xx:xxxx,xx.xx.xx.xxx:xxxx,xx.xx.xx.xx:xxxx

# flush data to zk
canal.zookeeper.flush.period = 1000
canal.withoutNetty = false

# tcp, kafka, RocketMQ
canal.serverMode = RocketMQ

# flush meta cursor/parse position to file
canal.file.data.dir = ${canal.conf.dir}
canal.file.flush.period = 1000

## memory store RingBuffer size, should be Math.pow(2,n)
canal.instance.memory.buffer.size = 16384

## memory store RingBuffer used memory unit size , default 1kb
canal.instance.memory.buffer.memunit = 1024

## meory store gets mode used MEMSIZE or ITEMSIZE
canal.instance.memory.batch.mode = MEMSIZE
canal.instance.memory.rawEntry = true

## detecing config
canal.instance.detecting.enable = false

#canal.instance.detecting.sql = insert into retl.xdual values(1,now()) on duplicate key update x=now()
canal.instance.detecting.sql = select 1
canal.instance.detecting.interval.time = 3
canal.instance.detecting.retry.threshold = 3
canal.instance.detecting.heartbeatHaEnable = false

# support maximum transaction size, more than the size of the transaction will be cut into multiple transactions delivery
canal.instance.transaction.size =  1024

# mysql fallback connected to new master should fallback times
canal.instance.fallbackIntervalInSeconds = 60

# network config
canal.instance.network.receiveBufferSize = 16384
canal.instance.network.sendBufferSize = 16384
canal.instance.network.soTimeout = 30

# binlog filter config
# 這裏能夠對訂閱的消息作過濾
canal.instance.filter.druid.ddl = true
canal.instance.filter.query.dcl = false
canal.instance.filter.query.dml = false
canal.instance.filter.query.ddl = false
canal.instance.filter.table.error = false
canal.instance.filter.rows = false
canal.instance.filter.transaction.entry = false

# binlog format/image check
canal.instance.binlog.format = ROW,STATEMENT,MIXED
canal.instance.binlog.image = FULL,MINIMAL,NOBLOB

# binlog ddl isolation
canal.instance.get.ddl.isolation = false

# parallel parser config
canal.instance.parser.parallel = true

## concurrent thread number, default 60% available processors, suggest not to exceed Runtime.getRuntime().availableProcessors()
#canal.instance.parser.parallelThreadSize = 16
## disruptor ringbuffer size, must be power of 2
canal.instance.parser.parallelBufferSize = 256

# table meta tsdb info
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

# dump snapshot interval, default 24 hour
canal.instance.tsdb.snapshot.interval = 24

# purge snapshot expire , default 360 hour(15 days)
canal.instance.tsdb.snapshot.expire = 360

# aliyun ak/sk , support rds/mq
canal.aliyun.accessKey =
canal.aliyun.secretKey =

#################################################
#########         destinations        #############
#################################################
canal.destinations =

# conf root dir
canal.conf.dir = ../conf

# auto scan instance dir add/remove and start/stop instance
canal.auto.scan = true
canal.auto.scan.interval = 5
canal.instance.tsdb.spring.xml = classpath:spring/tsdb/h2-tsdb.xml

#canal.instance.tsdb.spring.xml = classpath:spring/tsdb/mysql-tsdb.xml
canal.instance.global.mode = manager
canal.instance.global.lazy = false
canal.instance.global.manager.address = ${canal.admin.manager}

#canal.instance.global.spring.xml = classpath:spring/memory-instance.xml

#canal.instance.global.spring.xml = classpath:spring/file-instance.xml
canal.instance.global.spring.xml = classpath:spring/default-instance.xml

##################################################
#########              MQ              #############
##################################################
canal.mq.servers = xx.xx.xx.xx:xxxx,xx.xx.xx.xxx:xxxx,xx.xx.xx.xx:xxxx
canal.mq.retries = 0
canal.mq.canalBatchSize = 50
canal.mq.canalGetTimeout = 100
canal.mq.flatMessage = true
canal.mq.compressionType = none
canal.mq.acks = all

#canal.mq.properties. =
canal.mq.producerGroup = test_canal_cluster

# Set this value to "cloud", if you want open message trace feature in aliyun.
canal.mq.accessChannel = local

# aliyun mq namespace

#canal.mq.namespace =

##################################################
#########     Kafka Kerberos Info    #############
##################################################
canal.mq.kafka.kerberos.enable = false
canal.mq.kafka.kerberos.krb5FilePath = "../conf/kerberos/krb5.conf"
canal.mq.kafka.kerberos.jaasFilePath = "../conf/kerberos/jaas.conf"

 

4. 配置canal instance(以投遞MQ爲例)

Canal Admin 提供了 Canal Instance 的管理功能。

咱們嘗試經過 UI 界面添加須要監聽的數據庫,讓該 Instance 消費 binlog 並將事件發送到 MQ。

  • 點擊「新建 Instance」按鈕建立 Instance
  • 點擊「載入模板」,進行配置修改。

主要修改如下配置:

  • 」canal.instance.mysql.slaveId」:目前1.1.4版本已經不須要配置,系統自動生成
  • 」canal.instance.master.address」:配置你的數據庫地址
  • canal.instance.dbUsername:數據庫用戶名
  • canal.instance.dbPassword:數據庫密碼
  • canal.mq.topic:mq的topic
  • canal.instance.filter.regex=訂閱的庫表名單(例如:dbvtest\\..*),具體參考https://github.com/alibaba/canal/wiki/AdminGuide

保存,啓動,觀察日誌,沒有報錯便可。

同時能夠從 canal-server的 操做-詳情 進入,查看能夠看到正在運行的instance

這裏須要注意,若是沒有正確註冊到zk,那麼每一個canal-server都會有一個正在運行的instance,會致使變動投遞屢次。

若是正確註冊了zk,同一個集羣下,每一個instance應該只在某一個cannal-server中運行。

能夠查看zk路徑

/otter/canal/destinations/{xxxx}/running

 

xxxx就是instance的 名稱,running節點表示它運行在哪一個server上。

另外,目前對binlog的訂閱支持gtid模式和position模式,經過如下參數設置

# enable gtid use true/false
canal.instance.gtidon=false

 

在demo過程當中,發現高可用模式下,gtid沒法正常更新到zk,而position模式使用正常。

gtid模式在canal高可用模式下可能存在bug(參考issue:
https://github.com/alibaba/canal/issues/2616),暫時不建議使用。

5. 演練訂閱

在rds執行如下sql

UPDATE `album` SET `attribute`='5' WHERE `albumid`='1';

在MQ中的消息格式以下:

{

    "data":[

        {
            "albumid":"1",
            "picid":"1234",
            "attribute":"5",
            "lastmodified":"2020-05-15 18:13:35",
            "created":"2019-09-04 18:18:51"
        }
    ],
    "database":"dbvtest",
    "es":1589537615000,
    "id":75,
    "isDdl":false,
    "mysqlType":{
        "albumid":"int(10) unsigned",
        "picid":"int(10) unsigned",
        "attribute":"varchar(200)",
        "lastmodified":"timestamp",
        "created":"timestamp"
    },
    "old":[
        {
            "attribute":"2",
            "lastmodified":"2020-05-15 17:42:57"
        }
    ],
    "pkNames":[
        "albumid"
    ],
    "sql":"",
    "sqlType":{
        "albumid":4,
        "picid":4,
        "attribute":12,
        "lastmodified":93,
        "created":93
    },
    "table":"album",
    "ts":1589537615877,
    "type":"UPDATE"
}

 

6. 監控告警

官方文檔地址:
https://github.com/alibaba/canal/wiki/Prometheus-QuickStart

若是你已經有一套prometheus的監控體系,咱們只須要導入模板(
canal/conf/metrics/Canal_instances_tmpl.json)便可,完美~

 

都看到最後了,原創不易,點個關注,點個贊吧~
知識碎片從新梳理,構建Java知識圖譜: github.com/saigu/JavaK…(歷史文章查閱很是方便)
相關文章
相關標籤/搜索