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 模式
**粗体** _斜体_ [链接](http://example.com) `代码` - 列表 > 引用
。你还可以使用@
来通知其他用户。