Otter入门简介

article/2025/10/20 15:40:44

一、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. ## otter manager database config ,修改为正确数据库信息
  6. otter.database.driver.url = jdbc:mysql://127.0.0.1:3306/otter
  7. otter.database.driver.username = root
  8. otter.database.driver.password = hello
  9. ## default zookeeper address,修改为正确的地址,手动选择一个地域就近的zookeeper集群列表,zookeeper默认端口 2181
  10. 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. CREATE TABLE `dqd_test` (
  3. `id` int(11) NOT NULL AUTO_INCREMENT,
  4. `name` varchar(255) NOT NULL,
  5. `age` int(10) NOT NULL,
  6. PRIMARY KEY (`id`)
  7. ) ENGINE=InnoDB DEFAULT CHARSET=utf8

4.2  配置manager

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

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

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

4.3  配置同步数据表

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

4.4  配置同步规则

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

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

4.5  开启同步

 

 

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

转载于:https://www.cnblogs.com/duanxz/p/5008837.html


http://chatgpt.dhexx.cn/article/HdbfKnt0.shtml

相关文章

2.Otter原理介绍

Introduction 项目介绍 名称:otter [ɒtə(r)] 译意: 水獭,数据搬运工 语言: 纯java开发 定位: 基于数据库增量日志解析,准实时同步到本机房或异地机房的mysql/oracle数据库. 工作原理 image 原理描述&…

斐波那契数列输出的C语言实现

斐波那契数列输出的C语言实现 1.流程图 2.代码实现 #include <stdio.h>#define num1 0//第一项 #define num2 1//第二项int Fibonacci_Sequence(int num_n1, int num_n2, int times_0,int times_already)//num_1为第n-2位数&#xff0c;int num_n2为第n-1位数&#xf…

蓝桥杯入门训练Fibonacci数列 C语言

Fibonacci数列 C语言 问题描述 Fibonacci数列的递推公式为:Fn=Fn-1+Fn-2,其中F1=F2=1。 当n比较大时,Fn也非常大,现在我们想知道,Fn除以10007的余数是多少。 输入格式 输入包含一个整数n。 输出格式 输出一行,包含一个整数,表示Fn除以10007的余数。 说明: 在本题中…

C语言 计算斐波那契数列

C语言 计算斐波那契数列 前言 在学习C语言的道路上多次遇到了求斐波那契数列的问题&#xff0c;今天来总结一下我所知道的几种思想方法。方法一&#xff1a;循环 使用斐波那契数列的推导式&#xff0c;通过循环将每一个值保存到数组fib中。需要说明的是&#xff0c;这里的fi…

c语言数组的斐波那契数列

c语言数组的斐波那契数列 核心思想&#xff1a;后一项是前一项的和 a[i]a[i-1]a[i-2]&#xff1b; 题干 转换为代码 #include<stdio.h> int main() {int i,n,a[20]{1,1};scanf("%d",&n);if(n<2)printf("%d",1);else{for(i2;i<n;i)a[i]a…

C语言数组之斐波那契数列

目录 一、斐波那契数列是什么&#xff1f; 二、代码展示 1.斐波那契数列 2.冒泡排序 总结 一、斐波那契数列是什么&#xff1f; 斐波那契数列指的是这样一个数列&#xff1a;1、1、2、3、5、8、13、21、34、……在数学上&#xff0c;斐波那契数列以如下被以递推的方法定义…

斐波那契数列c语言实现 每行五个输出

斐波那契数列 指的是这样一个数列&#xff1a; 0 1 1 2 3 5 8 13 21 34 55 89 144 233… 这个数列从第3项开始&#xff0c;每一项都等于前两项之和。 设计思路&#xff0c;考虑到数列是从第三项开始呈现规律&#xff0c;故将前两项先定义&#xff0c;第三项设为变量。 后续通过…

斐波那契数列C语言实现

斐波那契数列(Fibonacci) 斐波那契数列&#xff08;意大利语: Successione di Fibonacci)&#xff0c;又称黄金分割数列、费波那西数列、费波拿契数、费氏数列&#xff0c;指的是这样一个数列&#xff1a;0、1、1、2、3、5、8、13、21、……在数学上&#xff0c;斐波纳契数列以…

