一、介绍
https://github.com/alibaba/otter
名称:otter ['ɒtə(r)]
译意: 水獭,数据搬运工
语言: 纯java开发
定位: 基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库. 一个分布式数据库同步系统
https://github.com/alibaba/canal
名称:canal [kə'næl]
译意: 水道/管道/沟渠
语言: 纯java开发
定位: 基于数据库增量日志解析,提供增量数据订阅&消费,目前主要支持了mysql
关键词: mysql binlog parser / real-time / queue&topic
工作原理
原理描述:
1. 基于Canal开源产品,获取数据库增量日志数据。 什么是Canal, 请点击
2. 典型管理系统架构,manager(web管理)+node(工作节点)
a. manager运行时推送同步配置到node节点
b. node节点将同步状态反馈到manager上
3. 基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作.
canal 支持mysql系列的5.1 ~ 5.6版本,目前maridb经测试暂不支持. (全面支持ROW/STATEMENT/MIXED几种binlog格式的解析)
mysql做为master,otter只支持ROW模式的数据同步,其他两种模式不支持. (只有ROW模式可保证数据的最终一致性)
二、环境准备
otter的环境需要mysql ,jdk, zookeeper , node , manager
软件名称 | 版本 | 安装服务器 | 端口 | 安装目录 |
---|---|---|---|---|
zookeeper | 3.4.5 | 172.17.210.100 | 2181 | /usr/local/yunsea/zookeeper-3.4.5/ |
manager | 4.2.10 | 172.17.210.98 | 18888 | /usr/local/belle/otter/manager |
node | 4.2.10 | 172.17.210.98\172.17.210.99 | /usr/local/belle/otter/node |
1.1 otter数据库初始化
otter manager依赖于mysql进行配置信息的存储,所以需要预先安装mysql,并初始化otter manager所需的系统库和表。
source otter-manager-schema.sql
执行show databases可以看到脚本创建了一个名字叫otter的数据库
1.2 zookeeper安装
安装一个zookeeper到172.17.210.100机子(整个otter架构依赖了zookeeper进行多节点调度,所以需要预先安装zookeeper),也可以使用其它已经安装好的zookeeper,可以共用,这里不做安装说明。
1.3 manager安装
创建安装目录 /usr/local/belle/otter/manager
tar -zxvf manager.deployer-4.2.10.tar.gz /usr/local/belle/otter/manager
修改mamager的配置文件信息(/conf/otter.properties)
otter.domainName = 172.17.210.98
otter.port = 18888
## otter manager 所依赖的数据库配置 ,修改为正确数据库信息
otter.database.driver.class.name = com.mysql.jdbc.Driver
otter.database.driver.url = jdbc:mysql://172.17.210.98:3306/otter
otter.database.driver.username = root #用户名和密码请DBA配合授权
otter.database.driver.password = 123456
## otter communication port(manager和node通讯端口,保留默认1099)
otter.communication.manager.port = 1099
## otter communication pool size
otter.communication.pool.size = 10
## manager依赖的zookeeper 地址
otter.zookeeper.cluster.default = 172.17.210.100:2181
## default zookeeper sesstion timeout = 90s
otter.zookeeper.sessionTimeout = 90000
## otter arbitrate connect manager config
otter.manager.address = ${otter.domainName}:${otter.communication.manager.port}
准备启动
进入安装目录/bin/下,输入:sh startup.sh启动manager web网站
1.4 NODE安装
生成nid
完成manager安装后,需要在manager页面为node定义配置信息,并生一个唯一id.
- 首先访问manager web页面”机器管理”菜单,选择“zookeeper管理”子菜单,点击页面“添加”按钮以注册一个zookeeper。
-
从”node管理”菜单中选择添加node按钮,往manager注册一个node节点信息。
几点说明:
- 机器名称:可以随意定义,方便自己记忆即可
- 机器ip:对应node节点将要部署的机器ip,如果有多ip时,可选择其中一个ip进行暴露. (此ip是整个集群通讯的入口,实际情况千万别使用127.0.0.1,否则多个机器的node节点会无法识别)
- 机器端口:对应node节点将要部署时启动的数据通讯端口,建议值:2088
- 下载端口:对应node节点将要部署时启动的数据下载端口,建议值:9090
- 外部ip :对应node节点将要部署的机器ip,存在的一个外部ip,允许通讯的时候走公网处理。
- zookeeper集群:为提升通讯效率,不同机房的机器可选择就近的zookeeper集群.
- 机器添加完成后,跳转到机器列表页面,获取对应的机器序号nid
- 通过这两部操作,获取到了node节点对应的唯一标示,称之为node id,简称:nid. 记录该nid,后续启动nid时会使用
3.node启动步骤
创建安装目录 /usr/local/belle/otter/node
解压到安装目录 tar -xzvf node.deployer-4.2.10.tar -C /usr/local/belle/otter/node
修改配置
nid配置 (将环境准备中添加机器后获取到的序号,保存到conf目录下的nid文件,比如我添加的机器对应序号为1)
echo 1 > conf/nid
otter.properties配置修改
打开文件/conf/otter.properties
vi /conf/otter.properties,修改如下内容:
##修改为正确的manager服务地址
otter.manager.address = 172.17.210.98:1099
启动
进入目录 /usr/local/belle/otter/node/bin/
sh startup.sh
按照此方法安装NODE2
三、配置数据同步
数据同步分2种,1、A库和B库同时上线 2、A库已经存在很久,B库才需要同步。第一种情况比较简单,第二种需要把A库需要同步的表导出数据导入到B库,并且记录A库同步位置点。
show master status \G;
1、数据准备
在172.17.210.98\172.17.210.99数据库中分别创建一个测试表
CREATE TABLE `otter_sync` (
`id` varchar(32) NOT NULL,
`name` varchar(50) DEFAULT NULL,
`desc` varchar(200) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
2、创建canal
3、 创建数据源(添加表映射用到)
4、添加源库的表和目的库的表
5、新建同步通道channel
同步一致性选择基于当前日志变更,同步模式选择“行记录模式”,不开启数据一致性。
6、新建一个pipeline
7、 新建表映射
四、otter目前存在的同步限制
- 暂不支持无主键表同步. (同步的表必须要有主键,无主键表update会是一个全表扫描,效率比较差)
- 支持部分ddl同步 (支持create table / drop table / alter table / truncate table / rename table / create index / drop index,其他类型的暂不支持,比如grant,create user,trigger等等),同时ddl语句不支持幂等性操作,所以出现重复同步时,会导致同步挂起,可通过配置高级参数:跳过ddl异常,来解决这 个问题.
- 不支持带外键的记录同步. (数据载入算法会打算事务,进行并行处理,会导致外键约束无法满足)
- 数据库上trigger配置慎重. (比如源库,有一张A表配置了trigger,将A表上的变化记录到B表中,而B表也需要同步。如果目标库也有这trigger,在同步时会插入一次A 表,2次B表,因为A表的同步插入也会触发trigger插入一次B表,所以有2次B表同步.)
五、参考
安装配置参与官网
https://github.com/alibaba/otter/wiki/Manager_Quickstart
https://github.com/alibaba/otter/wiki/Node_Quickstart
Otter高可用性
https://github.com/alibaba/otter/wiki/Otter%E9%AB%98%E5%8F%AF%E7%94%A8%E6%80%A7
FAQ
https://github.com/alibaba/otter/wiki/Faq