操作演示

演示视频(5分钟教你配置一个同步任务):请点击图片或者这里

ScreenShot
演示说明:

  1. 搭建一个数据库同步任务,源数据库ip为:10.20.144.25,目标数据库ip为:10.20.144.29. 源数据库已开启binlog,并且binlog_format为ROW.
  1. mysql> show variables like '%binlog_format%';
  2. +---------------+-------+
  3. | Variable_name | Value |
  4. +---------------+-------+
  5. | binlog_format | ROW |
  6. +---------------+-------+
  1. 数据同步精确到一张表进行测试,测试的表名为test.example,简单包含两个子段,测试过程中才创建.

  2. 配置完成后,手动在源库插入数据,然后快速在目标库进行查看数据,验证数据是否同步成功.


视频中的演示文本:

  1. CREATE TABLE `test`.`example` (
  2. `id` int(11) NOT NULL AUTO_INCREMENT,
  3. `name` varchar(32) COLLATE utf8_bin DEFAULT NULL ,
  4. PRIMARY KEY (`ID`)
  5. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
  6.  
  7. insert into test.example(id,name) values(null,'hello');
  8.  
  9. -----
  10. Otter QuickStart 如何配置一个任务
  11. -----
  12. 操作步骤:
  13. 1. 添加数据库
  14. a. 源库 jdbc:mysql://10.20.144.25:3306
  15. b. 目标库 jdbc:mysql://10.20.144.29:3306
  16. 2. 添加canal
  17. a. 提供数据库ip信息
  18. 3. 添加同步表信息
  19. a. 源数据表 test.example
  20. b. 目标数据表 test.example
  21. 4. 添加channel
  22. 5. 添加pipeline
  23. a. 选择node节点
  24. b. 选择canal
  25. 6. 添加同步映射规则
  26. a. 定义源表和目标表的同步关系
  27. 7. 启动
  28. 8. 测试数据

通道配置说明

多种同步方式配置

a. 单向同步

单向同步为最基本的同步方式,目前支持mysql -> mysql/oracle的同步.

基本配置方式就如操作视频中所演示的,操作步骤:

  • 配置一个channel
  • 配置一个pipeline对应node机器选择时,建议遵循:S/E节点选择node需尽可能离源数据库近,T/L节点选择node则离目标数据库近. 如果无法提供双节点,则选择离目标数据库近的node节点相对合适.
  • 配置一个canal
  • 定义映射关系. canal中配置解析的数据库ip需要和映射关系中源表对应的数据库ip一致. ps. 映射关系进行匹配的时候是基于表名,虽然数据库ip不匹配也会是有效.

b. 双向同步

双向同步可以理解为两个单向同步的组合,但需要额外处理避免回环同步. 回环同步算法: Otter双向回环控制 .

同时,因为双向回环控制算法会依赖一些系统表,需要在需要做双向同步的数据库上初始化所需的系统表.

获取初始sql:

  1. wget https://raw.github.com/alibaba/otter/master/node/deployer/src/main/resources/sql/otter-system-ddl-mysql.sql

配置上相比于单向同步有一些不同,操作步骤:

  • 配置一个channel
  • 配置两个pipeline 注意:两个单向的canal和映射配置,在一个channel下配置为两个pipeline. 如果是两个channel,每个channel一个pipeline,将不会使用双向回环控制算法,也就是会有重复回环同步.
  • 每个pipeline各自配置canal,定义映射关系

c. 双A同步

双A同步相比于双向同步,主要区别是双A机房会在两地修改同一条记录,而双向同步只是两地的数据做互相同步,两地修改的数据内容无交集.

所以双A同步需要额外处理数据同步一致性问题. 同步一致性算法:Otter数据一致性 ,目前开源版本主要是提供了单向回环补救的一致性方案.

双A同步相比于双向同步,整个配置主要是一些参数上有变化,具体步骤:

  • 配置一个channel Manager配置介绍 - 图2
  • 配置两个pipelineManager配置介绍 - 图3* 注意:除了需要定义一个主站点外,需要在高级设置中将一个pipeline的“支持DDL”设置为false,另一个设置为true,否则将提示“一个channel中只允许开启单向ddl同步!”错误
  • 每个pipeline各自配置canal,定义映射关系

d. 级联同步

单向同步/双向同步,都是针对一个channel下的多pipeline配置进行控制,是否可以使用多个channel完成类似级联同步的功能.

几种级联同步.

  • A->B->C ,A单向同步到B,B再单向同步到C
  • A<->B->C,A和B组成一个双向,B再单向同步到C
  • A<->B<-C,A和B组成一个双向,C将数据单向同步B,也就是B是一个接受多M同步写入的的节点,目前mysql不支持
  • A<->B->C,B-/->D,A和B组成一个双向,B再单向同步到C,但A同步到B的数据不同步到D,但B地写入的数据同步到D,目前mysql不支持.
    对应操作步骤:

  • 目前channel之间的级联同步,不需要设置任何参数,只要通过canal进行binlog解析即可.

  • 针对级联屏蔽同步,需要利用到自定义同步标记的功能,比如A->B,B同步到C但不同步到D。需要在A->B的同步高级参数里定义NOT_DDD,然后在B同步到D的高级参数里也定义NOT_DDD. 原理:这样在B解析到A->B写入的同步标记为NOT_DDD,与当前同步定义的NOT_DDD进行匹配,就会忽略此同步. Manager配置介绍 - 图4

e. 多A同步

基于以上的单向/双向/双A/级联同步,可以随意搭建出多A同步,不过目前受限于同步数据的一致性算法,只能通过星形辐射,通过级联同步的方式保证全局多A机房的数据一致性. 比如图中B和C之前的一致性同步,需要通过主站点A来保证.

Manager配置介绍 - 图5

自定义数据同步(自 由 门)

主要功能是在不修改原始表数据的前提下,触发一下数据表中的数据同步。

可用于:

  • 同步数据订正
  • 全量数据同步. (自 由 门触发全量,同时otter增量同步,需要配置为行记录模式,避免update时因目标库不存在记录而丢失update操作)
    主要原理:

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

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

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

  • 日志记录. (插入表数据的每次变更,需要开启binlog,otter获取binlog数据,提取同步的表名,pk信息,然后回表查询整行记录)
    retl_buffer表结构:
  1. CREATE TABLE retl_buffer
  2. (
  3. ID BIGINT AUTO_INCREMENT, ## 无意义,自增即可
  4. TABLE_ID INT(11) NOT NULL, ## tableId, 可通过该链接查询:http://otter.alibaba-inc.com/data_media_list.htm,即序号这一列,如果配置的是正则,需要指定full_name,当前table_id设置为0.
  5. FULL_NAME varchar(512), ## schemaName + '.' + tableName (如果明确指定了table_id,可以不用指定full_name)
  6. TYPE CHAR(1) NOT NULL, ## I/U/D ,分别对应于insert/update/delete
  7. PK_DATA VARCHAR(256) NOT NULL, ## 多个pk之间使用char(1)进行分隔
  8. GMT_CREATE TIMESTAMP NOT NULL, ## 无意义,系统时间即可
  9. GMT_MODIFIED TIMESTAMP NOT NULL, ## 无意义,系统时间即可
  10. CONSTRAINT RETL_BUFFER_ID PRIMARY KEY (ID)
  11. ) ENGINE=InnoDB DEFAULT CHARSET=utf8;

全量同步操作示例:

  1. insert into retl.retl_buffer(ID,TABLE_ID, FULL_NAME,TYPE,PK_DATA,GMT_CREATE,GMT_MODIFIED) (select null,0,'$schema.table$','I',id,now(),now() from $schema.table$);

如果针对多主键时,对应的PK_DATA需要将需要同步表几个主键按照(char)1进行拼接,比如 concat(id,char(1),name)

具体参数详解

channel参数

  • 同步一致性. ==> 基于数据库反查(根据binlog反查数据库),基于当前变更(binlog数据)。针对数据库反查,在延迟比较大时比较有效,可将最新的版本快速同步到目标,但会对源库有压力.
  • 同步模式. ==> 行模式,列模式。行模式特点:如果目标库不存在记录时,执行插入。列模式主要是变更哪个字段,只会单独修改该字段,在双A同步时,为减少数据冲突,建议选择列模式。
  • 是否开启数据一致性. ==> 请查看数据一致性文档:Otter数据一致性a. 数据一致性算法b. 一致性反查数据库延迟阀值

pipeline参数

  • 并行度. ==> 查看文档:Otter调度模型,主要是并行化调度参数.(滑动窗口大小)
  • 数据反查线程数. ==> 如果选择了同步一致性为反查数据库,在反查数据库时的并发线程数大小
  • 数据载入线程数. ==> 在目标库执行并行载入算法时并发线程数大小
  • 文件载入线程数. ==> 数据带文件同步时处理的并发线程数大小
  • 主站点. ==> 双A同步中的主站点设置 
  • 消费批次大小. ==> 获取canal数据的batchSize参数
  • 获取批次超时时间. ==> 获取canal数据的timeout参数 pipeline 高级设置
  • 使用batch. ==> 是否使用jdbc batch提升效率,部分分布式数据库系统不一定支持batch协议
  • 跳过load异常. ==> 比如同步时出现目标库主键冲突,开启该参数后,可跳过数据库执行异常
  • 仲裁器调度模式. ==> 查看文档:Otter调度模型
  • 负载均衡算法. ==> 查看文档:Otter调度模型
  • 传输模式. ==> 多个node节点之间的传输方式,RPC或HTTP. HTTP主要就是使用aria2c,如果测试环境不装aria2c,可强制选择为RPC
  • 记录selector日志. ==> 是否记录简单的canal抓取binlog的情况
  • 记录selector详细日志. ==> 是否记录canal抓取binlog的数据详细内容
  • 记录load日志. ==> 是否记录otter同步数据详细内容
  • dryRun模式. ==> 只记录load日志,不执行真实同步到数据库的操作
  • 支持ddl同步. ==> 是否同步ddl语句
  • 是否跳过ddl异常. ==> 同步ddl出错时,是否自动跳过
  • 文件重复同步对比 ==> 数据带文件同步时,是否需要对比源和目标库的文件信息,如果文件无变化,则不同步,减少网络传输量.
  • 文件传输加密 ==> 基于HTTP协议传输时,对应文件数据是否需要做加密处理
  • 启用公网同步 ==> 每个node节点都会定义一个外部ip信息,如果启用公网同步,同步时数据传递会依赖外部ip.
  • 跳过自 由 门数据 ==> 自定义数据同步的内容
  • 跳过反查无记录数据 ==> 反查记录不存在时,是否需要进行忽略处理,不建议开启.
  • 启用数据表类型转化 ==> 源库和目标库的字段类型不匹配时,开启改功能,可自动进行字段类型转化
  • 兼容字段新增同步 ==> 同步过程中,源库新增了一个字段(必须无默认值),而目标库还未增加,是否需要兼容处理
  • 自定义同步标记 ==> 级联同步中屏蔽同步的功能.

Canal参数

  • 数据源信息单库配置: 10.20.144.34:3306;多库合并配置: 10.20.144.34:3306,10.20.144.35:3306; (逗号分隔)主备库配置:10.20.144.34:3306;10.20.144.34:3307; (分号分隔)
  • 数据库帐号
  • 数据库密码
  • connectionCharset ==> 获取binlog时指定的编码
  • 位点自定义设置 ==> 格式:{"journalName":"","position":0,"timestamp":0}; 指定位置:{"journalName":"","position":0}; 指定时间:{"timestamp":0};
  • 内存存储batch获取模式 ==> MEMSIZE/ITEMSIZE,前者为内存控制,后者为数量控制.  针对MEMSIZE模式的内存大小计算 = 记录数 * 记录单元大小
  • 内存存储buffer记录数
  • 内存存储buffer记录单元大小
  • HA机制
  • 心跳SQL配置 ==> 可配置对应心跳SQL,如果配置 是否启用心跳HA,当心跳SQL检测失败后,canal就会自动进行主备切换.

Node参数

  • 机器名称 ==> 自定义名称,方便记忆
  • 机器ip ==> 机器外部可访问的ip,不能选择127.0.0.1
  • 机器端口 ==> 和manager/node之间RPC通讯的端口
  • 下载端口 ==> 和node之间HTTP通讯的端口
  • 外部Ip ==> node机器可以指定多IP,通过pipeline配置决定是否启用
  • zookeeper集群 ==> 就近选择zookeeper集群

Zookeeper集群参数

  • 集群名字 ==> 自定义名称,方便记忆
  • zookeeper集群 ==> zookeeper集群机器列表,逗号分隔,最后以分号结束

主备配置参数

  • group Key ==> 自定义名称,otter其他地方基于该名称进行引用
  • master / slave ==> 主备库ip信息
    生成了groupKey,1. 可以在数据库配置时,设置url:jdbc:mysql://groupKey=key (更改 key). 2. 在canal配置时,选择HA机制为media,可填入该groupKey进行引用

deep

原文: https://github.com/alibaba/otter/wiki/Manager%E9%85%8D%E7%BD%AE%E4%BB%8B%E7%BB%8D