一、Otter简介

1.1  otter是什么?

otter

译意: 水獭,数据搬运工

语言: 纯java开发

定位: 基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库. 一个分布式数据库同步系统。Ottter是由阿里开源的一个数据同步产品,它的最初的目的是为了解决跨国异地机房双A架构,两边可写的场景,开发时间从2011年7月份一直持续到现在,目前阿里巴巴B2B内部的本地/异地机房的同步需求基本全上了Otter。Otter基于数据库增量日志解析,支持mysql/oracle数据库进行同步,也有全量同步的,如果我们有全表更新或者想要历史数据的需求怎么办?这就涉及到otter的ziyou门功能。

1.2  otter工作原理

原理描述:

1. 基于Canal开源产品,获取数据库增量日志数据。 什么是Canal, 请点击

2. 典型管理系统架构,manager(web管理)+node(工作节点)

a. manager运行时推送同步配置到node节点

b. node节点将同步状态反馈到manager上

3. 基于zookeeper,解决分布式状态调度的,允许多node节点之间协同工作.

4.db : 数据源以及需要同步到的库

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  环境初始化

官方地址:https://github.com/alibaba/otter

我们把下载好的文件存放到/home/work/optar目录下:

  1. [root@localhost optar]# ls
  2. aria2-1.17.1.tar.gz jdk-7u79-linux-x64.tar.gz mysql-5.7.18.tar.gz
  3. dbproxy.tar.gz jdk-8u65-linux-x64.tar.gz node.deployer-4.2.13.tar.gz
  4. go1.8.1.linux-amd64.tar.gz manager.deployer-4.2.13.tar.gz zookeeper-3.4.6.tar.gz

荐使用OneinStack进行环境配置(默认会更新GCC,cmake等减少依赖出现的问题)

oneinstack官网地址

  1. wget http://mirrors.linuxeye.com/oneinstack-full.tar.gz
  2. tar xzf oneinstack-full.tar.gz
  3. cd oneinstack
  4. ./install.sh

2.2  安装配置JDK

JDK配置也可以通过上方oneinstack中选择web服务tomcat来配置

首先我们应该要安装配置JDK,应为zookeeper和Otter-manager都依赖与java环境

  1. tar -zxvf jdk-7u79-linux-x64.tar.gz
  2. mv jdk1.7/ /usr/local/

设定JAVA_HOME环境变量,编辑vim /etc/profile 加入如下内容

  1. export JAVA_HOME=/usr/local/jdk1.7
  2. export JRE_HOME=/usr/local/jdk1.7/jre
  3. export CLASSPATH=.:$JAVA_HOME/lib/dt.jar:$JAVA_HOME/lib/tools.jar:$JRE_HOME/lib:
  4. export PATH=$JAVA_HOME/bin:$PATH

更改后,执行命令使其生效

source /etc/profile

执行 java -version 会看到如下版本信息证明已经安装成功

  1. [root@localhost local]# java -version
  2. java version "1.8.0_65"
  3. Java(TM) SE Runtime Environment (build 1.8.0_65-b17)
  4. Java HotSpot(TM) 64-Bit Server VM (build 25.65-b01, mixed mode)

2.3  安装zookeeper

安装配置zookeeper单机模式

  1. cd /home/work
  2. tar zxvf zookeeper-3.4.5-cdh4.3.0.tar.gz
  3. mv zookeeper-3.4.5-cdh4.3.0 zookeeper
  4. cd /home/work/zookeeper/
  5. mv conf/zoo_sample.cfg conf/zoo.cfg
  6. mkdir -p /home/work/data/zookeeper/{data,log}
  7. cd /home/work/data/zookeeper/data
  8. 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:

  1. ln -s /home/work/zookeeper/bin/zkServer.sh /usr/local/bin/zk-server
  2. ln -s /home/work/zookeeper/bin/zkCli.sh /usr/local/bin/zk-cli

使用如下命令即可启动zookeeper:

  1. zk-server start
  2. #以下输出为运行成功
  3. JMX enabled by default
  4. Using config: /tmp/zookeeper/bin/../conf/zoo.cfg
  5. Starting zookeeper ... STARTED

2.4  安装manager

准备工作做好了我们来一同安装manager

  1. mkdir /home/work/manager
  2. cd /home/work/optar
  3. tar zxvf manager.deployer-4.2.13.tar.gz -C /home/work/manager

