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;

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