前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >如何处理Canal集群Server切换&表DDL变化造成的binlog无法解析问题

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

作者头像
Eights
发布2020-12-02 16:04:03
2.9K0
发布2020-12-02 16:04:03
举报
文章被收录于专栏:Eights做数据Eights做数据

点击蓝色字关注!

本篇文章大概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配置如下:

代码语言:javascript
复制
# 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语句:

代码语言:javascript
复制
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元数据库共用的方式去创建表
  • 修改Canal集群的配置
代码语言:javascript
复制
# 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
  • 修改配置之后保存,刷新Canal Server状态
  • meta_snapshot表中,已经有数据插入,data字段中则是存放的schema信息
  • Canal集群Server切换&表DDL变化造成的binlog无法解析问题处理完成

3

Canal配置中三种模式的差别

  • Canal集群的主配置中,存在memory file default三种模式
代码语言:javascript
复制
#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
  • memory
    • canal中所有的组件都采用了内存模式,重启Server不会记录Binlog的点位
    • 生产环境不推荐使用
  • file
    • canal中所有组件采用基于本地文件的持久化方式,不支持HA
    • 在非HA的生产环境可用
  • default
    • canal中所有组件基于zookeeper实现持久化,保证数据共享
    • HA生产环境可用,老铁们这个配置不要选错了哦!!!

4

总结

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

  • tsdb的配置需要配置为MySQL而不是默认的H2
  • canal properties选择使用default模式而不是file模式

扫码二维码

获取更多文章

Eights

点个在看吧~

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-11-20,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 Eights做数据 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 文档编写目的
  • 集群环境
  • Canal时序表结构设计
    • 解决方案
    相关产品与服务
    云数据库 SQL Server
    腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
    领券
    问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档