如何处理Canal集群Server切换&表DDL变化造成的binlog无法解析问题

点击蓝色字关注!

768e2721c3ae1406802f4ba4d6d0806a.png

本篇文章大概3976字,阅读时间大约10分钟

Canal集群在启用HA的情况下,如果配置了tsdb为内嵌的H2数据库,在Server宕机发生切换的情况下,同时MySQL的DDL发生变化,容易造成MySQL的Binlog无法解析,可采用将tsdb配置为MySQL的方式进行处理

文档编写目的

  • Canal集群模式下如何配置tsdb为MySQL而不是内嵌的H2数据库

  • 区分Canal properties中三种模式的差别

集群环境

  • Canal-1.1.4 HA集群

1

问题描述

  • 在Canal集群启用高可用的环境下,减少Canal采集mysql库表的字段,并手动kill掉正在工作的Canal Server,发现StandBy的Canal Server活动,查看日志发现,Canal因为MySQL表的字段错误而无法正常解析Binlog

Canal时序表结构设计

技术方案参考链接:

https://github.com/alibaba/canal/wiki/TableMetaTSDB

查看集群中使用的tsdb配置如下:

# 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

当前集群采用的是默认的tsdb方案,也就是内嵌的H2数据库。在HA环境下如果发生Server切换,则会出现无法正确解析Binlog的问题

解决方案

采用MySQL作为Canal的tsdb存储

2

Canal配置MySQL作为tsdb的存储

在当前集群的配置中,只要把H2改为mysql就可以了,但是在Canal的文档中并没有找到对应的DDL语句创建tsdb需要的表。在Canal的代码中捞到了对应的DDL语句:

83924ead5461cd453ecb2a5939981656.png

CREATE TABLE IF NOT EXISTS `meta_history` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `gmt_create` datetime NOT NULL COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `destination` varchar(128) DEFAULT NULL COMMENT '通道名称',
  `binlog_file` varchar(64) DEFAULT NULL COMMENT 'binlog文件名',
  `binlog_offest` bigint(20) DEFAULT NULL COMMENT 'binlog偏移量',
  `binlog_master_id` varchar(64) DEFAULT NULL COMMENT 'binlog节点id',
  `binlog_timestamp` bigint(20) DEFAULT NULL COMMENT 'binlog应用的时间戳',
  `use_schema` varchar(1024) DEFAULT NULL COMMENT '执行sql时对应的schema',
  `sql_schema` varchar(1024) DEFAULT NULL COMMENT '对应的schema',
  `sql_table` varchar(1024) DEFAULT NULL COMMENT '对应的table',
  `sql_text` longtext DEFAULT NULL COMMENT '执行的sql',
  `sql_type` varchar(256) DEFAULT NULL COMMENT 'sql类型',
  `extra` text DEFAULT NULL COMMENT '额外的扩展信息',
  PRIMARY KEY (`id`),
  UNIQUE KEY binlog_file_offest(`destination`,`binlog_master_id`,`binlog_file`,`binlog_offest`),
  KEY `destination` (`destination`),
  KEY `destination_timestamp` (`destination`,`binlog_timestamp`),
  KEY `gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='表结构变化明细表';

CREATE TABLE IF NOT EXISTS `meta_snapshot` (
  `id` bigint(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键',
  `gmt_create` datetime NOT NULL COMMENT '创建时间',
  `gmt_modified` datetime NOT NULL COMMENT '修改时间',
  `destination` varchar(128) DEFAULT NULL COMMENT '通道名称',
  `binlog_file` varchar(64) DEFAULT NULL COMMENT 'binlog文件名',
  `binlog_offest` bigint(20) DEFAULT NULL COMMENT 'binlog偏移量',
  `binlog_master_id` varchar(64) DEFAULT NULL COMMENT 'binlog节点id',
  `binlog_timestamp` bigint(20) DEFAULT NULL COMMENT 'binlog应用的时间戳',
  `data` longtext DEFAULT NULL COMMENT '表结构数据',
  `extra` text DEFAULT NULL COMMENT '额外的扩展信息',
  PRIMARY KEY (`id`),
  UNIQUE KEY binlog_file_offest(`destination`,`binlog_master_id`,`binlog_file`,`binlog_offest`),
  KEY `destination` (`destination`),
  KEY `destination_timestamp` (`destination`,`binlog_timestamp`),
  KEY `gmt_modified` (`gmt_modified`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8 COMMENT='表结构记录表快照表';
  • 在这里采用与Canal Admin元数据库共用的方式去创建表

c4b37bff79efe270bd98b449d277ace2.png

  • 修改Canal集群的配置

# 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.url=jdbc:mysql://10.64.xx.xx:3316/canal_manager?useUnicode=true&characterEncoding=UTF-8&useSSL=false
canal.instance.tsdb.dbUsername = canal_manager
canal.instance.tsdb.dbPassword = xxxxxx

#canal.instance.tsdb.spring.xml = classpath:spring/tsdb/h2-tsdb.xml
canal.instance.tsdb.spring.xml = classpath:spring/tsdb/mysql-tsdb.xml

20880d1e68fc6f9dac8c975cbbd905fe.png

9ccd1681856893e17c3b04897e9aebe8.png

  • 修改配置之后保存,刷新Canal Server状态

  • meta_snapshot表中,已经有数据插入,data字段中则是存放的schema信息

90754d6dfb3c86561612cceee14c1b07.png

  • Canal集群Server切换&表DDL变化造成的binlog无法解析问题处理完成

3

Canal配置中三种模式的差别

  • Canal集群的主配置中,存在memory file default三种模式

#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

cf4a392d82762f56884156c333339adc.png

  • memory

    • canal中所有的组件都采用了内存模式,重启Server不会记录Binlog的点位

    • 生产环境不推荐使用

  • file

    • canal中所有组件采用基于本地文件的持久化方式,不支持HA

    • 在非HA的生产环境可用

  • default

    • canal中所有组件基于zookeeper实现持久化,保证数据共享

    • HA生产环境可用,老铁们这个配置不要选错了哦!!!

4

总结

在生产环境中使用Canal的HA集群,需要注意两点:

  • tsdb的配置需要配置为MySQL而不是默认的H2

  • canal properties选择使用default模式而不是file模式

6116dbbf39b674f0b5f7f4c12bc13872.gif

扫码二维码

获取更多文章

Eights

0c0d9b8951b4535c12caaf32c4230188.jpeg

4561177f097f3dca6cc26346b53042ea.png

点个在看吧~

b2098a335015bb00006cfa538423e496.gif

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值