一、Otter目前支持了什么
1. 单向同步, mysql/oracle互相同步
2. 双向同步,无冲突变更
3. 文件同步,本地/aranda文件
4. 双A同步,冲突检测&冲突补救
5. 数据迁移,中间表/行记录同步
实际测试中,otter的同步速度相比于mysql的复制,约有5倍左右的性能提升,这取决于其同步算法的实现. 抛弃了强一致性,得到了性能提升。
otter是一款基于Java且免费、开源基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库的解决方案。
二、官方文档
https://github.com/alibaba/otter/wiki/Manager_Quickstart
https://github.com/alibaba/otter/wiki/Node_Quickstart
演示视频: http://video.tudou.com/v/XMTc4NjU1MjM4NA==.html
三、原理描述
基于Canal开源产品,获取数据库增量日志数据。
典型管理系统架构,manager(web管理)+node(工作节点)
- manager运行时推送同步配置到node节点
- node节点将同步状态反馈到manager上
基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作.
工作流程:otter基于zookeeper解决分布式状态调度,由manager(web管理)和node(工作节点)组成。manager运行时推送同步配置到node节点上,node节点将同步状态反馈到manger上。
四、安装环境
主机1 : 192.168.71.146(安装mysql)
主机2:192.168.71.246(部署otter环境)
从机:192.168.69.136
系统 : CentOS release 6.10 (Final)
主机 Mysql : 10.1.18-MariaDB
从机 Mysql : 5.6
Zookeeper: 3.4.13
otter: 4.2.17
Canal : 1.1.3-SNAPSHOT
JDK:1.8
五、安装mysql并运行初始化脚本
- 主机1,从机 都安装mysql(根据需求统一版本,开启mysql binlog日志)
在mysql配置文件/etc/my.cnf 中添加配置
[mysqld] log-bin=mysql-bin binlog-format=ROW character_set_server=utf8 # 这里manager端为1, node端为大于1的数字,每个node不重复 数值随意配置,但要保证不重复 server-id=1 # 允许外部访问 # bind-address = 0.0.0.0
如果源库已开启binlog,通过mysql客户端命令show master status查看
- 在主机1 mysql中初始化otter manager系统表
# 初始化manager系统表 可直接下载在工具中直接执行 wget https://github.com/alibaba/otter/blob/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql mysql -uroot -proot < otter-manager-schema.sql # show databases; # +---------------------+ # | Database | # +---------------------+ # | information_schema | # | mysql | # | otter | # | performance_schema | # +---------------------+ # 4 rows in set (0.01 sec)
3. 分别在主机1,从机中执行retl数据库初始化命令
wget https://github.com/alibaba/otter/blob/master/node/deployer/src/main/resources/sql/otter-system-ddl-mysql.sql
mysql -uroot -p < otter-system-ddl-mysql.sql
# show databases;
# +--------------------+
# | Database |
# +--------------------+
# | information_schema |
# | mysql |
# | otter |
# | performance_schema |
# | retl |
# +--------------------+
# 5 rows in set (0.00 sec)
五、下载安装 (安装在192.168.71.246机器)
下载页面:https://github.com/alibaba/otter/releases/
下载manager:wget https://github.com/alibaba/otter/releases/download/v4.2.17/manager.deployer-4.2.17.tar.gz
创建manager目录 : mkdir /usr/local/otter/manager
tar zxvf manager.deployer-4.2.17.tar.gz -C /usr/local/otter/manager
下载node: wget https://github.com/alibaba/otter/releases/download/v4.2.17/node.deployer-4.2.17.tar.gz
创建node目录: mkdir /usr/local/otter/node
tar zxvf node.deployer-4.2.14.tar.gz -C /usr/local/otter/node
六、修改配置文件运行
(1) Manager
1) otter.properties配置修改 vi /usr/local/otter/manager/conf/otter.properties
##修改为正确访问ip,生成URL使用,node的配置需要用到
otter.domainName= 192.168.71.246
##manage页面的访问端口
otter.port =8080
##修改为正确数据库信息
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 = root
##为node连接manager的端口, node的配置需要用到
otter.communication.manager.port= 1099
##配置zookeeper集群机器
otter.zookeeper.cluster.default= 192.168.71.246 :2181
其它使用默认配置即可
2) Manager启动
Linux : sh ~/manager/bin/startup.sh
Windows:startup.bat
查看日志: vi ~/manager/logs/manager.log
启动成功后浏览器访问http://192.168.71.246 :8080,出现otter的页面
访问:http://192.168.71.246 :8080/login.htm,初始密码为:admin/admin,即可完成登录. 目前:匿名用户只有只读查看的权限,登录为管理员才可以有操作权限
3) 关闭manager(此处暂不关闭)
sh ~/manager/bin/stop.sh
(2)Node (在主机2和从机上同时配置)
node会受ottermanager进行管理,所以需要预先安装otter manager,完成manager安装后,需要在manager页面为node 定义配置信息,并生一个唯一id。
1) 添加zookeeper
首先确保你的zookeeper已启动成功。
otter依赖zookeeper,访问manager页面的机器管理页面,选择菜单进入“机器管理→zookeeper管理”页面:
点击添加进入“添加Zookeeper集群”页面
2) 添加node
Zookeeper添加成功后,进入“机器管理→Node管理”页面:
点击添加进入添加机器页面
机器名称:可以随意定义,方便自己记忆即可
机器ip:对应node节点将要部署的机器ip,如果有多ip时,可选择其中一个ip进行暴露. (此ip是整个集群通讯的入口,实际情况 千万别使用127.0.0.1,否则多个机器的node节点会无法识别)
外部ip :对应node节点将要部署的机器ip,存在的一个外部ip,允许通讯的时候走公网处理。
zookeeper集群:为提升通讯效率,不同机房的机器可选择就近的zookeeper集群.
node这种设计,是为解决单机部署多实例而设计的,允许单机多node指定不同的端口
3) 配置nid(状态为未启动本文档是启动后截图)
机器添加完成后,跳转到机器列表页面,获取对应的机器序号nid:
通过这几步操作,获取到了node节点对应的唯一标示,称之为node id,简称nid,比如我添加的机器对应序号为1
执行echo 1 >/usr/local/otter/node/conf/nid , 保存到conf目录下的nid文件;
4) otter.properties配置修改 vi /usr/local/otter/node/conf/otter.properties
# node的安装目录
otter.nodeHome = ${user.dir}/node
#manager的服务地址
otter.manager.address = 192.168.71.246:1099
5) 启动
Linux:sh /usr/local/otter/node/bin/startup.sh
打开日志: vi /usr/local/otter/node/logs/node/node.log,出现以下的错误,表示manager页面的ip配置不正确,此时修改ip为对应的host ip后,再次启动即可。
访问: http://192.168.71.246:8080/,查看“机器管理-Node管理”页面,对应的节点状态,如果变为了已启动,代表已经正常启动。
#关闭:sh /usr/local/otter/node/bin/stop.sh(暂不执行)
七、配置同步任务
添加canal
Otter使用canal开源产品获取数据库增量日志数据,可以把cannal看作是源库的一个伪slave。
原理: canal模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议,mysql master收到dump请求,开始推送binarylog给slave(也就是canal), canal解析binary log对象(原始为byte流)。
Canal官方文档:https://github.com/alibaba/canal/wiki
1) 在Otter Manager“配置管理-canal配置”页面点击添加:
2) 进入添加cannal页面:在数据库中执行
查看当前正在写入的binlog文件
show master status\G
获取当前时间戳
SELECT unix_timestamp(now());
Node集成了cannal,所以不需要单独下载cannal;
Cannal 存储机制分为memory和file,也可以在运行模式选项选择作为独立服务运行;
勾选其他参数设置,可以设置cannal的服务端口;
必须配置位点信息,否则如果你的数据库已有存量数据,第一次运行时需要等待比较长的时间,可以通过连接源库客户端 执行sql获取
其他配置默认
双向同步需要配置两个canal信息 用于存储从表数据配置方法同上 替换从表链接及账号密码,binlog日志同步点
2. 添加数据源
“配置管理-数据表配置”进入数据表管理页面:
源库和目标库的schema需要一致,不然无法执行ddl语句
3. 添加数据表配置
“配置管理-数据表配置”进入数据表管理页面:
点击添加,进入添加数据表页面:
table示例说明
单表配置:alibaba.product
分表配置:alibaba[1-64].product , alibaba.product[01-32]
正则配置:(.*).(.*)
schema name和table name都设置成.*表示全库同步
4. 添加一个channel
如下图,点击添加按钮进入添加channel页面,输入Channel Name后保存,则成功添加一个channel;
5. 配置一个pipeline
添加channel成功后,点击Channel名字,进入Pipeline管理页面,添加一个pipeline;
双向同步需要配置两个pipeline用于不同同步方向的指定 不能配置两个channal
进入添加pipeline页面
如上图填好所需信息,勾选高级设置,可以选是否过滤ddl同步等选项,点击保存,成功后会返回Pipeline管理页面。
从节点必须取消ddl语句跳过ddl语句
同时指定主站点和从站点
6. 添加映射关系
添加pipeline成功后,点击Pipeline名字选取源数据表和目标数据表 注意方向
进入映射关系列表页面,点击添加
进入添加映射关系页面
点击保存返回映射关系列表页面,如果源数据表是只同步一个表可以点击下一步,选择需要同步的字段映射关系;
7. 启用同步
以上配置,一个简单的同步任务就完成了,返回Channel管理页面
点击“启用”,运行状态就变为“运行”;
现在可以新增一个表,插入记录,查看数据是否同步过去了。
点击Channel名字,进入Pineline管理页面,可点击“监控”查看同步状态
异常日志查询
主从同步的方式,从库ddl语句无法同步到主库。
关于双A同步(数据的一致性问题)
双A同步相比于双向同步,主要区别是双A机房会在两地修改同一条记录,而双向同步只是两地的数据做互相同步,两地修改的数据内容无交集。
所以双A同步需要额外处理数据同步一致性问题. 同步一致性算法:Otter数据一致性 ,目前开源版本主要是提供了单向回环补救的一致性方案。
双A同步相比于双向同步,整个配置主要是一些参数上有变化,具体步骤:
- channel配置中的 “是否开启数据一致性” 设置为: 是
- channel中的两个pipeline配置中需要将基中一个设置为主站点,并且在高级设置中,将其中一个设置为false,另一个设置为 true
- 每个pipeline各自配置canal,定义映射关系
参考文档:https://blog.csdn.net/wudufeng/article/details/78688240