安装manager的数据库

  1. wget https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql
  2. mysql -uroot -p
  3. #输入mysql密码
  4. source /home/work/manager/otter-manager-schema.sql

修改vim conf/otter.properties 配置文件

  1. ## otter manager domain name #修改为正确访问ip(内网访问配置内网地址外网访问配置外网地址),生成URL使用
  2. otter.domainName = 127.0.0.1
  3. ## otter manager http port
  4. otter.port = 8080
  5.  
  6. ## otter manager database config ,修改为正确数据库信息
  7. otter.database.driver.url = jdbc:mysql://127.0.0.1:3306/otter
  8. otter.database.driver.username = root
  9. otter.database.driver.password = hello
  10.  
  11. ## default zookeeper address,修改为正确的地址,手动选择一个地域就近的zookeeper集群列表,zookeeper默认端口 2181
  12. otter.zookeeper.cluster.default = 127.0.0.1:2181

启动manager

./bin/startup.sh

PS:manager 编译时间大约需要1分钟

检查日志:

tailf logs/manager.log

如下输出则为启动成功:

  1. 2017-11-04 11:08:20.527 [] INFO com.alibaba.otter.manager.deployer.OtterManagerLauncher - ## start the manager server.
  2. 2017-11-04 11:08:45.420 [] INFO com.alibaba.otter.manager.deployer.JettyEmbedServer - ##Jetty Embed Server is startup!
  3. 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,它是一个文件通道来保证需要同步的数据通过极快的速度同步到需要同步的服务器上

  1. cd /home/work/
  2. tar zxvf aria2-1.17.1.tar.gz
  3. mv aria2-1.17.1 aria2
  4. cd aria2
  5. ./configure
  6. make
  7. make install
  8. # 验证安装是否成功
  9. aria2c -v
  10. # 会输出
  11. aria2 version 1.17.1
  12. Copyright (C) 2006, 2013 Tatsuhiro Tsujikawa

3.2  安装配置node

接下来我们来配置node,node主要负责接受manage下发任务的处理

  1. mkdir /home/work/node
  2. tar xf node.deployer-4.2.13.tar.gz
  3. cd /home/work/node/
  4. # nid配置node的ID多个node协同工作时不能重复
  5. echo 1 > conf/nid
  6. # 修改配置文件
  7. vim conf/otter.properties
  8. # 主要是确认连接manager地址是否正确(这里使用服务器内网地址进行配置)
  9. 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了:

  1. cd /home/work/node/bin/
  2. ./startup.sh

注意:如果发现启动不了可以查看node的日志

等带一段时间后刷新会发现状态已经变为了启动,这个时候就已经成功了:

并且这个时候我们在zookeeper页面点击查看选项可以看到zookeeper已经在运行了:

注意:如果发现一直都是未启动状态可以查阅/tmp/node/logs中的日志

四、单向同步配置实践

4.1  准备工作

建一个测试库

