otter快速开始
# 一、otter简介
otter是一个分布式数据库同步系统. 基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库.
原理描述:
基于Canal开源产品,获取数据库增量日志数据。 什么是Canal, 请点击 (opens new window)
典型管理系统架构,manager(web管理)+node(工作节点)
a. manager运行时推送同步配置到node节点
b. node节点将同步状态反馈到manager上
基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作.
参考:otter wiki (opens new window)、otter github (opens new window)
# 二、otter服务启动
# 2.1、源码下载编译
git clone https://github.com/alibaba/otter.git
#使用otter最近的一个tag: otter-4.2.18
git checkout otter-4.2.18
2
3
目录结构如下
# 2.2、otter-manager启动
step0:初始化otter-manager数据库
文件路径: otter\manager\deployer\src\main\resources\sql\otter-manager-schema.sql
step1:配置修改
更改文件otter\manager\deployer\src\main\resources\otter.properties
的mysql和zk配置
## otter manager database config
otter.database.driver.class.name = com.mysql.jdbc.Driver
otter.database.driver.url = jdbc:mysql://mysql:3306/otter?useUnicode=true&characterEncoding=UTF-8&rewriteBatchedStatements=true&serverTimezone=Asia/Shanghai&useSSL=false&allowMultiQueries=true
otter.database.driver.username = root
otter.database.driver.password = ******
## default zookeeper address
otter.zookeeper.cluster.default = zk:2181
## default zookeeper sesstion timeout = 60s
otter.zookeeper.sessionTimeout = 60000
2
3
4
5
6
7
8
9
10
step2:启动项目
otter-manager启动类otter\manager\deployer\src\main\java\com\alibaba\otter\manager\deployer\OtterManagerLauncher.java
step3:查看日志
tail logs/manager.log
step4:验证
访问: http://127.0.0.1:8080/,出现otter的页面,即代表启动成功
点击右上角登录,初始密码为:admin/admin,即可完成登录. 目前:匿名用户只有只读查看的权限,登录为管理员才可以有操作权限
参考:Manager_QuickStart (opens new window)
# 2.3、otter-node启动
step1: 在manager页面为node定义配置信息,并生一个唯一id.
a. 首先访问manager页面的机器管理页面,点击添加机器按钮(需要提前配置zk)
几点说明:
- 机器名称:可以随意定义,方便自己记忆即可
- 机器ip:对应node节点将要部署的机器ip,如果有多ip时,可选择其中一个ip进行暴露. (此ip是整个集群通讯的入口,实际情况千万别使用127.0.0.1,否则多个机器的node节点会无法识别)
- 机器端口:对应node节点将要部署时启动的数据通讯端口,建议值:2088
- 下载端口:对应node节点将要部署时启动的数据下载端口,建议值:9090
- 外部ip :对应node节点将要部署的机器ip,存在的一个外部ip,允许通讯的时候走公网处理。
- zookeeper集群:为提升通讯效率,不同机房的机器可选择就近的zookeeper集群.
node这种设计,是为解决单机部署多实例而设计的,允许单机多node指定不同的端口
b. 机器添加完成后,跳转到机器列表页面,获取对应的机器序号nid
step2:配置修改
更改文件otter\node\deployer\src\main\resources\otter.properties
的otter-manager配置(默认127.0.0.1:1099
)
# otter node root dir
otter.nodeHome = ${user.dir}/../
## otter node dir
otter.htdocs.dir = ${otter.nodeHome}/htdocs
otter.download.dir = ${otter.nodeHome}/download
otter.extend.dir= ${otter.nodeHome}/extend
## default zookeeper sesstion timeout = 60s
otter.zookeeper.sessionTimeout = 60000
## otter communication payload size (default = 8388608)
otter.communication.payload = 8388608
## otter communication pool size
otter.communication.pool.size = 10
## otter arbitrate & node connect manager config
otter.manager.address = 127.0.0.1:1099
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
step3:启动项目
otter-node启动类otter\node\deployer\src\main\java\com\alibaba\otter\node\deployer\OtterLauncher.java
step4:增加vm option -Dnid=1
(step1生成的node id)
如果nid不存在,会出现
nid:1 in manager[127.0.0.1:1099]is not found!
问题
step5:查看日志
tail logs/node/node.log
step6:验证
查看对应的节点状态,如果变为了已启动,代表已经正常启动。(ps,如果是未启动,会是一个红色高亮)
参考:Node_QuickStart (opens new window)
# 三、FAQ
# 3.1、Cannot resolve com.oracle:ojdbc6:11.1.0.7.0
问题原因:
maven的中央仓库中没有这个资源,只能通过配置本地库才能加载到项目中
解决方式:
下载ojdbc6.jar到本地或切换到ojdbc6.jar目录下( otter\lib
)执行下面命令
mvn install:install-file -DgroupId=com.oracle -DartifactId=ojdbc6 -Dversion=11.1.0.7.0 -Dpackaging=jar -Dfile=ojdbc6.jar -DgeneratePom=true
在本地仓库下会看到生成了相应的文件
# 3.2、otter-node启动时报错: nid is not set
问题原因:
启动时未指定nid
解决方式:
增加vm option -Dnid=1
# 3.3、otter不支持xa事务
问题原因:
otter目前对xa事务不支持,会导致挂起,复现步骤如下:
初始化记录
insert into testotter1.`t_user`(name,tenant_id) values("元月1",2);
1执行xa事务
xa start "mysql_xa_1"; update testotter1.t_user set name='元月2' where id=1; xa end "mysql_xa_1"; xa prepare "mysql_xa_1"; xa commit "mysql_xa_1"; #回滚 xa rollback "mysql_xa_1";
1
2
3
4
5
6
7
8可以看到channel挂起,报错日志如下
解决方法一:
参考github提交进行改造:支持MySQL5.7的XACommit/XARollback (opens new window)
对otter改造支持xa事务,需要考虑的东西比较多,不仅仅是otter的改造,还需要考虑其它组件是否支持xa事务,比如常用的在线变更大表工具gh-ost,它是不支持xa事务的
解决方法二: 跳过xa报错
在枚举类otter\shared\etl\src\main\java\com\alibaba\otter\shared\etl\model\EventType.java
下增加枚举
XACOMMIT("XA"),
XAROLLBACK("XR"),
2
3
这种方式只是跳过xa报错,如果xa事务回滚,会导致数据不一致