前言:最近接了一个新的需求,需要在伦敦机房做一个数据同步方案,同步到北京。因为之前搭建过公网之间的同步,一是延迟比较大,另一个是因为同步经常会断。临时解决方案就是搭建一个多源复制,隔断时间全量一次数据到北京机房,但是这个传输时间也是个头疼的问题
   
   一、Otter简介
   1.1  otter是什么?
  Ottter是由阿里开源的一个数据同步产品,它的最初的目的是为了解决跨国异地机房双A架构,两边可写的场景,开发时间从2011年7月份一直持续到现在,目前阿里巴巴B2B内部的本地/异地机房的同步需求基本全上了Otter。
  Otter基于数据库增量日志解析,支持mysql/oracle数据库进行同步,在最新的v4.2.13已经支持mysql5.7以及阿里云提供的RDS数据库(使用RDS童鞋的福音)
   1.2  otter工作原理
  
     - db : 数据源以及需要同步到的库
- Canal : 用户获取数据库增量日志
- manager : 配置同步规则设置数据源同步源等
- zookeeper : 协调node进行协调工作
- node : 负责任务处理处理接受到的部分同步工作
1.3  otter的特性
     - 使用纯JAVA开发,占时资源比较高
- 基于Canal获取数据库增量日志,Canal是阿里爸爸另外一个开源产品
- 使用manager(web管理)+node(工作节点),manager负责配置监控,node负责处理任务
- 基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作
- 使用aria2多线程传输技术,对网络依赖带宽依赖较低
1.4  otter能解决什么问题
  1、异构库同步
  Otter支持从Mysql同步到Mysql/oracle,我们可以把mysql同步到oracle
  2、单机房同步
  可以作为一主多从同步方案,对于单机房内网来说效率非常高,还可以做为数据库版本升级,数据表迁移,二级索引等这类功能
  3、异地机房同步
  异地机房同步可以说是Otter最大的亮点之一,可以解决国际化问题把数据从国内同步到国外来提供用户使用,在国内场景可以做到数据多机房容灾
  4、双向同步
  双向同步是在数据同步中最难搞的一种场景,Otter可以很好的应对这种场景,Otter有避免回环算法和数据一致性算法两种特性,保证双A机房模式下,数据保证最终一致性
  5、文件同步
  站点镜像,进行数据复制的同时,复制关联的图片,比如复制产品数据,同时复制产品图片
   
   二、Manager安装配置
   2.1  环境初始化
  我们把下载好的文件存放到/home/work/optar目录下:
  [root@localhost optar]# ls aria2-1.17.1.tar.gz         jdk-7u79-linux-x64.tar.gz       mysql-5.7.18.tar.gz dbproxy.tar.gz              jdk-8u65-linux-x64.tar.gz       node.deployer-4.2.13.tar.gz go1.8.1.linux-amd64.tar.gz  manager.deployer-4.2.13.tar.gz  zookeeper-3.4.6.tar.gz 
  荐使用OneinStack进行环境配置(默认会更新GCC,cmake等减少依赖出现的问题)
  oneinstack官网地址
  wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz tar xzf oneinstack-full.tar.gz cd oneinstack ./install.sh
  
   2.2  安装配置JDK
  JDK配置也可以通过上方oneinstack中选择web服务tomcat来配置
  首先我们应该要安装配置JDK,应为zookeeper和Otter-manager都依赖与java环境
  tar -zxvf jdk-7u79-linux-x64.tar.gz mv jdk1.7/ /usr/local/
  设定JAVA_HOME环境变量,编辑vim /etc/profile 加入如下内容
  export JAVA_HOME=/usr/local/jdk1.7 export JRE_HOME=/usr/local/jdk1.7/jre export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib: export PATH=$JAVA_HOME/bin:$PATH
  更改后,执行命令使其生效
  source /etc/profile
  执行 java -version 会看到如下版本信息证明已经安装成功
  [root@localhost local]# java -version java version "1.8.0_65" Java(TM) SE Runtime Environment (build 1.8.0_65-b17) Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)
   2.3  安装zookeeper
  安装配置zookeeper单机模式 
  cd /home/work tar zxvf zookeeper-3.4.5-cdh4.3.0.tar.gz mv zookeeper-3.4.5-cdh4.3.0 zookeeper cd /home/work/zookeeper/ mv conf/zoo_sample.cfg conf/zoo.cfg mkdir -p /home/work/data/zookeeper/{data,log} cd /home/work/data/zookeeper/data echo 1 > myid #将本节点id设定到data/myid文件中
  修改bin/zkEnv.sh脚本:
  将ZOO_LOG_DIR="."修改为
  ZOO_LOG_DIR="/home/work/data/zookeeper/log"
  将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}"`
  建立软连接到PATH:
  ln -s /home/work/zookeeper/bin/zkServer.sh /usr/local/bin/zk-server ln -s /home/work/zookeeper/bin/zkCli.sh /usr/local/bin/zk-cli 
  使用如下命令即可启动zookeeper:
  zk-server start #以下输出为运行成功 JMX enabled by default Using config: /tmp/zookeeper/bin/../conf/zoo.cfg Starting zookeeper ... STARTED
   2.4  安装manager
  准备工作做好了我们来一同安装manager
  mkdir /home/work/manager cd /home/work/optar tar zxvf manager.deployer-4.2.13.tar.gz  -C /home/work/manager
  安装manager的数据库
  wget https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql  mysql -uroot -p #输入mysql密码 source /home/work/manager/otter-manager-schema.sql
  修改vim conf/otter.properties 配置文件
  ## otter manager domain name #修改为正确访问ip(内网访问配置内网地址外网访问配置外网地址),生成URL使用 otter.domainName = 127.0.0.1     ## otter manager http port otter.port = 8080  ## otter manager database config ,修改为正确数据库信息 otter.database.driver.url = jdbc:mysql://127.0.0.1:3306/otter otter.database.driver.username = root otter.database.driver.password = hello  ## default zookeeper address,修改为正确的地址,手动选择一个地域就近的zookeeper集群列表,zookeeper默认端口 2181 otter.zookeeper.cluster.default = 127.0.0.1:2181
  启动manager
  ./bin/startup.sh
  PS:manager 编译时间大约需要1分钟
  检查日志:
  tailf logs/manager.log
  如下输出则为启动成功:
  2017-11-04 11:08:20.527 [] INFO  com.alibaba.otter.manager.deployer.OtterManagerLauncher - ## start the manager server. 2017-11-04 11:08:45.420 [] INFO  com.alibaba.otter.manager.deployer.JettyEmbedServer - ##Jetty Embed Server is startup! 2017-11-04 11:08:45.420 [] INFO  com.alibaba.otter.manager.deployer.OtterManagerLauncher - ## the manager server is running now ......
  我们在访问我们设置的可以访问的地址的8080端口,注意要关掉8080的防火墙否则一直会访问不通
  看到如下显示我们的manager就已经配置好了
  
   
   三、Node的安装配置
   3.1  安装配置aria2
  我们在介绍otter的特性里面有提及到aria2,它是一个文件通道来保证需要同步的数据通过极快的速度同步到需要同步的服务器上
  cd /home/work/ tar zxvf aria2-1.17.1.tar.gz mv aria2-1.17.1 aria2 cd aria2 ./configure make make install # 验证安装是否成功 aria2c -v # 会输出 aria2 version 1.17.1	 Copyright (C) 2006, 2013 Tatsuhiro Tsujikawa
   3.2  安装配置node
  接下来我们来配置node,node主要负责接受manage下发任务的处理
  mkdir /home/work/node tar xf node.deployer-4.2.13.tar.gz cd /home/work/node/ # nid配置node的ID多个node协同工作时不能重复 echo 1 > conf/nid # 修改配置文件 vim conf/otter.properties # 主要是确认连接manager地址是否正确(这里使用服务器内网地址进行配置) otter.manager.address = 10.144.159.182:1099
  配置完成之后我们不要着急启动node,因为启动了node要是manager没有配置是没法建立连接的,顺序是先配置好manager在开启node.
   3.3  关联manager,zookeeper和node
  最后我们来吧manager,zookeeper和node关联起来,我们先进入manager的管理界面,点击右边的登陆:
  
  使用默认用户名密码admin:admin登陆进去:
  
  找到机器管理的zookeeper配置点击进去:
  
  选择添加一个zookeeper:
  
  填好自己本地的zookeeper地址和端口保存:
  
  在选择机器管理的node管理点击进去:
  
  选择添加一个node:
  
  配置好node的一些参数
     - 机器名称:可以随意定义,方便自己记忆即可
