介绍一款阿里巴巴的数据订阅&消费工具otter,这款产品当时用于解决阿里中美机房数据库实时同步问题。

这里主要讲的是用otter增量同步生产数据库到测试环境数据库。

otter的定位:

基于数据库增量日志分析,实时同步数据

为什么不用mysql自带的主从同步到测试?

因为测试环境的特殊性,功能比较新,有些新表和新字段,直接从生产同步显然不能满足业务需求。otter就能很好解决这个问题,基于binlog分析只对生产有变更的数据进行同步,这样就不会覆盖测试环境已修改的数据,测试环境新增字段和表也不会被覆盖。

otter的工作原理:

otter数据订阅&消费_第1张图片

  • 1.基于canal,获取数据库增量日志,otter的核心组件也就是canal。

  • 2.典型的管理系统架构,manager(web管理)+node(节点)

      manager运行时推送同步配置到node节点

      node节点将同步状态反馈到manager

  • 3.基于zookeeper,解决分布式状态调度,允许多node节点之间协同工作。

otter能解决:

  1. 异构库同步

a. mysql -> mysql/oracle. (目前开源版本只支持mysql增量,目标库可以是mysql或者oracle,取决于canal的功能)

  1. 单机房同步 (数据库之间RTT < 1ms)

a. 数据库版本升级

b. 数据表迁移

c. 异步二级索引

  1. 异地机房同步 (比如阿里巴巴国际站就是杭州和美国机房的数据库同步,RTT > 200ms,亮点)

a. 机房容灾

  1. 双向同步

a. 避免回环算法 (通用的解决方案,支持大部分关系型数据库)

b. 数据一致性算法 (保证双A机房模式下,数据保证最终一致性,亮点)

  1. 文件同步

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配置 数据源

otter数据订阅&消费_第2张图片

  • 3.2进入配置管理-数据表配置

otter数据订阅&消费_第3张图片

  • 3.3进入配置管理-canal配置

otter数据订阅&消费_第4张图片

otter数据订阅&消费_第5张图片

  • 3.4进入机器管理-node,为默认配置,otter启动会默认配好。

otter数据订阅&消费_第6张图片

  • 3.5进入同步管理-channel

otter数据订阅&消费_第7张图片

  • 3.6点击相应的channel名字,进入Pipeline配置,高级配置默认就行。

otter数据订阅&消费_第8张图片

  • 3.7点击pipeline名字列表,进入配置映射关系

otter数据订阅&消费_第9张图片

  • 3.8配置好后,则同步已开始

注意:表必须设置主键才能做同步

  • 4.监控

进入监控-日志管理,若有异常会有日志输出

otter数据订阅&消费_第10张图片

  • 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.效果

源库中插入数据,目标库立马将新数据同步过来

目标库必须先创建表结构才能同步数据


更多精彩,关注公众号

otter数据订阅&消费_第11张图片