Otter架构
otter 官网介绍 名称:otter [‘ɒtə(r)]
译意: 水獭,数据搬运工
语言: 纯java开发
定位: 基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库. 一个分布式数据库同步系统。
更多介绍查看Github:https://github.com/alibaba/otter
架构及工作原理
Canal, 负责监听Bin-log,类似MYSQL的从库,本质上实现了MYSQL的协议,伪装成从库读取bin-log日志。
Manager 管理Otter的配置的后台, 比如管理数据库表之间的映射关系,会把配置推送到 Node。
Node 实现同步功能的核心服务,同时把同步结果实时反馈给Manager。
Zookeepr, 分布式调度,监控节点状态,这个不用解释,分布式系统都会用到。
otter 需要以上四个服务才能工作,搭建比较麻烦,稍后详细说明。
本次目标 假设要把tb_user表的数据同步到tb_user2, 用otter该如何实现?tb_user 表结构如下。
1
2
3
4
5
6
7
8
9
10
11
12
create table tb_user
(
id int( 11) unsigned auto_increment comment 'ID'
primary key,
username varchar( 100) default '' not null comment '用户名' ,
age int default 0 not null comment '年龄' ,
email varchar( 64) default '' not null comment '邮箱' ,
created_time datetime default CURRENT_TIMESTAMP not null comment '创建时间' ,
modified_time datetime default CURRENT_TIMESTAMP not null on update CURRENT_TIMESTAMP comment '更新时间' ,
is_deleted tinyint( 2) default 0 not null comment '是否删除'
)
comment '用户信息表' charset = utf8mb4;
tb_user2 表结构和tb_user相同。
1
create table tb_user2 like tb_user;
接下来搭建同步所需的各个服务。
安装 zookeeper 打开ZK官网,下载最新的包,地址:https://zookeeper.apache.org/releases.html#download
执行下面命令解压文件
1
tar -zxvf apache-zookeeper-3.8.1-bin.tar.gz
解压后得到如下目录
进入到conf配置目录修改配置文件,拷贝 zoo_sample.cfg 文件重名名为 zoo.cfg
1
2
cd conf
cp zoo_sample.cfg zoo.cfg zoo.cfg
vi 修改配置
主要看下面两个配置,zk 的默认端口是 2181,如果没有被占用,可以不改。
1
2
3
4
5
6
7
# example sakes.
dataDir = /tmp/zookeeper # zk数据存储目录
# the port at which the clients will connect
clientPort = 2181 # 端口默认2181
# the maximum number of client connections.
# increase this if you need to handle more clients
#maxClientCnxns=60
启动zk
连接zk
看到如下所示说明zk安装成功。
安装 Canal 下载最新文档的 Canal,下载地址:https://github.com/alibaba/canal/releases
解压文件
1
tar -zxvf canal.deployer-1.1.6.tar.gz
得到如下目录
修改配置,参考官网文档:https://github.com/alibaba/canal/wiki/QuickStart
对于自建 MySQL , 需要先开启 Binlog 写入功能,配置 binlog-format 为 ROW 模式,my.cnf 中配置如下
1
2
3
4
[mysqld]
log-bin=mysql-bin # 开启 binlog
binlog-format=ROW # 选择 ROW 模式
server_id=1 # 配置 MySQL replaction 需要定义,不要和 canal 的 slaveId 重复
注意:针对阿里云 RDS for MySQL , 默认打开了 binlog , 并且账号默认具有 binlog dump 权限 , 不需要任何权限或者 binlog 设置,可以直接跳过这一步
授权 canal 链接 MySQL 账号具有作为 MySQL slave 的权限, 如果已有账户可直接 grantCREATE USER canal IDENTIFIED BY ‘canal’; GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON . TO ‘canal’@’%’; – GRANT ALL PRIVILEGES ON . TO ‘canal’@’%’ ; FLUSH PRIVILEGES;
1
vi conf/example/instance.properties
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
## mysql serverId
canal.instance.mysql.slaveId = 1234
#position info,需要改成自己的数据库信息
canal.instance.master.address = 127.0.0.1:3306
canal.instance.master.journal.name =
canal.instance.master.position =
canal.instance.master.timestamp =
#canal.instance.standby.address =
#canal.instance.standby.journal.name =
#canal.instance.standby.position =
#canal.instance.standby.timestamp =
#username/password,需要改成自己的数据库信息
canal.instance.dbUsername = canal
canal.instance.dbPassword = canal
canal.instance.defaultDatabaseName =
canal.instance.connectionCharset = UTF-8
#table regex
canal.instance.filter.regex = .\*\\\\ ..\*
启动
查看日志
1
vi logs/canal/canal.log</pre>
1
2
3
2013-02-05 22:45:27.967 [ main] INFO com.alibaba.otter.canal.deployer.CanalLauncher - ## start the canal server.
2013-02-05 22:45:28.113 [ main] INFO com.alibaba.otter.canal.deployer.CanalController - ## start the canal server[10.1.29.120:11111]
2013-02-05 22:45:28.210 [ main] INFO com.alibaba.otter.canal.deployer.CanalLauncher - ## the canal server is running now ......
安装 Manager
先下载安装包,下载地址:https://github.com/alibaba/otter/releases
解压
1
tar -zxvf manager.deployer-4.2.18.tar.gz
得到下面目录
manager 需要数据库,下载官方SQL脚本,并导入进行数据库表创建和数据初始化
1
wget https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql
1
source otter-manager-schema.sql
修改配置,编辑conf目录下的otter.properties 配置文件,修改如下所示
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
## otter manager domain name #修改为正确访问ip,生成URL使用
otter.domainName = 127.0.0.1
## otter manager http port
otter.port = 8080
## jetty web config xml
otter.jetty = jetty.xml
## otter manager database config ,修改为正确数据库信息
otter.database.driver.class.name = com.mysql.jdbc.Driver
otter.database.driver.url = jdbc:mysql://127.0.01:3306/ottermanager
otter.database.driver.username = root
otter.database.driver.password = hello
## otter communication port
otter.communication.manager.port = 1099
## otter communication pool size
otter.communication.pool.size = 10
## default zookeeper address,修改为正确的地址,手动选择一个地域就近的zookeeper集群列表
otter.zookeeper.cluster.default = 127.0.0.1:2181
## default zookeeper session timeout = 90s
otter.zookeeper.sessionTimeout = 90000
## otter arbitrate connect manager config
otter.manager.address = ${ otter .domainName } :${ otter .communication.manager.port }
启动
查看日志
1
2
2013-08-14 13:19:45.911 [] WARN com.alibaba.otter.manager.deployer.JettyEmbedServer - ##Jetty Embed Server is startup!
2013-08-14 13:19:45.911 [] WARN com.alibaba.otter.manager.deployer.OtterManagerLauncher - ## the manager server is running now ......
验证
访问: http://127.0.0.1:8080/,出现otter的页面,即代表启动成功
输入账号密码,默认amdin/admin
注意,因为我的8080端口被占用,这里我改成8082,你可以根据你的情况修改端口,我截图中有两个Channel,这是我测试创建的,刚安装完是什么空的,什么都没有。
一切 OK !
把前面安装的ZK服务添加到manger,后面安装Node等需要用到ZK。
点击manager界面的机器管理>zookeeper管理。
然后添加,输入ZK集群的信息,集群名称随意,集群地址填ZK的IP和端口,中间用冒号分隔,形如“ip:端口”的新式,多个分号隔开。
点击保存,OK。
安装 Node 下载官方安装包,地址:https://github.com/alibaba/otter/releases 和上面的manager同一个地址,下载如下文件。
解压缩,得到如下目录
这时需要回到manger添加一个Node, 得到Node的序号,因为启动Node服务时需要这个序号。
在manger界面选择机器管理>Node管理
在Node管理页面点击添加,输入机器名称、IP和端口,以及选择一个ZK集群,这个几个选项是必填的,机器名称随意,机器IP输入要启动Node服务的IP,端口就是Node服务的端口,默认2088。
保存后得到下面结果,这里有个关键信息有两个,一个是状态,刚添加完为启动Node是状态是未启动,还有一个是序号,序号是点击保存是系统生成的,在后面配置文件中会用到,我这里是1
修改Node的配置
首先在conf目录下创建一个nid的文件,值为前面生成的序号,如下所示 (将环境准备中添加机器后获取到的序号,保存到conf目录下的nid文件,比如我添加的机器对应序号为1)
然后修改 otter.properties配置
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
# otter node root dir
otter.nodeHome = ${ user .dir } /../node
## 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 = 90s
otter.zookeeper.sessionTimeout = 90000
## otter communication pool size
otter.communication.pool.size = 10
## otter arbitrate & node connect manager config , 修改为正确的manager服务地址
otter.manager.address = 127.0.0.1:1099
启动
查看日志
1
2013-08-14 15:42:16.886 [ main] INFO com.alibaba.otter.node.deployer.OtterLauncher - INFO ## the otter server is running now ......
验证
再次访问manger 页面, http://127.0.0.1:8080/node_list.htm ,查看对应的节点状态,如果变为了已启动,代表已经正常启动。(ps,如果是未启动,会是一个红色高亮)
现在 otter 所需要的各个服务已准备好,接下来配置数据同步。