开发者社区> 问答> 正文

Canal会导致ZooKeeper的磁盘IO负载过高。

在测试中我们发现Canal会导致ZooKeeper的IO负载极高,iotop下可以看到ZooKeeper持续以400KB/s的速度向磁盘写入事务数据,因此磁盘IO负载居高不下。我们目前并没有提供独立的服务器来运行ZooKeeper,因此我们希望能够通过降低ZooKeeper的write/update压力,从而减少它的磁盘IO占用率。

按我的理解,Canal应该是每次客户端ACK时都会将最新的binlog偏移量更新入ZooKeeper,这就导致ZooKeeper的事务很多,磁盘IO占用率很大。

我修改了canal.properties中的canal.zookeeper.flush.period配置为5000, 希望Canal能每5秒钟更新一次ZooKeeper。但是配置之后,发现它根本不起作用,ZooKeeper的写压力仍然巨大。

之后我监视ZooKeeper的日志发现,绝大部分的写操作并非来自Canal服务器,而是来自于Canal客户端。

为什么Canal客户端会直接高频率地向ZooKeeper服务器写入binlog偏移量? binlog偏移量的更新或写入不是应该由Canal服务器统一调度吗?

原提问者GitHub用户sisyphsu

展开
收起
绿子直子 2023-05-09 16:10:31 225 0
2 条回答
写回答
取消 提交回答
  • 找到问题所在了,不是Canal的问题。

    Canal客户端同时也向hbase写入数据,导致zookeeper IO过高是hbase而不是canal。

    原回答者GitHub用户sisyphsu

    2023-05-10 11:09:37
    赞同 展开评论 打赏
  • 随心分享,欢迎友善交流讨论:)

    根据您提供的信息,Canal客户端会频繁地向ZooKeeper服务器写入binlog偏移量的情况可能是由于Canal客户端的某些设置或程序问题引起的。建议检查Canal客户端的配置和代码,查看是否有程序错误或不正确的配置导致它向ZooKeeper频繁写入binlog偏移量。

    另外,修改canal.zookeeper.flush.period配置可能无法解决ZooKeeper磁盘IO负载过高的问题。因为该配置设置的是Canal Server向ZooKeeper刷新数据的时间间隔,而不是Canal客户端向ZooKeeper写入数据的时间间隔。因此,即使将该配置设置为5000,Canal客户端仍可能会频繁地向ZooKeeper写入数据。

    为了降低ZooKeeper的磁盘IO负载,可以尝试以下方案:

    将Canal客户端的数量降至最低,避免不必要的写入操作。

    对Canal客户端进行优化,避免不必要的写入操作,例如可以在Canal客户端中设置一个缓存机制,将多个binlog偏移量的写入操作合并为一次写入。

    将ZooKeeper的数据存储路径和数据日志路径设置在不同的磁盘上,避免同一磁盘上的读写竞争。

    调整ZooKeeper的内存和磁盘缓存参数,以提高读写效率和性能。

    希望以上建议能够对您有所帮助。

    2023-05-09 17:48:47
    赞同 展开评论 打赏
问答排行榜
最热
最新

相关电子书

更多
《MSE 微服务网关》 立即下载
微服务引擎 MSE 治理中心重磅发布 立即下载
阿里云微服务引擎 MSE 2.0 线上发布 立即下载