我们有一个场景,一条update语句更新3000行(update tablename set x='xxx' where id>0 and id <3001),然后提交。发现canal收集速度明显慢于正常情况。
从mysql中查看binlog,发现一个事务里,分成了47个update_row event(因此一个update_row event包含64个行变化), 在我们的消费场景中消费时发现一个entry(rowDatas)中有64个BinlogRow。47*64正好对应3000行变化。
做了一些测试,发现当所更新的mysql行的大小比较小的时候,一条语句更新多行时,会有这种情况,收集速度也很慢。 但是mysql行比较大的时候,(更新3000行,binlog原始文件中有3000个update_row event),这个时候收集速度就正常了。
现在想了解:
1.是否是因为更新多行产生的binlog内容(一个entry包含多个行变化信息)导致 后续解析速度慢,从而收集速度变慢
2.具体什么情况下,一个update_row event会包含多个行变化
3.针对一条sql语句更新多行的场景,有没有办法提高处理性能
原提问者GitHub用户lan1994
参考文档:https://github.com/alibaba/canal/wiki/Performance
原回答者GitHub用户agapple
可能有以下几个原因:
Canal连接到MySQL服务器的延迟较高。如果Canal与MySQL服务器之间的网络延迟很高,那么它将需要更长的时间来接收和处理binlog事件。
Canal配置不正确。如果Canal的配置不正确,例如binlog文件路径不正确、canal.properties文件中设置的参数不正确等,那么它可能会导致收集binlog的速度变慢。
MySQL服务器负载过高。如果MySQL服务器正在处理大量请求或负载过高,那么它可能会影响binlog的写入速度。
Canal实例本身存在性能问题。如果Canal实例本身存在性能问题,例如内存不足、CPU过载等,那么它也可能会影响binlog的写入速度。
针对以上问题,可以采取以下措施:
检查Canal连接到MySQL服务器的延迟,优化网络连接。
检查Canal的配置是否正确,包括binlog文件路径、canal.properties文件中的参数等。
检查MySQL服务器是否负载过高,优化数据库结构或者增加服务器数量。
对Canal实例进行性能优化,例如调整内存、CPU等参数。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。