介绍一款阿里巴巴的数据订阅&消费工具otter,这款产品当时用于解决阿里中美机房数据库实时同步问题。
这里主要讲的是用otter增量同步生产数据库到测试环境数据库。
otter的定位:
基于数据库增量日志分析,实时同步数据
为什么不用mysql自带的主从同步到测试?
因为测试环境的特殊性,功能比较新,有些新表和新字段,直接从生产同步显然不能满足业务需求。otter就能很好解决这个问题,基于binlog分析只对生产有变更的数据进行同步,这样就不会覆盖测试环境已修改的数据,测试环境新增字段和表也不会被覆盖。
otter的工作原理:
1.基于canal,获取数据库增量日志,otter的核心组件也就是canal。
2.典型的管理系统架构,manager(web管理)+node(节点)
manager运行时推送同步配置到node节点
node节点将同步状态反馈到manager
3.基于zookeeper,解决分布式状态调度,允许多node节点之间协同工作。
otter能解决:
异构库同步
a. mysql -> mysql/oracle. (目前开源版本只支持mysql增量,目标库可以是mysql或者oracle,取决于canal的功能)
单机房同步 (数据库之间RTT < 1ms)
a. 数据库版本升级
b. 数据表迁移
c. 异步二级索引
异地机房同步 (比如阿里巴巴国际站就是杭州和美国机房的数据库同步,RTT > 200ms,亮点)
a. 机房容灾
双向同步
a. 避免回环算法 (通用的解决方案,支持大部分关系型数据库)
b. 数据一致性算法 (保证双A机房模式下,数据保证最终一致性,亮点)
文件同步
a. 站点镜像 (进行数据复制的同时,复制关联的图片,比如复制产品数据,同时复制产品图片).
实战:
用途:生产增量同步指定表到测试环境,供测试工程师测试业务,属于单机房单项同步。
前提,源库my.cnf开启,binlog,row模式:
log_bin = mysql-bin #打开日志
binlog_format = ROW #设置row模式的日志格式
server-id = 2 #id不能重复
在增量之前,做一次数据库的全量同步,可以用xtrbackup。
1.用docker一键安装启动otter,自动处理映射,目录挂载等
curl fsSL https://raw.githubusercontent.com/alibaba/otter/master/docker/run.sh | bash
默认run.sh脚本会通过目录挂载的方式,将数据文件挂载到当前的data/目录下(包含zkData/mysql两个子目录),所以执行curl之前最好进入到一个自己的工作目录,比如cd otter
2.访问otter的manager地址
http://${host}:8080/
3.配置
3.1配置 数据源
3.2进入配置管理-数据表配置
3.3进入配置管理-canal配置
3.4进入机器管理-node,为默认配置,otter启动会默认配好。
3.5进入同步管理-channel
3.6点击相应的channel名字,进入Pipeline配置,高级配置默认就行。
3.7点击pipeline名字列表,进入配置映射关系
3.8配置好后,则同步已开始
注意:表必须设置主键才能做同步
4.监控
进入监控-日志管理,若有异常会有日志输出
5.给出测试数据
CREATE TABLE `test`.`example` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) COLLATE utf8_bin DEFAULT NULL , PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
insert into test.example(id,name) values(null,'hello');
6.效果
源库中插入数据,目标库立马将新数据同步过来
目标库必须先创建表结构才能同步数据
更多精彩,关注公众号