斐波那契数列C语言

1.斐波那契数列是指这样一个数列&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#xff0c;89..... 这个数列从第3项开始&#xff0c;每一项都等于前两项之和。 主要思想&#…

斐波那契数列C语言设计步骤,斐波那契数列c语言函数

(C语言)用递归方法编写CSS布局HTML小编今天和大家分享斐波那契数列的函数 用递归方法编写CSS布局HTML小编今天和大家分享斐波那契数列的函数&#xff0c;返回值为长整型。斐波那契数列的#include long func(long n) { if(n0||n1)return n; else return func(n-1)func(n-2); } m…

C语言斐波那契数列

斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”&#xff0c;指的是这样一个数列&#xff1a;…

斐波那契数列【C语言实现】

1. 定义&#xff1a; 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”&#xff0c;指的是这样…

【C语言】斐波那契数列

一.斐波那契数列是什么&#xff1f; 斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称黄金分割数列&#xff0c;因数学家莱昂纳多斐波那契&#xff08;Leonardo Fibonacci&#xff09;以兔子繁殖为例子而引入&#xff0c;故又称为“兔子数列”&#xf…

用C 语言实现斐波那契数列

斐波那契数列&#xff08;Fibonacci sequence&#xff09;&#xff0c;又称“黄金分割”数列&#xff0c;比如这样一个数列&#xff1a;1&#xff0c;1&#xff0c;2&#xff0c;3&#xff0c;5&#xff0c;8&#xff0c;13&#xff0c;21&#xff0c;34&#xff0c;55&#xf…

免费且好玩的API接口

其实很多小伙伴都在寻找一些免费的好用的API接口&#xff0c;下面就来介绍一些好用的并且稳定的API接口吧。 1.聚合数据 聚合数据网站提供的接口可以说是非常的多&#xff0c;并且很多都是免费使用&#xff0c;虽然有次数的限制&#xff0c;但是用来进行简单的测试或者日常使…

分享笔趣阁、宜搜等小说免费API接口

背景 因为有一些js基础&#xff0c;开始是想学python的爬虫的&#xff0c;后来觉得python爬虫没用。因为我是想用爬虫去爬一些api接口的。爬虫真的太low了……有点鸡肋&#xff08;勿喷&#xff09; 然后为了爬api接口&#xff0c;我就去学抓包&#xff0c;2天速成&#xff0…

几个免费API接口分享,调用完全不限次数...

点击上方蓝色“终端研发部”&#xff0c;选择“设为星标” 学最好的别人&#xff0c;做最好的我们作者 : ishxiao 来源&#xff1a;blog.csdn.net/ishxiao/article/details/53839061 各类无次数限制的免费API接口整理&#xff0c;主要是聚合数据上和API Store上的一些&#xff…

快速拥有自己的网易云免费API接口

操作简单&#xff0c;快速拥有自己的网易云api接口。 https://binaryify.github.io/NeteaseCloudMusicApi/#/?id%e6%ad%8c%e6%89%8b%e7%83%ad%e9%97%a850%e9%a6%96%e6%ad%8c%e6%9b%b2 此链接为网易云开发接口文档&#xff0c;拥有自己的api后就可以结合它进行令人兴奋的操作…

超百个免费api接口,分享给你

API&#xff08;应用程序编程接口&#xff09; API&#xff08;Application Programming Interface&#xff0c;应用程序接口&#xff09;是一些预先定义的函数&#xff0c;或指软件系统不同组成部分衔接的约定。目的是提供应用程序与开发人员基于某软件或硬件得以访问一组例程…

50多个免费 API 接口分享

1 背景 此前时不时会有一些研发小伙伴和我诉苦&#xff0c;说很多企业由于人力财力限制或者需求不强&#xff0c;会直接购买使用第三方的开放API&#xff0c;这样一来&#xff1a; 一则由于开放项目不是量身定制的&#xff0c;寻找自己合适的接口也要搜索调研蛮多时间。二则这种…