数据同步——otter
参考文献:Otter-入门篇1(阿里开源项目Otter介绍)
一、背景
本人是一名应届毕业生,,还在努力挖坑。最近两个月被外派到其他公司做一个升级系统,做到现在一个多月。学到的东西很多,想总结的东西也很多,可是。。。时间是让人猝不及防的东西。好吧,现在先来总结otter数据同步。升级系统需要做到内网数据库(主)和外网的n个数据库(从)进行数据同步,考虑的方案有:
- 直接在项目配置n个从数据库加1个主库,但是码代码太麻烦了,有工具多好使。
- 用percona-tookit
下载链接:https://www.percona.com/downl...,
github demo:https://github.com/mrjgreen/d...(表示还没看。。) - 用otter(分布式数据库同步系统),纯java编写,支持windows,linux。阿里开源项目,数据同步的解决方案。链接:http://pan.baidu.com/s/1eR5ccQe
密码:r5cp,github:https://github.com/alibaba/otter
二、Otter是什么?
Ottter是由阿里巴巴开源的一个数据同步产品,它的最初的目的是为了解决跨国异地机房双A架构,两边可写的场景,开发时间从2011年7月份一直持续到现在,目前阿里巴巴B2B内部的本地/异地机房的同步需求基本全上了Otter。Otter基于数据库增量日志解析,支持mysql/oracle数据库进行同步,在最新的v4.2.13已经支持mysql5.7以及阿里云提供的RDS数据库(使用RDS童鞋的福音)。
Otter工作原理:
- 基于Canal开源产品,获取数据库增量日志数据。 什么是Canal,
请点击https://github.com/alibaba/canal - 典型管理系统架构,manager(web管理)+node(工作节点)
manager运行时推送同步配置到node节点
node节点将同步状态反馈到manager上 - 基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作.(otter node依赖于zookeeper进行分布式调度,需要安装一个zookeeper节点或者集群)
- db : 数据源以及需要同步到的库
- Canal : 用户获取数据库增量日志,目前主要支持mysql
- manager : 配置同步规则设置数据源同步源等
- zookeeper : 协调node进行协调工作
- node : 负责任务处理处理接受到的部分同步工作
三、Canel是什么?
阿里的开源项目。mysql数据库binlog的增量订阅&消费组件基于日志增量订阅&消费支持的业务:数据库镜像、数据库实时备份、级索引 (卖家和买家各自分库索引)、search build、业务cache刷新、价格变化等重要业务消息。github:https://github.com/alibaba/canal
首先来看mysql主备复制的原理:
再看canel的原理:
原理相对比较简单: 模拟mysql slave的交互协议,伪装自己为mysql slave,向mysql master发送dump协议 mysql master收到dump请求,开始推送binary log给slave(也就是canal) canal解析binary log对象(原始为byte流).
四、otter环境搭建(所需文件已在上方下载链接)
先看看安装后的目录
- 安装好mysql
- 安装好jdk,配置环境变量,zookeeper和Otter-manager都需要依赖java
安装配置zookeeper,这里配置的是单机模式,它还有集群模式,可以看
http://blog.csdn.net/mark_lq/...,http://blog.csdn.net/kongxx/a...修改bin/zkEnv.sh脚本: 将ZOO_LOG_DIR="."修改为ZOO_LOG_DIR="/tmp/zookeeper/data" 将ZOO_LOG4J_PROP=”INFO,CONSOLE”修改为ZOO_LOG4J_PROP="INFO,ROLLINGFILE" 修改bin/zkServer.sh脚本: 将ZOOBIN="${BASH_SOURCE-$0}"修改为ZOOBIN=`readlink -f "${BASH_SOURCE-$0}"` 修改bin/zkCli.sh脚本: 将ZOOBIN="${BASH_SOURCE-$0}"修改为ZOOBIN=`readlink -f "${BASH_SOURCE-$0}"` 启动:到bin目录,./zkServer.sh start
- 安装配置manager
先安装manager
再安装ottermanager的数据库
这里可能会有权限问题,grant一下权限就ok
修改配置文件otter.properties
启动:到bin目录 ./startup.sh
日志可以去/tmp/manager/logs/manager.log查看
启动成功后,打开http://192.168.0.212:8080/,即可访问到 - 安装配置aria2,保证需要同步的数据通过极快的速度同步到需要同步的服务器上。
安装,windows上安装需要配置环境变量。这个也是个神器哦 - 安装配置node节点,node主要负责接受manage下发任务的处理
注意:这里配置完后,需到manager管理页面进行配置node信息,然后再来开启node建立连接!
五、otter配置单向同步
概念步骤:先开启mysql——>开启zookeeper——>开启manager——>配置node——>启动node——>后续
机器/数据库实例(mysql5.6):192.168.0.212(master),192.168.5.223(slave)
这里需要改一下配置文件,my.inf(linux,在etc/my.inf),my.ini(windows)
log_bin = mysql-bin #打开日志 binlog_format = ROW #设置row模式的日志格式 server-id = 2 #id不能重复
我在212上安装了mysql,zookeeper,manager,aria2,node。场景是这样的,212作为管理后台的服务器,在上面的数据库有otter_manager的数据库,和管理后台的数据库,223作为接口服务器,数据库有升级接口数据库。此时管理后台每加数据需要同步到接口这来。
打开manager的web页面,登录在右上角,默认用户名密码都是admin
- 添加zookeeper
- 添加node
看序号,序号为2,则去conf下执行echo 2 > nid,对应且唯一。还有修改配置文件otter.properties,otter.manager.address = 192.168.0.212:1099,确认manager的地址。好了,接下来可以去启动node,若一直都是未启动状态可以查阅/tmp/node/logs中的日志 - 给两台数据库实例建两个结构格式一样的数据库
- 数据源配置——添加数据源
从库
主库
添加完后 - 数据表配置——添加数据表
需要同步到的表
需要同步的表
添加后 - 配置同步规则——canel配置
- 同步管理——添加channel——添加Pipeline——源和目标表的配置
保存后点击channel1进去添加Pipeline
添加后点击Pipeline进去配置源和目标表 - 启用channel
- 测试单向同步完美成功。如若失败,请去监控管理——日志记录查看日志。
六、otter配置单向同步
概念步骤:先开启mysql——>开启zookeeper——>开启manager——>配置node——>启动node——>后续
机器:192.168.0.212(master),192.168.5.223(slave)
说明:我在212上安装了mysql,zookeeper,manager,aria2,node,在223上安装了aria2,node,双向同步,需要配置n个node,因为manager是下派任务给node去执行的。场景是这样的,212作为管理后台的服务器,在上面的数据库有otter_manager的数据库,和管理后台的数据库,223作为接口服务器,数据库有升级接口数据库。此时管理后台每加数据需要同步到接口这来。
- 添加zookeeper,同上
- 添加两个node,对应两台数据库
分别去node安装路径的conf下执行echo 1 > nid,echo 2 > nid,对应且唯一。并且otter.properties的otter.manager.address = 192.168.0.212:1099要对应安装manager的地址。接着启动 - 给两台数据库实例建两个结构格式一样的数据库,ottmanage(主库),ottupdate(从库)
- 数据源配置配置——添加数据源
- 数据表配置——添加数据表
- 配置同步规则——canel配置(两个,每一个对应一个数据库信息,从配置的数据库中,拉取bin-log信息)
- 同步管理——添加channel
- 点击添加好的channel,添加Pipeline
注意:第二个这里要点击高级设置,取消ddl支持,因为双向同步中,一个channel只允许有一个ddl,即只允许有一个主站。 - 点击Pipeline1,添加主库要往从库同步的数据源映射关系配置
- 点击Pipeline2,添加从库要往主库同步的数据源映射关系配置
- 由于是双向同步,所以还需要点击使用文档-》数据库初始化页面,在双机房的数据库同时执行初始化SQL。
- 启动,和可能遇到的问题,一般日志记录那只会记录异常记录。