Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

canal收集 由一条update语句更新多行 产生的binlog的速度很慢 什么原因呢? #267

Closed
lan1994 opened this issue Feb 24, 2017 · 13 comments

Comments

@lan1994
Copy link

lan1994 commented Feb 24, 2017

我们有一个场景,一条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语句更新多行的场景,有没有办法提高处理性能

@agapple
Copy link
Member

agapple commented Mar 17, 2017

这个之前没有刻意关注过,你关注到慢有一些具体的数据么?比如评估tps大概是多少?

@lan1994
Copy link
Author

lan1994 commented Mar 17, 2017

相同配置的情况下,一条sql语句只影响一行的情况下,大概每秒能收集7MB原始binlog文件,这种一条sql语句影响多行的会特别慢,我当时测一条sql语句更新3000行,大概每秒只能收集0.5MBbinlog文件。。
我测试的时候发现,只有原先mysql单条记录比较小的时候,这样批量更新会出现这种情况。对于批量更新单条mysql记录比较大的操作(我尝试的是各个字段加起来超过1KB),收集速度和正常情况差不多。

@pan289091315
Copy link

@lan1994 你那个问题解决了吗?我们也遇到类似的问题

@lan1994
Copy link
Author

lan1994 commented Apr 11, 2017

@pan289091315 没解决

@wufengbin
Copy link

wufengbin commented Aug 22, 2017

mysql配置如下参数:innodb_flush_log_at_trx_commit
在提交事务的时候是否提交缓冲?
有3个值:
0:不会主动触发日志缓冲写入磁盘
1(默认):每次提交事务的时候,同时会把日志缓冲刷新到磁盘
2:每次提交事务的时候,会把日志缓冲刷新到磁盘,但是他不是同时进行的
而是每秒钟刷新一次
建议配置成2 ,对性能影响较大。
可以试试这个

@lan1994
Copy link
Author

lan1994 commented Aug 22, 2017

@wufengbin 你提的这个参数是解决mysql批量写入慢的问题,但是这里提到的是canal解析慢的问题。在预写入mysql完毕后,才测试解析性能的。

@carl32hao
Copy link

@lan1994 请问解决了吗?

@agapple
Copy link
Member

agapple commented Sep 23, 2017

倒是可以先执行一个大事务,然后canal回溯到事务执行之前进行验证,从我这边的测试来看,基本都是可以满足基本性能

@koshox
Copy link
Contributor

koshox commented Dec 13, 2017

@lan1994 问题原因找到了没?兄弟

@agapple
Copy link
Member

agapple commented Oct 24, 2018

参考文档:https://github.com/alibaba/canal/wiki/Performance

@agapple agapple closed this as completed Oct 24, 2018
@JoyceeLin
Copy link

@lan1994 @agapple 这个问题解决了吗?我现在也遇到这个问题,一秒收到1,2条消费的数据,10万条数据,同步了三天还没同步完

@young-dev-coder
Copy link

我这边也遇到了这个问题,一条update语句更新了9万条数据,canal-client迟迟收不到要消费的数据,我用的docker版的server @agapple

@LI8888wdqwe
Copy link

我也遇到了这个情况,一条update更新了1万8条数据,但是同步2-3秒同步32条数据。一万多条数据同步了两三个小时。请问是什么原因

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Labels
None yet
Projects
None yet
Development

No branches or pull requests

9 participants