canal版本升级方案

1、Canal版本概述

Canal主要用途是基于MySQL数据库增量日志解析,提供增量数据订阅和消费;
目前在使用的有3套不同的canal,一套是最新稳定版本1.1.4,第二套使用为快照版1.1.3(遗留项目使用且稍作改造),第三套为稳定版本1.1.0;

1.1、当前版本特性

版本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.0主要特性:

1)、支持prometheus监控;
2)、支持kafka;
2)、支持docker镜像;

2、版本升级需求

2.1、目前存在的问题:

1)、配置修改不方便,需要到服务器修改或本地修改传到服务器;
2)、单点问题,存在部分机器仍然是单台部署,出现宕机就无法提供服务;
3)、版本问题,线上同时存在多套canal版本,对于维护更新及bug修复不利,且无法使用新特性;
4)、无法动态扩容,新特性之一的canal admin提供动态扩容的管理能力;
5)、粒度控制及监控集成,更高稳定版提供更多的参数来控制canal并且完善了基于prometheus的监控集成;
6)、当前线上canal主从切换导致偏移量有误,需手动处理;

2.2、版本升级及ha部署优势:

1)、使用最新特性提升应用性能,并且提供动态的、可视化的管理能力;
2)、针对同一版本运维及维护会更有针对性,防止多版本其中的隐藏bug导致维护成本较高;
3)、ha部署能够提供系统的健壮性,防止单点问题;
4)、监控方面的完善,为线上告警提供更多的指标;

2.3、升级对系统的影响(以会员和卡券系统作说明):

1)、切换时间内会员后台管理查询新注册会员数据存在延迟;
2)、切换时间内卡券后台管理卡券查询新生成卡券数据存在延迟;
3)、切换时间内rocketmq存在消息堆积的情况;
4)、系统迁移完之后数据能够尽快恢复,不存在丢失数据的情况;

3、Canal高可用架构方案

3.1、当前Canal数据流向图

canal版本升级方案_第1张图片

3.2、MySQL部署基于GTID的复制模式,以keepalived为高可用组件

canal版本升级方案_第2张图片

3.3、Canal Server高可用架构部署基于zookeeper模式

canal版本升级方案_第3张图片

3.4、数据同步架构

Canal每个instance可以指定一个Mysql同步源,同步方式支持GTID方式和mater-standby方式;
当前测试版本中(canal-1.1.3和canal-1.1.4)中GTID方式存在持久化bug,无法在zookeeper中正常持久化(https://github.com/alibaba/canal/issues/2616);当Canal节点故障发生切换时,持久化位点不准确,生产环境中不适用此方式;由于canal官方维护重视度不高,该bug长久未修复;
因此测试采用master-standby配置方式,此方式在一个Mysql同步源节点故障时,使用持久化位点时间戳减去指定的偏移时间;在另一个数据库节点上从偏移时间点开始进行数据同步,可以一定程度上保证同步数据的完整性;
详情参见:https://github.com/alibaba/canal/wiki/AdminGuide

3.5、Canal位点

Canal位点信息包含初始化位点和持久化位点两部分,初始化位点位于instance.properties配置文件中;持久化位点位于内存、持久化文件(meta.dat)或zookeeper中;持久化位点的优化级高于初始化位点,持久化位点存在时,启动时读取持久化位点;持久化位点不存在时,canal server启动时读取初始化位点;

3.6、Web控制台

Canal-1.1.4中引入了canal-admin工程,canal-admin设计上是为canal提供整体配置管理、节点运维等面向运维的功能,提供相对友好的WebUI操作界面,方便更多用户快速和安全的操作;
canal-admin的核心模型有以下三个:
 Instance:对应canal-server里的instance,一个最小的订阅mysql的队列;
 Server:对应canal-server,一个server里可以包含多个instance;
 集群:对应一组canal-server,组合在一起面向高可用HA的运维;
Web管理台具备三个模型级别的启动、停止、配置及日志查看功能,模型信息存储在数据库中;
使用详情见
https://github.com/alibaba/canal/wiki/Canal-Admin-Guide。

3.7、Canal监控

Canal server 性能指标监控基于prometheus的实现,默认通过11112端口采集监控指标数据;可以对存活状态、延迟、阻塞以及消费性能等指标进行监控;
详情参见
https://github.com/alibaba/canal/wiki/Prometheus-QuickStart

3.8、Canal文件配置(canal.properties):

3.8.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.8.2)、zk配置,用于支持canal多实例部署时配置的动态更新;
canal.zkServers = 192.168.1.50:2181,192.168.1.60:2181,192.168.1.70:2181
# flush data to zk
canal.zookeeper.flush.period = 1000

3.8.3)、canal服务模式,默认为tcp,若使用kafka或rocketmq需要更改:
# tcp, kafka, RocketMQ
canal.serverMode = RocketMQ

3.8.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.8.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.9、实例文件配置(instance.properties):

3.9.1)、salveId,默认自动生成,配置MySQL replaction需要定义,不要和canal的serverId重复
canal.instance.mysql.slaveId=1234

3.9.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.9.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.9.4)、配置canal复制需要用户及密码:
# username/password
canal.instance.dbUsername=canal
canal.instance.dbPassword=canal
canal.instance.connectionCharset = UTF-8

3.9.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.9.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,.*\\..*

4、具体实施步骤

1)、记录当前数据库同步偏移量;

查看对应实例目录下的meta.data文件位点信息并备份(以下为示例):
路径类似: ../canal/conf/xxxxx/meta.data

{
     
    "clientDatas":[
        {
     
            "clientIdentity":{
     
                "clientId":1001,
                "destination":"user",
                "filter":""
            },
            "cursor":{
     
                "identity":{
     
                    "slaveId":-1,
                    "sourceAddress":{
     
                        "address":"localhost",
                        "port":3306
                    }
                },
                "postion":{
     
                    "gtid":"",
                    "included":false,
                    "journalName":"binlog.000004",
                    "position":6423,
                    "serverId":1,
                    "timestamp":1593248509000
                }
            }
        }
    ],
    "destination":"user"
}

2)、关闭当前使用中的canal,启动新版本的canal;

该步骤由运维执行:
a、停止原canal
$ sh ../bin/stop.sh
b、启动新版本canal
$ sh ../bin/startup.sh

3)、观察并验证同步能力及管理能力;

5、异常回滚

1)、读取备份位点信息;

读取第4步记录的位点信息;

2)、关闭当前升级版本的canal;
3)、配置数据库偏移量并重启原版本canal;
4)、观察并验证同步功能是否恢复正常;

你可能感兴趣的:(canal,java,canal,java)