这段异常中的5是实际的数据列数,4是canal中存储的metadata中该表的列,在实际中发现数据确实为5,也就是切换之后canal没有获取到真正的最新的metadata。
理解canal tsdb(时序表结构方案设计)的功能需要先看懂官方对tsdb的介绍和实现
https://github.com/alibaba/canal/wiki/TableMetaTSDB
问题:表结构一致性问题
方案:持久化存储的思考
- 本地嵌入式实现(H2):提供最小化的依赖,完成时序表结构管理的能力。基于磁盘的模式,可以结合存储计算分离的技术,canal failover之后只要在另一个计算节点上拉起,并加载云盘上的DB数据,做到多机冷备。
- 中心管控存储实现(MySQL): 一般结合于规模化的管控系统,允许将DDL数据录入到中心MySQL进行统一运维。
Canal开启了tsdb功能,并且存储方式是第一种,如果开启tsdb的话,一定要将tsdb设置为集中式的,也就是不要使用本地的h2了,而是使用集中化的mysql数据库,保证两台canal连接的是同一个数据库。这样的话才能够满足在进行DDL和HA切换的时候不会出现异常。
附:同topic,多消费者,消费问题 ;Customer多数据库源