- 机器ip:对应node节点将要部署的机器ip,如果有多ip时,可选择其中一个ip进行暴露. (此ip是整个集群通讯的入口,实际情况千万别使用127.0.0.1,否则多个机器的node节点会无法识别)
- 机器端口:对应node节点将要部署时启动的数据通讯端口,建议值:2088
- 下载端口:对应node节点将要部署时启动的数据下载端口,建议值:9090
- 外部ip :对应node节点将要部署的机器ip,存在的一个外部ip,允许通讯的时候走公网处理。
- zookeeper集群:为提升通讯效率,不同机房的机器可选择就近的zookeeper集群.
node这种设计,是为解决单机部署多实例而设计的,允许单机多node指定不同的端口:
  
  这个时候就可以启动我们的node了:
  cd /home/work/node/bin/ ./startup.sh
  注意:如果发现启动不了可以查看node的日志
  等带一段时间后刷新会发现状态已经变为了启动,这个时候就已经成功了:
  
  并且这个时候我们在zookeeper页面点击查看选项可以看到zookeeper已经在运行了:
  
  注意:如果发现一直都是未启动状态可以查阅/tmp/node/logs中的日志
   
 四、单向同步配置实践
   4.1  准备工作
  建一个测试库
  别注意:库名中千万不要带有符号比如"-"这种符号会直接引起同步开启不成功(需要验证)
  create database dqd_test;  CREATE TABLE `dqd_test` (   `id` int(11) NOT NULL AUTO_INCREMENT,   `name` varchar(255) NOT NULL,   `age` int(10) NOT NULL,   PRIMARY KEY (`id`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8
   4.2  配置manager
  首先我们需要配置数据连接,也就是数据源
  
  添加完之后一定要验证一下
  
  同样的操作添加另外一个数据源
  
   4.3  配置同步数据表
  配置好数据源后进行需要同步的数据表的配置
  
  
  
   4.4  配置同步规则
  在同步管理里面添加一个channel
  
  添加配置好一个channel使用的master库
  
  
  
  
  
  
  
  
   4.5  开启同步
  
  
  
  
   
   
  至此,简单的一个单向同步方案完。但是还有很多问题没有解决:比如otter的监控,数据一致性校验,otter同步比mysql跨公网同步的优势(在网络中断时,otter和原生的跨公网同步有什么区别),otter的限制等等。路漫漫兮其修远......
  参考博客:https://my.oschina.net/wenzhenxi/blog?catalog=3663174&temp=1509356134467
     为了方便大家交流,本人开通了微信公众号(关注看更多精彩)和QQ群,QQ群1(291519319)和QQ群2(659336691)。喜欢技术的一起来交流吧
  
  