canal版本升級方案

1、Canal版本概述

Canal主要用途是基於MySQL數據庫增量日誌解析,提供增量數據訂閱和消費;
目前使用中的有3套不同的canal,一套是最新穩定版本1.1.4,第二套使用爲快照版1.1.3(遺留項目使用且稍作改造),第三套爲穩定版本1.1.0;

1.1.4版本主要特性:

1)、引入canal-admin工程,提供canal界面配置能力;
2)、canal-server新增admin動態運維指令,配合canal-admin工程動態管理訂閱關係;
3)、instance訂閱表過濾,增加表字段訂閱的過濾功能,比如針對大字段忽略;
4)、升級fastsql 973版本,全面兼容MySQL DDL的解析能力;

1.1.3版本主要特性:

1)、canal支持多種MQ消息投遞規則;
2)、canal新增內置的客戶端;

1.1.x版本主要特性:

1)、支持prometheus監控;
2)、支持kafka;
2)、支持docker鏡像;

2、版本升級需求

2.1、目前存在的問題:

1)、配置修改不方便,需要到服務器修改或本地修改傳到服務器;
2)、單點問題,存在部分機器仍然是單臺部署,出現宕機就無法提供服務;
3)、版本問題,線上同時存在多套canal版本,對於維護更新及bug修復不利,且無法使用新特性;
4)、無法動態擴容,新特性之一的canal admin提供動態擴容的管理能力;
5)、粒度控制及監控集成,更高穩定版提供更多的參數來控制canal並且完善了基於prometheus的監控集成;
6)、當前線上部署的canal都是指定數據庫的域名(參數canal.instance.master.address),這在發生主從切換時對應用是接近無感的,不過這對於canal同步來講存在些問題,在發生主從切換時會導致binlog偏移量變化,可能會導致最近一段時間內的數據丟失,運維給出的解決方案是爲canal同步的庫指定ip,這樣即使發生主從切換仍然可以通過同步的時間戳來獲取同步位置(canal機制,優先取同步時間戳,其次是binlog的偏移量),從而不會產生告警並且不需要手動去修正偏移量;

2.2、版本升級及ha部署優勢:

1)、使用最新特性提升應用性能,並且提供動態的、可視化的管理能力;
2)、針對同一版本運維及維護會更有針對性,防止多版本其中的隱藏bug導致維護成本較高;
3)、ha部署能夠提供系統的健壯性,防止單點問題;
4)、監控方面的完善,爲線上告警提供更多的指標;

3、技術方案

3.1、數據庫層面的配置:

3.1.1)、MySQL需先開啓binlog寫入功能並配置binlog-format爲row模式(MySQL有基於語句()以及基於行(row)的複製),MySQL配置文件xx.conf需添加以下配置:
[mysqld]
log-bin=mysql-bin # 開啓 binlog
binlog-format=ROW # 選擇 ROW 模式
server_id=1 # 配置MySQL replaction需要定義,不要和canal的slaveId重複

3.1.2)、爲canal中間件單獨創建用戶及密碼:
CREATE USER canal IDENTIFIED BY 'canal';  # 用戶及密碼可自定義
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
FLUSH PRIVILEGES;


3.1.3)、查看主庫及從庫相關信息:
# 查看數據庫主句及從庫的信息:
show master status;
show slave hosts;

# 查看數據庫gtid相關的設置(若數據庫開啓gtid功能並且canal設置參數canal.instance.master.gtid):
show VARIABLES LIKE '%gtid%';

3.2、canal.properties配置:

3.2.1)、canal admin配置,用於支持管理canal實例及其instance,根據實際使用的canal admin參數進行配置:
# canal admin config
#canal.admin.manager = 127.0.0.1:8089
canal.admin.port = 11110
canal.admin.user = admin
canal.admin.passwd = 4ACFE3202A5FF5CF467898FC58AAB1D615029441

3.2.2)、zk配置,用於支持canal多實例部署時配置的動態更新;
canal.zkServers =
# flush data to zk
canal.zookeeper.flush.period = 1000

