点击蓝色字关注!
![768e2721c3ae1406802f4ba4d6d0806a.png](https://img-blog.csdnimg.cn/img_convert/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语句:
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集群的配置
# 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三种模式
#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
点个在看吧~