otter使用介绍

otter

产品介绍

开源仓地址:https://github.com/alibaba/otter

基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库. 一个分布式数据库同步系统

官放介绍(入门)ppt: https://cloud.189.cn/t/Uzq6reEZ3A3m(访问码:duq6)

官放介绍(进阶)ppt:https://cloud.189.cn/t/RBraMnFz2Abi(访问码:0g2l)

整体架构

img

原理描述:

  1. 基于Canal开源产品,获取数据库增量日志数据。 什么是Canal, 请点击

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

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

​ b. node节点将同步状态反馈到manager上

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

使用场景

1.多实例数据源、小数据量实时同步(避免重复购买DTS实时同步);

2.仅实验mysql-mysql同步,其他同步未测试。

部署方案

建议部署:

otter服务1台机器

zookeeper,最好单独部署

node单独部署,manager端可部署一个node, 承载计算公式:

数据库连接均与正式环境数据库在一个VPC下,使用内网链接

端口用途描述 默认端口号 添加方式
Web管理端 8080 部署机外网出
zookeeper 2181 部署机外网出

使用指南

官方开源仓wiki:https://github.com/alibaba/otter/wiki

介绍很详细,在这里就不cpoy过来了,这边举例几个实际使用场景,及大数据量同步场景稳定性测试结果;

前提准备:

登录系统后,按照命名规范新建条目(不然后面越加越乱)

Zookeeper注册,集群名称命名规则:otter_zookeeper_1、otter_zookeeper_2

Node注册,集群名称命名规则:otter_node_1、otter_node_2

数据源添加,命名规则:项目群名称_实例命名@账号名称

数据库表添加,按实际库表名称展示

cannal添加,命名规则:otter_canal_实例/项目群代码缩写@业务描述,同样的数据可做多份canal,即同源多分发需建多个canal

channal添加,命名规则:项目名称_业务描述,新增表同步后加同名channal并增加下划线区分()等同于阿里DTS的同步任务

注意:目标表支持ADB,使用mysql驱动,但是ADB端需手动建表(按照数仓开发规范,需审核使用方法正确性)

image-20220608104050022

Pipeline添加,命名规范:单向传输即可,同一channal不能对应多个Pipeline

新增表同步实验:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
#创建临时表
DROP TABLE IF EXISTS tb_aaa;
CREATE TABLE tb_aaa(
Id bigint(20) NOT NULL AUTO_INCREMENT,
Value int,
PRIMARY KEY (Id)
);

DROP TABLE IF EXISTS tb_bbb;
CREATE TABLE tb_bbb(
Id bigint(20) NOT NULL AUTO_INCREMENT,
Value int,
PRIMARY KEY (Id)
);
新建数据源

表名称支持正则表达式,或者直接填写.*添加全部表

注意:只读数据源需使用 _bl账号,写数据源需使用有写权限账号,最好是user_dts。

建立源表目标表

建立中途添加源表

新建channel

有需要指定时间点和binlog位置点为起点时,选中位点自定义设置,填写

1
2
3
4
show master status;
select unix_timestamp();
#得出最终填写参数
{"journalName":"mysql-bin.003047","position":60293232,"timestamp":1654594309};

canal具体参数含义见官方wiki文档。

建立同步channel

直接同步管理-左下角,添加

具体参数可见官方wiki文档。

点击Channel名字建立Pipeline

高级设置里参数解释详见官方wiki,注意需开启 支持ddl同步选项

注意:每个canal只能提供给一个Pipeline。

点击Pipeline名称添加同步映射关系表

下一步,可编辑字段对应关系及修改字段名称

回到Channel管理界面,点击启动

1
2
3
4
5
6
7
8
9
10

#建立同步任务后写入数据
INSERT INTO tb_aaa(Value)
SELECT 1
UNION
SELECT 2;

#查看目标表
SELECT *
FROM tb_bbb;

1
2
3
4
5
6
7
8
#源表新增字段
ALTER TABLE tb_aaa
ADD COLUMN AddColumn int NOT NULL DEFAULT 1024 AFTER `Value`
;

#查看目标表
SELECT *
FROM tb_bbb;

新加表同步,暂停channel,添加表映射(这里变更下目标表的表名和字段名)
1
2
3
4
5
6
7
8
9
10
11
12
13
DROP TABLE IF EXISTS tb_ccc;
CREATE TABLE tb_ccc(
Id bigint(20) NOT NULL AUTO_INCREMENT,
ValueC int,
PRIMARY KEY (Id)
);

