Skip to content
This repository has been archived by the owner on Jan 10, 2025. It is now read-only.

otter双向同步

He Wang edited this page Mar 10, 2023 · 16 revisions

otter

https://github.com/alibaba/otter/wiki/Introduction

otter是alibaba开源的一个数据同步工具,也是canal的父项目,它使用canal来读取数据源的增量数据,通过在事务头和尾中插入标识的方式,解决了双向同步的数据回环问题。

部署

搭配otter使用时,otter和canal-for-ob均需要使用最新代码。

0 准备

必备组件:

  • ob集群:两个集群一个作为主集群,一个作为从集群。DML可以双向同步,DDL只支持从主集群向从集群同步。
  • oblogproxy:确保oblogproxy和ob集群之间的网络通畅,可以使用 logproxy-client 进行验证。
  • 元信息数据库:可以使用单独的db,也可以使用ob集群中的一个。
  • Zookeeper:otter manager 和 otter node 运行依赖
  • JDK 8:otter manager 和 otter node 运行环境

若从源码进行编译,还需要 Git 和 Maven

1 安装otter压缩包

下载压缩包

源码构建

首先获取最新代码

git clone https://github.com/oceanbase/canal.git
git clone https://github.com/alibaba/otter.git

本地安装canal

cd ${canal_repo}
./mvnw clean install -DskipTests=true

安装otter的本地依赖

cd ${otter_repo}/lib
bash install.sh

修改otter的pom文件,将其中的otter_canal_version改成1.1.6-SNAPSHOT,之后构建项目

cd ${otter_repo}
mvn clean package -DskipTests=true -Prelease

生成的压缩包在target目录下。

2 初始化otter数据表

在 manager 元数据库中执行 otter-manager-schema.sql,在双向同步的ob集群分别执行 otter-system-ddl-mysql.sql

在ob执行授权语句时会出现报错,如果只有 REPLICATION 和 EXECUTE 相关的报错则可以忽略不计,这里我们并不需要这些权限。如果出现 Invalid default value 报错,请先执行以下语句后再重新执行出错的语句。参考 https://github.com/alibaba/otter/pull/747

SET sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

3 配置 manager

参考:

解压 manager 安装包,修改 /conf/otter.properties 以下配置

## 域名和端口,用于 web 页面和 node 访问 manager
otter.domainName = otter
otter.port = 8080

## 元数据库连接信息
otter.database.driver.class.name = com.mysql.jdbc.Driver
otter.database.driver.url = jdbc:mysql://127.0.0.1:3306/otter?useSSL=false
otter.database.driver.username = root
otter.database.driver.password = pswd

## 与 node 通信的端口
otter.communication.manager.port = 1099

## 通信线程池大小
otter.communication.pool.size = 10

## zookeeper 配置
otter.zookeeper.cluster.default = 127.0.0.1:2181
otter.zookeeper.sessionTimeout = 60000

配置完成后,执行 ./bin/startup.sh 启动服务,之后可以通过 ${otter.domainName}:${otter.communication.manager.port} 访问页面。

4 配置 node

参考:Node_Quickstart

4.1 在 manager 页面配置 node

首先,在 manager 页面的机器管理模块点击 zookeper 管理,添加 Zookeeper。之后点击机器管理模块的 Node 管理,添加 Node。

  • 机器名称:可以随意定义,方便自己记忆即可
  • 机器ip:对应node节点将要部署的机器ip,如果有多ip时,可选择其中一个ip进行暴露. (此ip是整个集群通讯的入口,实际情况千万别使用127.0.0.1,否则多个机器的node节点会无法识别)
  • 机器端口:对应node节点将要部署时启动的数据通讯端口,建议值:2088。
  • 下载端口:对应node节点将要部署时启动的数据下载端口,建议值:9090。
  • MBean端口:对应node节点将要部署时启动的 MBeanServer 端口。
  • 外部ip :机器的公网 ip,填写后将允许通讯的时候走公网处理。
  • zookeeper集群:绑定的zookeeper集群。

4.2 启动 node

添加 node 完成后,在列表页可以拿到该 node 的序号,该序号也就是 node 的 id,简称 nid。 下一步,解压 node 安装包,并将上述的 nid 写入到文件

echo ${nid} > conf/nid

修改配置文件 conf/otter.properties

## manager 的通信地址,应与 manager 中的配置一致
otter.manager.address = 127.0.0.1:1099

之后执行 ./bin/startup.sh 启动 node,可以在 manager 页面看到对应的 node 已经转为 已启动 状态。

5 创建双向同步channel

5.1 配置管理:数据源配置

添加 MYSQL 类型数据源,添加ob集群的连接串作为URL,两个集群对应两个数据源。

5.2 配置管理:数据表配置

分别为两个数据源创建需要同步的表格,此处的schema name不包含租户名,支持正则匹配。

5.3 配置管理:canal配置

为两个数据源添加canal,类型选择oceanbase。必填的项目带有红星,其中oceeanbase特有的选项有

  • 数据库地址:因为canal实际上是直接跟oblogproxy相连接的,此处的数据库地址需要填写的是oblogproxy的ip和端口。
  • rsList:数据源ob集群的root server list,可以使用 show parameters like 'rootservice_list'; 查看。
  • tenant:订阅数据的租户名,一个canal 实例只能订阅一个租户的数据。

更多的配置介绍参考 部署canal.deployer(OB作为数据源)

5.4 同步管理:Channel管理

首先创建一个channel,之后进入channel,创建两个方向的pipeline。

在创建pipeline时,需要选定一个同步方向为主站点,高级设置中可以调整日志和异常处理等配置,其中 支持ddl同步 选项只能在 主站点 开启。

pipeline配置完成后,分别为两个pipeline添加映射关系,完成后即可启用该channel。

问题排查

平台日志

当pipeline处理出错时,可以在pipeline页面点击“日志”进入日志界面查看异常信息。

本地日志

与canal类似,otter的manager和node模块也都是deployer加底层组件的两层结构,其日志也主要有两种。

  • manager:manager deployer的日志在 logs/manager.log 中,组件日志在logs目录下的其他文件中。
  • node:node deployer的日志在 logs/node/node.log,具体的node实例的日志在 logs/${nid}/ 目录下。