一、otter介绍

otter-github传送门

1.1 otter是什么

基于数据库增量日志解析(binlog),准实时同步到本机房或异地机房的mysql/oracle数据库. 一个分布式数据库同步系统。分为两个部分:manger和node。能够实现双A,即两边数据库均可写,并且保证数据一致性的系统。

1.2 整体架构

1.jpg

基于一个otter的一个插件 canal 数据采集工具 (嵌入node节点)
manager(web管理)+node(工作节点)+zookeeper 多点之间协同工作的。

名词解释

  • Pipeline:从源端到目标端的整个过程描述,主要由一些同步映射过程组成
  • Channel:同步通道,单向同步中一个Pipeline组成,在双向同步中有两个Pipeline组成
  • DataMediaPair:根据业务表定义映射关系,比如源表和目标表,字段映射,字段组等
  • DataMedia : 抽象的数据介质概念,可以理解为数据表/mq队列定义
  • DataMediaSource : 抽象的数据介质源信息,补充描述DateMedia
  • ColumnPair : 定义字段映射关系
  • ColumnGroup : 定义字段映射组
  • Node : 处理同步过程的工作节点,对应一个jvm

    S/E/T/L stage阶段模型

    2.png

    1.3 otter 具体能做什么

  • 异构库同步 mysql -> mysql/oracle

  • 单机房同步
  • 异地机房同步
  • 双向同步
    • 重点: 解决双主问题、数据一致性问题
  • 文件同步

    二、otter安装

    下载地址 目前使用版本4.2.18 quick-start

2.1 环境准备

  1. mysql 两个机房同步都需要安装

    1. 修改 my.cnf 开启biglog
    2. 开启 设置级别为row 记录每次操作后每行记录的变化
    3. 设置server-id 每个数据库不能设置一样
    4. 设置要开启的db 没有就是全部开启
    5. 修改完成后进入mysql 刷新配置 flush privileges;
      1. [mysqld]
      2. log-bin=mysql-bin
      3. binlog_format=row
      4. server-id=1
      5. binlog-do-db=mycan
  2. zookeeper 可以是单节点也可以是集群,建议每个机房都搭建一个zk集群然后组成一个物理大集群

  3. 多线程传输技术 aria2

    2.2 安装manager

    由于manager是基于数据库进行信息存储,为了防止节点异常,不和node节点装在一台机器上,由于是基于mysql可以装两台manager。

    manager 准备脚本 otter-manager-schema.sql

2.2.1 修改配置文件

  1. ## otter manager domain name
  2. otter.domainName = 127.0.0.1 (正确访问ip,管理界面使用)
  3. ## otter manager http port
  4. otter.port = 8080 (正确访问端口,管理界面使用)
  5. ## otter manager database config (修改为正确数据库信息 准备脚本的位置)
  6. otter.database.driver.class.name = com.mysql.jdbc.Driver
  7. otter.database.driver.url = jdbc:mysql://127.0.0.1:3306/otter
  8. otter.database.driver.username = root
  9. otter.database.driver.password = hello
  10. ## default zookeeper address (修改到最近一个能访问的zk地址)
  11. otter.zookeeper.cluster.default = 127.0.0.1:2181
  12. ## default zookeeper sesstion timeout = 60s
  13. otter.zookeeper.sessionTimeout = 60000

2.2.2 启动

bin目录下对应启动文件 win、linux均可以启动
image.png
第一次进入界面 需要登录才能登陆 初始用户名密码为 admin/admin

2.3 安装node

安装node 需要在manager启动的前提下才能安装

2.3.1 需要现在manager上先配置好zk节点,再配置一个node节点

image.png

2.3.2 添加node 节点 生成一个node节点id

image.png

2.3.3 创建nid文件

在conf 文件夹下创建一个nid文件 内容为node节点的序号
linux下创建

  1. echo 1 >~/node/conf/nid

win下创建
image.png

2.3.3 修改otter.properties的配置文件

  1. ## otter arbitrate & node connect manager config 修改为正确的manager服务地址
  2. otter.manager.address = 127.0.0.1:1099

2.3.4 启动

如果manager 中出现 已启动 表示启动成功

三、otter使用

manager使用介绍 manager配置介绍

3.1 配置数据源

来去两个数据源都需要配置
编码选择mysql节点中 /etc/my.cof中的数据编码

image.png

3.2 配置数据表

可以支持正则表达式,一次配置多个表
image.png

3.3 配置canal

注意:一个pipeline对应一个canal 多个pipeline应该再次创建
可以自定义binlog位置
image.png

