Canal 高可用

Posted by agentd on 10-08,2018

Canal 是阿里巴巴mysql数据库binlog的增量订阅&消费组件, 你可以从这儿了解它.

Canal 的常见使用场景之一就是数据同步, 例如我们使用 canal 就是为了把 mysql 的数据同步到 elasticsearch 中. 使用 canal 做数据同步的时候无疑会涉及到三个部分: 数据源(mysql), canal server(接收 mysql binlog), canal client(接收 canal server 发送的解析过的 binlog 消息).

为了保证数据同步高可用, canal 针对上述三个部分设计了对应的高可用方案.

Canal server 和 client 高可用

Canal server 和 client 端的高可用方案依赖 zookeeper, 启动 canal server 和 client 的时候都会 zookeeper 读取信息. Canal 在 zookeeper 存储的数据结构如下:

/otter
└── canal
    └── destinations
        └── flight_segment  # canal 实例名称 
            ├── 1001 # canal client 信息
            │   ├── cursor # 当前消费的 mysql binlog 位点
            │   ├── filter # binlog 过滤条件
            │   └── running  # 当前正在运行的 canal client 服务器
            ├── cluster # canal server 列表
            │   └── 10.93.61.86:11111 
            └── running # 当前正在运行的 canal server 服务器

Canal server 和 client 启动的时候都会去抢占 zk 对应的 running 节点, 保证只有一个 server 和 client 在运行, 而 server 和 client 的高可用切换也是基于监听 running 节点进行的.

mysql 多数据源高可用

Canal 一个实例可以配置两个数据源, master 和 standby. 假如 master 数据源宕机了, canal 的 MysqlDetectingTimeTask 就会调用 HeartBeatHAController 触发一个在 master 和 standby 数据源之间的自动切换.

MysqlDetectingTimeTask 其实就是在 canal server 和 mysql 之间维护心跳信息, 当 mysql 挂了之后触发一次自动切换.

当然, 为了做到上述三种高可用 Canal 做了很多工作, 在这儿就不展开讲了, 以后有机会的话会仔细分析一下.

参考链接: Canal HA 模式