在回答这问题之前,首先来看一张canal&otter和mysql复制的类比图:
**
mysql的自带复制技术可分成三步:
- master将改变记录到二进制日志(binary log)中(这些记录叫做二进制日志事件,binary log events,可以通过show binlog events进行查看);
- slave将master的binary log events拷贝到它的中继日志(relay log),这里是I/O thread线程;
- slave重做中继日志中的事件,将改变反映它自己的数据,这里是SQL thread线程。
基于canal&otter的复制技术和mysql复制类似,具有类比性:
- Canal对应于I/O thread,接收Master Binary Log;
- Otter对应于SQL thread,通过Canal获取Binary Log数据,执行同步插入数据库;
两者的区别在于:
- otter目前嵌入式依赖canal,部署为同一个jvm,目前设计为不产生Relay Log,数据不落地;
- otter目前允许自定义同步逻辑,解决各类需求;
a. ETL转化. 比如Slave上目标表的表名,字段名,字段类型不同,字段个数不同等.
b. 异构数据库. 比如Slave可以是oracle或者其他类型的存储,nosql等.
c. M-M部署,解决数据一致性问题
d. 基于manager部署,方便监控同步状态和管理同步任务.