操作演示

  1. 搭建一个数据库同步任务,源数据库ip为:10.20.144.25,目标数据库ip为:10.20.144.29. 源数据库已开启binlog,并且binlog_format为ROW.
  1. 数据同步精确到一张表进行测试,测试的表名为test.example,简单包含两个子段,测试过程中才创建.

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


视频中的演示文本:

通道配置说明

a. 单向同步

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

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

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

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

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

获取初始sql:

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

c. 双A同步

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

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

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

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

单向同步/双向同步,都是针对一个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进行匹配,就会忽略此同步.

e. 多A同步

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

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

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

可用于:

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

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

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

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

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

全量同步操作示例:

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

具体参数详解

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

pipeline参数

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

主备配置参数

  • group Key ==> 自定义名称,otter其他地方基于该名称进行引用