canal线上问题记录

本文讲述了项目中遇到的canal数据同步问题,通过排查发现是后端开发修改表结构导致的。解决过程包括配置tsdb存储、删除本地文件和切换到MySQL数据库存储。最终推荐使用时序数据库存储表结构更新。

一.问题现象
由于我们的项目使用了canal进行数据同步,实时变更表数据变化。突然就出现了数据不能同步问题,查看客户端和服务端都是正常的。于是问题指向canal集群问题。
二.环境排查
1.我们的系统环境采用zooKeeper+canal 高可用集群部署方式,开始了逐一排查工作
zooKeeper部署在了三台不同的服务器上,所以依次查看是否正常工作
在这里插入图片描述
三台服务查看是否有zookeeper的线程服务,QuorumPeerMain如果有说明正常。
在查看canal服务CanalLauncher 都在说明服务正常运行。

2.查看canal example.log运行日志,发现问题所在
在这里插入图片描述
是因为后端开发人员在表里增加或者删除了字段导致的,和canal里面的本地存储信息不一致导致的。既然找到了问题,就开始解决问题:
(1)在canal.properties文件中添加配置信息 在这里插入图片描述
重启服务,然而发现并没有解决问题。
(2)找到canal本地存储信息,修改meta.dat的
timestamp时间戳改为最新的时间。在这里插入图片描述
重启服务,然而发现并没有解决问题。
(3)直接暴力删除h2.mv.db文件,这里存储着同步的表结构信息。在删除后,canal在重启后,会自动创建最新的信息和mysql的表结构信息达到一致。重启服务,不在报错,可以正常工作了。
在这里插入图片描述
(4)还有个最好的方式,就是不要让canal的同步信息存储在本地h2数据文件里。存储到mysql数据库中。
在canal.properties里面配置tsdb的mysql数据库,数据库连接换成你自己的。具体配置如下:
canal.instance.tsdb.enable = true
canal.instance.tsdb.dir = canal.file.data.dir:../conf/{canal.file.data.dir:../conf}/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://XXXXX:3306/canal_tsdb
canal.instance.tsdb.dbUsername = root
canal.instance.tsdb.dbPassword = root

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

在数据库里面创建canal_tsdb数据库,数据库的用户需要有创建表的权限。
create database canal_tsdb;
(5)最后终极方案就是等待最新版的canal增加时序表结构的能力

Canal是阿里巴巴开源的数据库增量日志解析,提供增量数据订阅&消费,在使用过程中可能会遇到以下常见问题及对应的解决方案: ### 无法连接到Canal Server Canal Client 无法连接到Canal Server,可能是由于网络问题Canal Server未启动或者配置错误导致。 - **网络问题**:检查客户端和服务端之间的网络连接是否正常,可以使用`ping`和`telnet`命令来验证。例如,使用`telnet <canal-server-ip> <canal-server-port>`测试端口连通性。 - **Canal Server未启动**:检查Canal Server的启动状态,可查看启动日志文件(通常在`canal-server/logs/canal/canal.log`)来确认是否有启动异常信息。若未启动,使用`sh bin/startup.sh`命令启动。 - **配置错误**:检查Canal Client的配置文件,确保`canal.server.host`和`canal.server.port`配置正确。 ### 数据同步延迟 在使用Canal进行数据同步时,可能会出现数据同步延迟的问题,这可能是由于数据库压力大、Canal Server处理能力不足或者网络延迟导致。 - **数据库压力大**:优化数据库的性能,如增加数据库服务器的硬件资源、优化数据库的查询语句、创建合适的索引等。 - **Canal Server处理能力不足**:可以考虑增加Canal Server的实例数量,进行负载均衡,或者优化Canal Server的配置参数,如调整`canal.instance.parser.parallel`参数提高解析并行度。 - **网络延迟**:检查网络环境,尽量减少网络延迟,如将Canal Server和数据库部署在同一局域网内。 ### 数据解析异常 Canal在解析数据库日志时可能会出现异常,导致数据解析错误,这可能是由于数据库版本不兼容、日志格式不支持或者Canal配置错误导致。 - **数据库版本不兼容**:确保Canal支持当前使用的数据库版本,如Canal对MySQL不同版本的支持情况有所差异,参考Canal官方文档确认兼容性。 - **日志格式不支持**:检查数据库的日志格式配置,确保使用的是Canal支持的日志格式,如MySQL需要将`binlog_format`设置为`ROW`。 - **Canal配置错误**:检查Canal Server的配置文件,确保`canal.instance.master.journal.name`、`canal.instance.master.position`等配置正确。 ### 重复消费数据 Canal Client在消费数据时可能会出现重复消费的情况,这可能是由于消费位点记录异常或者客户端异常重启导致。 - **消费位点记录异常**:检查Canal Client的消费位点记录机制,确保消费位点能够正确记录和恢复。可以使用Canal提供的`MetaManager`接口来管理消费位点。 - **客户端异常重启**:在客户端重启时,确保能够正确恢复到上次消费的位点。可以在客户端代码中添加异常处理逻辑,在异常发生时记录当前消费位点,重启后从该位点继续消费。 ```java // 示例代码:使用Canal Client消费数据 import com.alibaba.otter.canal.client.CanalConnector; import com.alibaba.otter.canal.client.CanalConnectors; import com.alibaba.otter.canal.protocol.CanalEntry; import com.alibaba.otter.canal.protocol.Message; import java.net.InetSocketAddress; import java.util.List; public class CanalClientExample { public static void main(String[] args) { // 创建Canal连接 CanalConnector connector = CanalConnectors.newSingleConnector(new InetSocketAddress("127.0.0.1", 11111), "example", "", ""); try { // 连接到Canal Server connector.connect(); // 订阅数据库表 connector.subscribe(".*\\..*"); while (true) { // 获取数据 Message message = connector.get(100); List<CanalEntry.Entry> entries = message.getEntries(); if (entries != null && !entries.isEmpty()) { for (CanalEntry.Entry entry : entries) { if (entry.getEntryType() == CanalEntry.EntryType.ROWDATA) { // 处理数据 processEntry(entry); } } } } } finally { // 关闭连接 connector.disconnect(); } } private static void processEntry(CanalEntry.Entry entry) { // 处理数据的具体逻辑 } } ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值