Canal探究( 三 )


destination的消费问题一个destination无法被多个client直接并行消费 , 解决方案:

  • client收到消息以后转发到kafka或者MQ中 , 后继的其他Consumer只与kafka或者MQ接入
  • 一个Canal中使用多个destination , 它们对应相同的MySQL源
参考:
【Canal探究】
对于canal设计的一些思考
  • 对于canal的高可用 , 通过zk保证server和client同一时间只能有一个节点工作server能不能根据数据id进行分片读取 , 提高读取数据的性能 , 类似kafka的设计 , 应该是不能的 。 因为parser向master发起dump请求得到的是字节流 , 无法获取原始数据 。 那能不能一个parser对应多个sink再放入store 。 没必要 , 因为canal的性能瓶颈在canal与数据库的网络IO , 解析及sink是很快的 。 客户端能不能多个节点同时工作 , 从一个destination消费数据 。 如果不保证数据成功消费及有序性是可以的 。 如果某一client消费数据失败 , 当前store的设计(环形结构保存数据)无法做到回滚 。 如果一个destination分多个队列由client消费 , 只能保证数据局部有序 , 同时设计复杂 。
  • 当前store的数据保存在内存中 , 是否有必要持久化到文件类似于logstash的数据也是保存在内存中 , 官方文档说会支持 , 但没有也可以 , 因为持久化会影响整体性能 , 通过zk存储client的消费位置会保证数据至少被消费一次 。
  • store保存的数据受到大小和条数的限制 , 当达到限制时 , sink会堵塞parser , 不会撑爆内存
  • canal与logstahs , kafka的一些比较
对以后写公共组件的一些启示:
  • 支持多种配置方式如配置文件 , http , 并可动态生效
  • 通过协调服务保证系统的高可用
  • 暴露服务监控指标至prometheus
  • 获取数据的方式:达到一定数量或时间