在测试中我们发现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
找到问题所在了,不是Canal的问题。
Canal客户端同时也向hbase写入数据,导致zookeeper IO过高是hbase而不是canal。
原回答者GitHub用户sisyphsu
根据您提供的信息,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的内存和磁盘缓存参数,以提高读写效率和性能。
希望以上建议能够对您有所帮助。
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。