-
Notifications
You must be signed in to change notification settings - Fork 8
otter双向同步
https://github.com/alibaba/otter/wiki/Introduction
otter是alibaba开源的一个数据同步工具,也是canal的父项目,它使用canal来读取数据源的增量数据,通过在事务头和尾中插入标识的方式,解决了双向同步的数据回环问题。
搭配otter使用时,otter和canal-for-ob均需要使用最新代码。
必备组件:
- ob集群:两个集群一个作为主集群,一个作为从集群。DML可以双向同步,DDL只支持从主集群向从集群同步。
- oblogproxy:确保oblogproxy和ob集群之间的网络通畅,可以使用 logproxy-client 进行验证。
- 元信息数据库:可以使用单独的db,也可以使用ob集群中的一个。
- Zookeeper:otter manager 和 otter node 运行依赖
- JDK 8:otter manager 和 otter node 运行环境
若从源码进行编译,还需要 Git 和 Maven
首先获取最新代码
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目录下。
在 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';
参考:
解压 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}
访问页面。
首先,在 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集群。
添加 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 已经转为 已启动
状态。
添加 MYSQL 类型数据源,添加ob集群的连接串作为URL,两个集群对应两个数据源。
分别为两个数据源创建需要同步的表格,此处的schema name不包含租户名,支持正则匹配。
为两个数据源添加canal,类型选择oceanbase。必填的项目带有红星,其中oceeanbase特有的选项有
- 数据库地址:因为canal实际上是直接跟oblogproxy相连接的,此处的数据库地址需要填写的是oblogproxy的ip和端口。
- rsList:数据源ob集群的root server list,可以使用
show parameters like 'rootservice_list';
查看。 - tenant:订阅数据的租户名,一个canal 实例只能订阅一个租户的数据。
更多的配置介绍参考 部署canal.deployer(OB作为数据源)。
首先创建一个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}/ 目录下。