3.4 配置单向同步

3.4.1 添加一个channel

image.png

3.4.2 添加一个pipeline

单向同步,一个channel只有一个pipeline

image.png

3.4.3 添加映射关系

字段名称不同,字段类型不同均可以映射
image.png

3.4.4 验证

在源表上插入数据 在目标表中同样会出现一条一样的数据

3.5 配置双A同步

3.5.1 双A配置需要在文档中捞取sql 在源端和目标端都需要执行

image.png

3.5.2 添加一个channel

必须开启数据一致性
a. 同步一致性

  1. 基于数据库反查 (简单点说,就是强制反查数据库,从binlog中拿到pk,直接反查对应数据库记录进行同步,回退到几天前binlog进行消费时避免同步老版本的数据时可采用)
  2. 基于当前日志变更 (基于binlog/redolog解析出来的字段变更值进行同步,不做数据库反查,推荐使用)

b. 同步模式

  1. 行模式 (兼容otter3的处理方案,改变记录中的任何一个字段,触发整行记录的数据同步,在目标库执行merge sql)
  2. 列模式 (基于log中的具体变更字段,按需同步)

c. 特殊组合: (同样支持)

  1. 基于数据库反查+列模式
  2. 基于当前日志变更+行模式

image.png

3.5.3 添加两个pipeline

双A 需要正向、逆向pipeline 都要配置,并且需要注意

  1. _只能有一个_pipeline设置为主站点
  2. 高级设置中只能有一个支持ddl同步
  3. 两个都必须设置跳过ddl异常

image.png

3.5.4 添加映射关系

和单向同步一致

3.5.5 验证

在两个表中相互新增,修改数据,都会同步到对方表中。

3.6 配置监控

前提在manager中properties里配置邮件发送服务器和发送人
Pipeline管理下添加监控配置 key 填写 联系人前面的otterteam 邮件联系人配置是k-v配置

3.png4.png

监控项目

  • 同步延迟,position超时(位点超过多少时间没有更新) , 一般业务方关心这些即可
  • 异常 (同步运行过程中出现的异常,比如oracle DBA关心oracle系统ORA-的异常信息,mysql DBA关心mysql数据库相关异常)
  • process超时(一个批次数据执行超过多少时间),同步时间超时(数据超过多少时间没有同步成功过)

阀值设置

  • 1800@09:00-18:00 , 这例子是指定了早上9点到下午6点,报警阀值为1800.

3.7 otter使用注意点

3.7.1 使用限制

  1. 暂不支持无主键表同步. (同步的表必须要有主键,无主键表update会是一个全表扫描,效率比较差)
  2. 支持部分ddl同步 (支持create table / drop table / alter table / truncate table / rename table / create index / drop index,其他类型的暂不支持,比如grant,create user,trigger等等),同时ddl语句不支持幂等性操作,所以出现重复同步时,会导致同步挂起,可通过配置高级参数:跳过ddl异常,来解决这个问题.
  3. 不支持带外键的记录同步. (数据载入算法会打散事务,进行并行处理,会导致外键约束无法满足)
  4. 数据库上trigger配置慎重. (比如源库,有一张A表配置了trigger,将A表上的变化记录到B表中,而B表也需要同步。如果目标库也有这trigger,在同步时会插入一次A表,2次B表,因为A表的同步插入也会触发trigger插入一次B表,所以有2次B表同步.)

    3.7.2 node jvm配置

    单node建议的同步任务,建议控制下1~2wtps以下,不然内存不够用. 出现不够用时,具体的解决方案:

  5. 调大node的-Xms,-Xmx内存设置,默认为3G,heap区大概是2GB

  6. 减少每个同步的任务内存配置.
    a. canal配置里有个内存存储buffer记录数参数,默认是32768,代表32MB的binlog,解析后在内存中会占用100MB的样子.
    b. pipeline配置里有个批次大小设置,默认是6000,代表每次获取6MB左右,解析后在内存占用=并行度6MB3,大概也是100MB的样子.

3.7.3 数据表字段变更

  1. 只允许新增字段到末尾 (删除字段慎重)
  2. 字段新增先加目标库,再加源库
  3. 双向同步,新增字段建议无默认值 (可确保同步无挂起)

    3.7.4 同一事物中向两个数据库插入数据并且id相同(几乎不会出现)

    5.png
    只能插入一条数据,会有一条数据主键冲突

    3.7.5 向两端数据库同时插入数据,并且id相同(几乎不会出现)

    6.png7.png
    会出现插入一条空数据的情况