Canal探究( 二 )


properties配置文件properties配置分为两部分:

  • canal.properties (系统根配置文件 , 配置destinations , 注册IP , 启动端口)
  • instance.properties (instance级别的配置文件 , 每个instance一份 , 配置数据库信息 , 监听的表)
canal.properties介绍:
canal配置主要分为两部分定义:
  • instance列表定义 (列出当前server上有多少个instance , 每个instance的加载方式是spring/manager等)
  • common参数定义 , 比如可以将instance.properties的公用参数 , 抽取放置到这里 , 这样每个instance启动的时候就可以共享. 【instance.properties配置定义优先级高于canal.properties】
canal如何维护一份增量订阅 --tt-darkmode-bgcolor: #131313;">解析位点 (parse模块会记录 , 上一次解析binlog到了什么位置 , 对应组件为:CanalLogPositionManager)
  • 消费位点 (canal server在接收了客户端的ack后 , 就会记录客户端提交的最后位点 , 对应的组件为:CanalMetaManager)
  • 对应的两个位点组件 , 目前都有几种实现:
    • memorymemory-instance.xml中使用 , 所有的组件(parser , sink , store)都选择了内存版模式 , 记录位点的都选择了memory模式 , 重启后又会回到初始位点进行解析速度最快 , 依赖最少(不需要zookeeper)场景:一般应用在quickstart , 或者是出现问题后 , 进行数据分析的场景 , 不应该将其应用于生产环境
    • zookeeper
    • mixed
    • period:default-instance.xml中使用 , 集合了zookeeper+memory模式 , store选择了内存模式 , 其余的parser/sink依赖的位点管理选择了持久化模式 , 目前持久化的方式主要是写入zookeeper , 保证数据集群共享支持HA , 可用于生产环境 , 集群化部署
    一份 instance.xml 中有一份或者多份 instance 定义 , 优先以 destination 名字查找对应的 instance bean 定义 , 如果没有 , 则按默认的名字 “instance” 查找 instance 对象,例如 xxxx-instance.xml 中定义 id 分别为 instance-1, instance-2 的两个 bean. 这两个 bean 将为同名的 instance 提供自定义的 eventParser , evnetSink , evnetStore , metaManager , alarmHandler.如果没有自定义这些 bean, 就使用 id="instance" 的 bean 来配置 canal instance.
    一份 instance bean 定义 , 需要包含 eventParser , evnetSink , evnetStore , metaManager , alarmHandler 的5个模块定义 , ( alarmHandler 主要是一些报警机制处理 , 因为简单没展开 , 可扩展)
    instance.xml设计初衷:
    允许进行自定义扩展 , 比如实现了基于数据库的位点管理后 , 可以自定义一份自己的instance.xml , 整个canal设计中最大的灵活性在于此
    HA模式配置canal的ha分为两部分:
    • canal server: 不同server上的instance要求同一时间只能有一个处于running , 其他的处于standby状态 , 不然就是对mysql dump的重复请求 。 这里是instance/destination级别的负载均衡 , 而不是server
    • canal client: 为了保证有序性 , 一份instance同一时间只能由一个canal client进行get/ack/rollback操作 , 否则客户端接收无法保证有序 。
    整个HA机制的控制主要是依赖了zookeeper的几个特性 , watcher和EPHEMERAL节点(和session生命周期绑定)
    Canal Server:
    Canal探究文章插图
    1. canal server要启动某个canal instance时都先向zookeeper进行一次尝试启动判断 (实现:创建EPHEMERAL节点 , 谁创建成功就允许谁启动)
    2. 创建zookeeper节点成功后 , 对应的canal server就启动对应的canal instance , 没有创建成功的canal instance就会处于standby状态


      推荐阅读