3.2.3)、canal服務模式,默認爲tcp,若使用kafka或rocketmq需要更改:
# tcp, kafka, RocketMQ
canal.serverMode = RocketMQ

3.2.4)、destination配置,配置自定義的instance,默認爲example,可以添加自定義的,另外canal支持週期性自動掃描是否有instance新增,看實際是否需要此功能再進行修改:
canal.destinations = user
# conf root dir
canal.conf.dir = ../conf
# auto scan instance dir add/remove and start/stop instance
canal.auto.scan = false
canal.auto.scan.interval = 5

3.2.5)、mq配置,根據使用的是kafka還是rocketmq進行配置,kafka可配置參數較多:
canal.mq.servers = 127.0.0.1:9876
canal.mq.retries = 0
canal.mq.batchSize = 16384
canal.mq.maxRequestSize = 1048576
canal.mq.lingerMs = 100
canal.mq.bufferMemory = 33554432
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
# Set this value to "cloud", if you want open message trace feature in aliyun.
canal.mq.accessChannel = local
# aliyun mq namespace
#canal.mq.namespace =

3.3、具體instance配置文件參數配置:

3.3.1)、salveId,默認自動生成,配置MySQL replaction需要定義,不要和canal的serverId重複
canal.instance.mysql.slaveId=1234

3.3.2)、複製的主庫信息
canal.instance.master.address=127.0.0.1:3306
canal.instance.master.journal.name=
canal.instance.master.position=
canal.instance.master.timestamp=
canal.instance.master.gtid=     # 5.6.5版本支持的功能,需要保證數據庫開啓了該參數

3.3.3)、配置instance的tsdb(時序數據庫)
# table meta tsdb info
canal.instance.tsdb.enable=true
#canal.instance.tsdb.url=jdbc:mysql://127.0.0.1:3306/canal_tsdb
#canal.instance.tsdb.dbUsername=canal
#canal.instance.tsdb.dbPassword=canal

3.3.4)、配置canal複製需要用戶及密碼:
# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8

3.3.5)、配置表、字段匹配規則(默認匹配所有):
# table regex
canal.instance.filter.regex=.*\\..*
# table black regex
canal.instance.filter.black.regex=
# table field filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.field=test1.t_product:id/subject/keywords,test2.t_company:id/name/contact/ch
# table field black filter(format: schema1.tableName1:field1/field2,schema2.tableName2:field1/field2)
#canal.instance.filter.black.field=test1.t_product:subject/product_image,test2.t_company:id/name/contact/ch

3.3.6)、instance對應mq的配置:
# mq config
canal.mq.topic=canal_sync_table
# dynamic topic route by schema or table regex
#canal.mq.dynamicTopic=mytest1.user,mytest2\\..*,.*\\..*
canal.mq.partition=0
# hash partition config
#canal.mq.partitionsNum=3
#canal.mq.partitionHash=test.table:id^name,.*\\..*

3.4、新建instance需要在conf目錄下新建目標instance並指定對應的properties文件,然後在canal.properties中添加destination;

3.5、mq配置當中根據instance的需要設置投遞到mq的消息格式(json/protobuf),對應參數爲canal.mq.flatMessage;

3.6、需指定canal消費模式(tcp/kafka/rocketmq),通過參數canal.serverMode設置,另外若模式爲kafka或rocketmq,還需要指定canal.mq.servers集羣;

3.7、確保mq註冊的IP地址是可訪問的,可以顯式通過conf/broker.conf進行配置;

3.8、當前1.1.4版本對應rocketmq客戶端版本爲4.5.2,最好是保持一致,使用其他版本最好經過測試驗證;

4、具體實施步驟

1)、記錄當前數據庫同步偏移量;
2)、關閉當前使用中的canal,啓動新版本的canal;
3)、觀察並驗證同步能力及管理能力;

5、異常回滾

1)、記錄當前數據庫同步偏移量;
2)、關閉當前升級版本的canal;
3)、配置數據庫偏移量並重啓原版本canal;

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章