别注意:库名中千万不要带有符号比如"-"这种符号会直接引起同步开启不成功(需要验证)

  1. create database dqd_test;
  2.  
  3. CREATE TABLE `dqd_test` (
  4. `id` int(11) NOT NULL AUTO_INCREMENT,
  5. `name` varchar(255) NOT NULL,
  6. `age` int(10) NOT NULL,
  7. PRIMARY KEY (`id`)
  8. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

4.2  配置manager

首先我们需要配置数据连接,也就是数据源

添加完之后一定要验证一下

同样的操作添加另外一个数据源

4.3  配置同步数据表

配置好数据源后进行需要同步的数据表的配置

4.4  配置同步规则

在同步管理里面添加一个channel

添加配置好一个channel使用的master库

4.5  开启同步

至此,简单的一个单向同步方案完。但是还有很多问题没有解决:比如otter的监控,数据一致性校验,otter同步比mysql跨公网同步的优势(在网络中断时,otter和原生的跨公网同步有什么区别),otter的限制等等。路漫漫兮其修远......

Otter入门简介的更多相关文章

  1. 掌握 Ajax,第 1 部分: Ajax 入门简介

    转:http://www.ibm.com/developerworks/cn/xml/wa-ajaxintro1.html 掌握 Ajax,第 1 部分: Ajax 入门简介 理解 Ajax 及其工作 ...

  2. MongoDB入门简介

    MongoDB入门简介 http://blog.csdn.net/lolinzhang/article/details/4353699 有关于MongoDB的资料现在较少,且大多为英文网站,以上内容大 ...

  3. (转)Web Service入门简介(一个简单的WebService示例)

    Web Service入门简介 一.Web Service简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从I ...

  4. NodeJS入门简介

    NodeJS入门简介 二.模块 在Node.js中,以模块为单位划分所有功能,并且提供了一个完整的模块加载机制,这时的我们可以将应用程序划分为各个不同的部分. const http = require ...

  5. ASP.NET Core学习之一 入门简介

    一.入门简介 在学习之前,要先了解ASP.NET Core是什么?为什么?很多人学习新技术功利心很重,恨不得立马就学会了. 其实,那样做很不好,马马虎虎,联系过程中又花费非常多的时间去解决所遇到的“问 ...

  6. webservice入门简介

    为了梦想,努力奋斗! 追求卓越,成功就会在不经意间追上你 webservice入门简介 1.什么是webservice? webservice是一种跨编程语言和跨操作系统平台的远程调用技术. 所谓的远 ...

  7. Web Service入门简介(一个简单的WebService示例)

    Web Service入门简介 一.Web Service简介 1.1.Web Service基本概念 Web Service也叫XML Web Service WebService是一种可以接收从I ...

  8. Android精通教程-第一节Android入门简介

    前言 大家好,给大家带来Android精通教程-第一节Android入门简介的概述,希望你们喜欢 每日一句 If life were predictable it would cease to be ...

  9. Nginx入门简介

    Nginx入门简介 Nginx 介绍 Nginx (engine x) 是一个高性能的HTTP和反向代理服务,也是一个IMAP/POP3/SMTP服务.Nginx是由伊戈尔·赛索耶夫为俄罗斯访问量第二 ...

随机推荐

  1. 我的Android进阶之旅------>Android关于ImageSpan和SpannableString的初步了解

    最近要实现一个类似QQ聊天输入框,在输入框中可以同时输入文字和表情图像的功能.如下图所示的效果: 为了实现这个效果,先去了解了一下ImageSpan和SpannableString的用法.下面用一个小 ...

  2. LeetCode:删除排序链表中的重复元素【83】

    LeetCode:删除排序链表中的重复元素[83] 题目描述 给定一个排序链表,删除所有重复的元素,使得每个元素只出现一次. 示例 1: 输入: 1->1->2 输出: 1->2 示 ...

  3. nginx配置大全

    nginx配置大全

  4. SrpingCloud 之SrpingCloud config分布式配置中心实时刷新

    默认情况下是不能及时获取变更的配置文件信息 Spring Cloud分布式配置中心可以采用手动或者自动刷新 1.手动需要人工调用接口   监控中心 2.消息总线实时通知  springbus 动态刷新 ...

  5. log4net性能小探

    初步测试了Log4性能.Appender架构如下. 一般客户端,使用FileAppender,把Log记录在本地磁盘. <lockingModel type="log4net.Appe ...

  6. EntityFramework 学习 一 Entity Framework结构体系

    Entity Framework 架构 EDM(Entity Data Model)EDM由3个主要部分组成 Conceptual model , Mapping and Storage model. ...

  7. C/C++ 库函数 是否调用 WinAPI

    1. 跟了一个函数 fopen,简单测试代码为: #include<stdio.h> #define F_PATH "e:\\Z.txt" int main(void) ...

  8. HTTP-接触

    [HTTP]http是基于TCP/IP协议的应用层协议,他不涉及数据包(packet)传输,主要规定了客户端和服务器之间的通信格式,默认端口是80端口. 不同版本http协议里的相关概念[Conten ...

  9. node.js定时任务:node-schedule的使用

    安装 npm install node-schedule 使用方法 1:确定时间 例如:2014年2月14日,15:40执行 var schedule = require("node-sch ...

  10. POJ1363 Rails 验证出栈序列问题

    题目地址: http://poj.org/problem?id=1363 此题只需验证是否为合法的出栈序列. 有两个思路: 1.每个已出栈之后的数且小于此数的数都必须按降序排列.复杂度O(n^2),适 ...