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

Mysql产生的binlog,大量数据的时候,同步到Canal慢,这个怎么解决? #672

Closed
withlin opened this issue Jun 5, 2018 · 27 comments

Comments

@withlin
Copy link
Contributor

withlin commented Jun 5, 2018

做了一些大量的数据的测试,比如更新一个100W的表,同步到Canal,会7-8秒才能到Canal,我Get数据的时候,batchid为-1,然后我就猜想服务端的RingBuffer doPut应该还没有put到数据,我想应该是Mysql到Canal Server会有阻塞的过程,这种有没有办法降阻塞的时间?比如mysql5.7的多线程并行的操作。

@agapple
Copy link
Member

agapple commented Jun 6, 2018

帮忙分析几个过程,写入到binlog -> canal接收到 -> canal解析存储到memory -> client接收,看一下具体瓶颈点

@withlin
Copy link
Contributor Author

withlin commented Jun 6, 2018

  1. 写binlog(涉及小IO,应该问题不大)

  2. canal (去fetch的时候网络IO,IO/Thread)

  3. 当client 设置取值比较大的时候

以上三点设计到的IO操作。

@zhp8341
Copy link

zhp8341 commented Jun 26, 2018

我们最近通过测试发现 while (fetcher.fetch()) 拉取数据qps在1000的样子, 由于canal读数据是单线程的,如果瞬间插入百万数据对canal客户端读取的延长性还是很大的,不知道楼主这个问题解决了吗

@chenglinjava68
Copy link

你现在延迟 多久 我100万数据大概在25分左右

@withlin
Copy link
Contributor Author

withlin commented Jun 26, 2018

50W条数据 5分钟左右

@chenglinjava68
Copy link

50W条数据 5分钟左右 采用的单线程方式吗? 将数据同步到es 还是redis 加我wx aleenjava 探讨一下

@withlin
Copy link
Contributor Author

withlin commented Jun 27, 2018

我是这样做的,开了2个线程,一个线程不断的取数据,然后放到阻塞队列,然后第二个线程就从阻塞队列消费,然后按顺序的发送到MQ上。

@agapple
Copy link
Member

agapple commented Jun 28, 2018

@DevWithLin 你这边是基于canal的解析,完成了对接kafka吗?

@withlin
Copy link
Contributor Author

withlin commented Jun 28, 2018

我这边用的是 基于配置界面的目前可对接rabbitmq和activemq,kafka没有用呢, 后续会完成kafka。 @agapple

@withlin
Copy link
Contributor Author

withlin commented Jun 28, 2018

我还打算 让canalClient支持下Sky-Walking.

@chenglinjava68
Copy link

我是这样做的,开了2个线程,一个线程不断的取数据,然后放到阻塞队列,然后第二个线程就从阻塞队列消费,然后按顺序的发送到MQ上。 这和单线程消费顺序发送到MQ 上有什么区别?

@withlin
Copy link
Contributor Author

withlin commented Jun 28, 2018

当MQ发送耗时大于从Canal Server Get数据的时候,这就很有意义了。

@chenglinjava68
Copy link

代码在哪里 方面分享一下吗?

@withlin
Copy link
Contributor Author

withlin commented Jun 28, 2018

好简单的,都不用代码的啊。开两个线程一个阻塞队列,模拟生产消费。

@chenglinjava68
Copy link

我就是用这种方式 实现的 没达到你说得效果 100万数据大概 20分钟

@withlin
Copy link
Contributor Author

withlin commented Jun 29, 2018

我这边很快啊~ 你发到哪里的?

@chenglinjava68
Copy link

写入到es 中

@luyee
Copy link

luyee commented Jun 29, 2018

写入kafka的话 跟maxwell差不多?

@withlin
Copy link
Contributor Author

withlin commented Jun 30, 2018

@chenglinjava68 估计是 ES的瓶颈吧,我写rabbitmq的,平均8000多个消息。

@chenglinjava68
Copy link

每秒8000? 有点夸张了吧

@hello-llc
Copy link

一个canal部署的实例较多是不是也会导致延时较大呢?

@chenglinjava68
Copy link

chenglinjava68 commented Jun 11, 2019 via email

@hello-llc
Copy link

是的 最好引入kafka 作为中间传输介质

------------------ 原始邮件 ------------------ 发件人: "cun123"notifications@github.com; 发送时间: 2019年6月11日(星期二) 下午3:24 收件人: "alibaba/canal"canal@noreply.github.com; 抄送: "漂泊"705366435@qq.com;"Mention"mention@noreply.github.com; 主题: Re: [alibaba/canal] Mysql产生的binlog,大量数据的时候,同步到Canal慢,这个怎么解决? (#672) 一个canal部署的实例较多是不是也会导致延时较大呢? — You are receiving this because you were mentioned. Reply to this email directly, view it on GitHub, or mute the thread.

已经接入kafka,但是现在我遇到从MySQL取数延时较大,有什么好的建议吗?

@hello-llc
Copy link

我这边用的是 基于配置界面的目前可对接rabbitmq和activemq,kafka没有用呢, 后续会完成kafka。 @agapple

我用配置界面对接kafka,但是对你讲的两个线程一个阻塞队列不太理解,能详细说一下吗?

@xuyisu
Copy link

xuyisu commented Sep 18, 2019

我这边用的是 基于配置界面的目前可对接rabbitmq和activemq,kafka没有用呢, 后续会完成kafka。 @agapple

我用配置界面对接kafka,但是对你讲的两个线程一个阻塞队列不太理解,能详细说一下吗?

我之前也是自建阻塞队列是基于ArrayBlockingQueue,这种方案问题是客户端一旦挂掉、重启会丢失数据,建议直接写到消息队列(kafka、rocketmq等)

@chenglinjava68
Copy link

chenglinjava68 commented Sep 18, 2019 via email

@agapple
Copy link
Member

agapple commented Oct 8, 2019

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

7 participants