DROP TABLE IF EXISTS tb_ddd;
CREATE TABLE tb_ddd(
Id bigint(20) NOT NULL AUTO_INCREMENT,
ValueD int,
PRIMARY KEY (Id)
);

写入源表数据
1
2
3
4
INSERT INTO tb_aaa(Value)
SELECT 3
UNION
SELECT 4;
回到Channel管理,开启同步

可以看到刚才开启同步之前写入的数据已经在同步记录里了

也就是说canal支持暂停同步,添加表后再开启同步

暂停期间不支持DDL,不能修改表结构,不然重启任务后会报错,暂停期间需要占用很大ottermanager部署机器的内存空间,需短时间内完成表添加

1
2
3
4
#查看目标表
SELECT *
FROM tb_bbb
WHERE Value IN (3,4);

验证新加的表数据是否能够完成同步任务
1
2
3
4
5
6
7
8
#查看目标新增表
INSERT INTO tb_ccc(ValueC)
SELECT 1
UNION
SELECT 2;

SELECT *
FROM tb_ddd;

字段名称对应关系变更一定要放到下面的方框内

3.大数据量变更稳定性测试

案例1:备案中心设备状态表

变更数据量:

平均延迟时间

历史吞吐量

同步稳定运行半个月

案例2:客户中心配置信息实时同步,稳定运行

image-20220608100822238

4.预警配置

系统管理菜单下,点击系统参数设置

添加预警组后,回到Pipeline管理界面添加监控规则

image-20220608095144721

5.实时数据初始化方案

方式1:
otter本身支持自动以数据同步(自由门),增量同步需用行记录模式,

主要原理:

a. 基于otter系统表retl_buffer,插入特定的数据,包含需要同步的表名,pk信息。

b. otter系统感知后会根据表名和pk提取对应的数据(整行记录),和正常的增量同步一起同步到目标库。

目前otter系统感知的自 由 门数据方式为:

  • 日志记录. (插入表数据的每次变更,需要开启binlog,otter获取binlog数据,提取同步的表名,pk信息,然后回表查询整行记录)

方式2:

使用DATAX配合,先开otter启实时同步稳定后,再开启部署好的DATAX离线同步,待离线完成后,恢复otter同步。(保障otter组件canal记录的时间点在DATAX开启时间点之前即可,还要保障日志都能够读到(未释放))

目标表必需有主键,DATAX writer使用replace方式写入

FAQ

官方列举出的常见问题:https://github.com/alibaba/otter/wiki/Faq

网络资料:

Otter的限制

1 otter只支持ROW模式的数据同步,其他两种模式不支持
2 源库只支持mysql,目标库支持mysql和oracle
3 同步的表必须要有主键,无主键表update会是一个全表扫描,效率比较差),就是全字段匹配,如果出现重复记录的话,同步会导致数据错乱
4 支持部分ddl同步 (支持create table / drop table / alter table / truncate table / rename table / create index / drop index,其他类型的暂不支持,比如grant,create user,trigger等等),同时ddl语句不支持幂等性操作,所以出现重复同步时,会导致同步挂起,可通过配置高级参数:跳过ddl异常,来解决这个问题
5 otter ddl同步不支持异构处理,库名、表名都要求一致
6 不支持带外键的记录同步. (数据载入算法会打散事务,进行并行处理,会导致外键约束无法满足)
7 数据库上trigger配置慎重. (比如源库,有一张A表配置了trigger,将A表上的变化记录到B表中,而B表也需要同步。如果目标库也有这trigger,在同步时会插入一次A表,2次B表,因为A表的同步插入也会触发trigger插入一次B表,所以有2次B表同步.)
8 2个manager,可以部署2个manager,manager之间本身没有通信,而是通过zk和数据库,配置node的时候需要知道manager,可以指定其中一个即可,数据会反应到数据库和zk中,但是当这个manager挂了,新配置的node信息就不能反馈到另外一个manager上,所以最佳实践是指定所有的manage

常见故障处理

1 异构环境下(源与目标库名表名有一个不相同),主库执行DDL导致同步挂起,此时可跳过DDL同步进行恢复,将源库执行的DDL SQL手动执行到目标库。
2 网络中断导致同步挂起,此时可重启服务器对应node节点进行恢复。
3 其他问题,可通过修改canal post位点或者重新同步进行解决。
4 Channel挂起或暂停已超源实例MySQLbinlog清理时间,可初始化其同步进度重新从某时间点开始继续同步,但需要做一次离线同步。


otter使用介绍
https://blog.wongcw.cn/2022/06/09/otter使用介绍/
作者
wangcw
发布于
2022年6月9日
许可协议