1. 什么是Otter
❑ 项目背景
❑ 语言
- 纯java开发
❑ 定位
- 基于数据库增量日志解析,准实时同步到本机房或异地机房的MySQL/Oracle数据库
❑ 模块组成
Zookeeper:分布式一致性协调服务
Canal:获取数据库增量日志数据
manager:管理中心,用来配置同步信息,接收node模块发来的状态反馈
node:node 模块内嵌 Canal,Canal 监听数据库binlog中的变化传送给node的SETL模块

- 基于Canal开源产品,获取数据库增量日志数据
- manager(web管理)+ node(工作节点):典型管理系统架构
- manager运行时推送同步配置到node节点
- node节点将同步状态反馈到manager上
- 基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作
2. Otter 提供的解决方案
[!NOTE] ❑ 异构库同步
- MySQL -> MySQL/Oracle
(※ 目前开源版本只支持MySQL增量,目标库可以是MySQL/Oracle ,取决于Canal的功能)
❑ 单机房同步
(※ 数据库之间RTT < 1ms)
- 数据库版本升级
- 数据表迁移
- 异步二级索引
❑ 异地机房同步
( ※ 比如阿里巴巴国际站就是杭州和美国机房的数据库同步,RTT > 200ms,亮点)
- 机房容灾
❑ 双向同步
- 避免回环算法(通用的解决方案,支持大部分关系型数据库)
- 数据一致性算法 (保证双A机房模式下,数据保证最终一致性,亮点)
❑ 文件同步
- 站点镜像 (进行数据复制的同时,复制关联的图片,比如复制产品数据,同时复制产品图片)
2.1.1. 单机房同步复制
说明:
a. 数据on-Fly,尽可能不落地,更快的进行数据同步. (开启node loadBalancer算法,如果Node节点S+ETL落在不同的Node上,数据会有个网络传输过程)
b. node节点可以有failover / loadBalancer.
2.1.2. 异地机房同步复制
说明:
a. 数据涉及网络传输,S/E/T/L几个阶段会分散在2个或者更多Node节点上,多个Node之间通过zookeeper进行协同工作 (一般是Select和Extract在一个机房的Node,Transform/Load落在另一个机房的Node)
b. node节点可以有failover / loadBalancer. (每个机房的Node节点,都可以是集群,一台或者多台机器)
3. 相关知识点解释
3.1. Otter 核心model关系图
3.2. 名词解释
- Pipeline:从源端到目标端的整个过程描述,主要由一些同步映射过程组成
- Channel:同步通道,单向同步中一个Pipeline组成,在双向同步中有两个Pipeline组成
- DataMediaPair:根据业务表定义映射关系,比如源表和目标表,字段映射,字段组等
- DataMedia : 抽象的数据介质概念,可以理解为数据表/mq队列定义
- DataMediaSource : 抽象的数据介质源信息,补充描述DateMedia
- ColumnPair : 定义字段映射关系
- ColumnGroup : 定义字段映射组
- Node : 处理同步过程的工作节点,对应一个jvm
----
3.3. Otter 的S/E/T/L stage阶段模型
说明:为了更好的支持系统的扩展性和灵活性,将整个同步流程抽象为Select/Extract/Transform/Load,这么4个阶段.
Select阶段: 为解决数据来源的差异性,比如接入canal获取增量数据,也可以接入其他系统获取其他数据等。
Extract/Transform/Load 阶段:类似于数据仓库的ETL模型,具体可为数据join,数据转化,数据Load
4. Otter FAQ
❑ Otter与Canal的依赖关系
- Otter 目前嵌入式依赖 Canal,主要靠Canal解决数据库增量日志解析,两者部署为同一个jvm,目前设计为不产生 Relay Log ,数据不落地
- 由于 Otter 受到内嵌的 Canal 的版本限制,对数据库的支持如下:
- Otter <= v4.2.16 支持 MySQL的5.1 ~ 5.7版本
- Otter >= v4.2.17(内嵌Canal >= v1.1.2)增加了对 MySQL 8.0 的解析支持
- 仅支持MySQL作为主库(Master),MySQL/Oracle作为从库(Slave)
- Canal 支持 mixed、row、statement 多种日志协议的解析,但配合Otter进行数据库同步,目前仅支持row协议的同步