一、背景:

阿里巴巴B2B公司,因为业务的特性,卖家主要集中在国内,买家主要集中在国外,所以衍生出了杭州和美国异地机房的需求, 同时为了提升用户体验,整个机房的架构为双A,两边均可写,由此诞生了otter这样一个产品。

目前同步规模:

1、同步数据量6亿

2、文件同步1.5TB(2000w张图片)

3、涉及200+个数据库实例之间的同步

4、80+台机器的集群规模.

二、工作原理:

原理描述:

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

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

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

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

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

三、项目官方地址:

Otter项目地址:https://github.com/alibaba/otter

Otter文档地址:https://github.com/alibaba/otter/wiki

四、为何我们要使用otter:

Otter能解决什么问题 技术最终是解决业务问题的,不然还是耍流氓!我们来一同看看 Otter 到底能解决我们在开发中遇到的那些场景中的问题

1、异构库同步 Otter支持从Mysql同步到Mysql/oracle,我们可以把mysql同步到oracle。

2、单机房同步 可以作为一主多从同步方案,对于单机房内网来说效率非常高,还可以做为数据库版本升级,数据表迁移,二级索引等这类功能。

3、异地机房同步 异地机房同步可以说是Otter最大的亮点之一,可以解决国际化问题把数据从国内同步到国外来提供用户使用,在国内场景可以做到数据多机房容灾。

4、双向同步 双向同步是在数据同步中最难搞的一种场景,Otter可以很好的应对这种场景,Otter有避免回环算法和数据一致性算法两种特性,保证双A机房模式下, 数据保证最终一致性。

5、文件同步 站点镜像,进行数据复制的同时,复制关联的图片,比如复制产品数据,同时复制产品图片

单机房复制示意图:

说明:

a. 数据on-Fly,尽可能不落地,更快的进行数据同步. (开启node loadBalancer算法,如果Node节点S+ETL落在不同的Node上,数据会有个网络传输过程)

b. node节点可以有failover / loadBalancer.

异地机房复制示意图:

说明:

a. 数据涉及网络传输,S/E/T/L几个阶段会分散在2个或者更多Node节点上,多个Node之间通过zookeeper进行协同工作 (一般是Select和Extract在一个机房的Node,Transform/Load落在另一个机房的Node)

b. node节点可以有failover / loadBalancer. (每个机房的Node节点,都可以是集群,一台或者多台机器)

初步性能指标:

1. 单机房同步

a. 100tps , 延迟100ms

b. 5000tps, 延迟1s

2. 中美异地机房同步

a. 100tps , 延迟2s

b. 5000tps ,延迟10s

ps. 性能指标取决于目标数据库性能,数据大小等多个因素,单机房100b大小,极限tps可以1w+

相关名词解释

otter核心model关系图

名词解释

  • Pipeline:从源端到目标端的整个过程描述,主要由一些同步映射过程组成
  • Channel:同步通道,单向同步中一个Pipeline组成,在双向同步中有两个Pipeline组成
  • DataMediaPair:根据业务表定义映射关系,比如源表和目标表,字段映射,字段组等
  • DataMedia : 抽象的数据介质概念,可以理解为数据表/mq队列定义
  • DataMediaSource : 抽象的数据介质源信息,补充描述DateMedia
  • ColumnPair : 定义字段映射关系
  • ColumnGroup : 定义字段映射组
  • Node : 处理同步过程的工作节点,对应一个jvm

----

otter的S/E/T/L stage阶段模型

说明:为了更好的支持系统的扩展性和灵活性,将整个同步流程抽象为Select/Extract/Transform/Load,这么4个阶段.

Select阶段: 为解决数据来源的差异性,比如接入canal获取增量数据,也可以接入其他系统获取其他数据等。

Extract/Transform/Load 阶段:类似于数据仓库的ETL模型,具体可为数据join,数据转化,数据Load的

相关

五、服务器环境:

  • centos7.3 2vcpu 3G内存
  • MySQL master 10.0.52.199
  • MySQL slave 10.0.52.200
  • 1、所需软件
  • aria2-1.33.1.tar.gz
  • jdk-8u151-linux-x64.tar.gz
  • manager.deployer-4.2.15.tar.gz
  • node.deployer-4.2.15.tar.gz
  • zookeeper-3.4.11.tar.gz
  • 2、安装数据库
  • 此处不再介绍,参考网上的注意 row格式与sever-id 要不同
  • 3、安装jdk otter
  • mannage和node节点都安装

  • [root@master otter]#mkdir /usr/java && tar -xf jdk-8u151-linux-x64.tar.gz -C /usr/java

  • [root@master otter]#sed -i '57a export JAVA_HOME=/usr/java/jdk1.8.0_151\nexport JRE_HOME=/usr/java/jdk1.8.0_151/jre\nexport PATH=$PATH:/usr/java/jdk1.8.0_151/bin\nexport CLASSPATH=./:/usr/java/jdk1.8.0_151/lib:/usr/java/jdk1.8.0_151/jre/lib ' /etc/profile

  • [root@master otter]#source /etc/profile

  • [root@master otter]# java -version

  • java version "1.8.0_151"

  • Java(TM) SE Runtime Environment (build 1.8.0_151-b12)

  • Java HotSpot(TM) 64-Bit Server VM (build 25.151-b12, mixed mode)

  • 4. 安装配置zookeeper

  • [root@master otter]#tar zxvf zookeeper-3.4.11.tar.gz -C /usr/local/ && cd /usr/local/ && mv zookeeper-3.4.11 zookeeper
  • [root@master otter]#cd zookeeper [root@master zookeeper]#mv conf/zoo_sample.cfg conf/zoo.cfg
  • [root@master zookeeper]#mkdir data
  • [root@master zookeeper]#echo 1 > data/myid #将本节点id设定到data/myid文件中
  • [root@master zookeeper]#echo 'export PATH=/usr/local/zookeeper/bin:$PATH'>>/etc/profile
  • [root@master zookeeper]#source /etc/profile [root@master zookeeper]#zkServer.sh start
  • [root@master zookeeper]#zkServer.sh status MX enabled by default Using config: /usr/local/zookeeper/bin/../conf/zoo.cfg Mode: standalone
  • 5. 安装配置manager

  • [root@master /]#mkdir /opt/module/manager -p [root@master /]#tar -xf manager.deployer-4.2.15.tar.gz -C /opt/module/manager
  • [root@master /]#wget https://raw.github.com/alibaba/otter/master/manager/deployer/src/main/resources/sql/otter-manager-schema.sql 由于默认脚本是MySQL5.6版本,而我的是5.7的需要修改下slq_mode mysql>set session sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION'; [root@master /]#cd /opt/module/manager
  • [root@master /]#mysql -u root -p otter </opt/module/otter-manager-schema.sql 输入mysql密码 修改vim conf/otter.properties 配置文件 otter.domainName = 10.0.52.199 otter.port = 8080 otter.database.driver.url = jdbc:mysql://127.0.01:3306/ottermanager otter.database.driver.username = root otter.database.driver.password = 123456 otter.zookeeper.cluster.default = 127.0.0.1:2181 启动manager
  • [root@master manager]#./bin/startup.sh
  • [root@master manager]#tail -200f logs/manager.log the manager server is running now ...... 以上输出则为启动成功
  • 过程导入otter-manager-schema.sql 报错解决
  • 1. ERROR 1067 (42000): Invalid default value for 'FAILD_TIME'   (对TIMESTAMP  类型的子段如果不设置缺省值或没有标志not null时候在创建表时会报这个错误)
    这是因为sql_mode中的NO_ZEROR_DATE导制的,在strict mode中不允许'0000-00-00'作为合法日期

    使用下面的命令查看sql_mode

    mysql>show variables like 'sql_mode';

    +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
    | Variable_name | Value                                                                                                                                     |
    +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+
    | sql_mode      | ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,NO_ZERO_DATE,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION |
    +---------------+-------------------------------------------------------------------------------------------------------------------------------------------+

    将上面的NO_ZERO_DATE改为下面的 ALLOW_INVALID_DATES

    mysql> set sql_mode='ONLY_FULL_GROUP_BY,STRICT_TRANS_TABLES,NO_ZERO_IN_DATE,ALLOW_INVALID_DATES,ERROR_FOR_DIVISION_BY_ZERO,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION';

    上面的设置是临时设置,在重新登陆后,该设置又恢复为NO_ZERO_DATE

6. 安装配置node:

1、node节点需要安装aria2,aria2它是一个文件通道来保证需要同步的数据用过极快的速度同步到需要同步的服务器上

yum -y install wget screen unzip gcc gcc-c++ openssl-devel
cd /root
wget https://github.com/aria2/aria2/releases/download/release-1.33.1/aria2-1.33.1.tar.gz
tar xzvf aria2-1.33.1.tar.gz
cd aria2-1.33.1
./configure
make
make install

[root@master /]tar -xf aria2-1.33.1.tar.gz

[root@master /]./configure

[root@master /]make

[root@master /]make install 验证安装是否成功

[root@master /]aria2c -v aria2 版本 1.33.1 Copyright (C) 2006, 2017 Tatsuhiro Tsujikawa 本程序为自由软件;您可自由再版或修改它,惟须遵守 GNU 通用公共许可证, 第 2 版或更新版本(依您所愿)的条款,以自由软件基金会发布的版本为准。 我们本着希望有用的态度发行此软件,但 *从未做出任何保证*,甚至不暗示对 于适销性或对某一特定用途的适用性的保证。参见 GNU 通用公共许可证以获取 更多信息。 ** 配置 ** 已开启的特性: BitTorrent, Firefox3 Cookie, GZip, HTTPS, Message Digest, Metalink, XML-RPC 哈希算法: sha-1, sha-224, sha-256, sha-384, sha-512, md5, adler32 库: zlib/1.2.7 libxml2/2.9.1 sqlite3/3.7.17 OpenSSL/1.0.2k 编译器: gcc 4.8.5 20150623 (Red Hat 4.8.5-16) built by x86_64-pc-linux-gnu on Dec 7 2017 18:57:43 系统: Linux 3.10.0-514.el7.x86_64 #1 SMP Tue Nov 22 16:42:41 UTC 2016 x86_64 报告问题至 https://github.com/aria2/aria2/issues 访问 https://aria2.github.io/ 2、安装node node主要负责接收mannage下发的任务处理

[root@master /]mkdir -p /opt/module

[root@master /]tar -xf node.deployer-4.2.15.tar.gz -C /opt/module

[root@master /]cd /opt/module/node nid配置node的ID,多个node协同工资时不能重复 [root@slave node]# echo 1 >conf/nid 修改配置文件

[root@slave node]# vim conf/otter.properties 主要修改链接mamager地址是否正确 otter.manager.address = 10.0.52.199:1099 等待mannage启动后再启动node 3、关联manager ,zookeeper和node 先登录manager

搬运从https://weiyanwei412.github.io/2018/05/04/otter(%E5%8D%95%E5%90%91%E5%90%8C%E6%AD%A5)/

MySQL 异地 双机房同步之otter的更多相关文章

  1. Docker Mysql数据库双主同步配置方法

    一.背景 可先查看第一篇<Docker Mysql数据库主从同步配置方法>介绍 二.具体操作 1.创建目录(~/test/mysql_test1): --mysql --mone --da ...

  2. MySQL 同一实例不同库之间表同步(Otter 应用)

    1 需求 在同一台服务器同一MySQL实例中的source库和target库都存在student表.如果source库中该表发生增删改操作时,也需要体现到target库的student表中: 2 解决 ...

  3. otter双主同步安装与配置

    otter是阿里的开源数据同步项目,资源地址就不用说了哈,网上找,阿里云论坛关于单方向同步的配置已经很清楚了,理论上说,双主同步也不复杂,但是毕竟 是数据库,比较重要,配置双主的时候,总觉得心里没底, ...

  4. otter双A同步配置

    otter双A配置 最近做跨国服务器的数据同步,用了阿里的otter开源框架,遇到了不少问题,写一下文档为以后做参考. 第一步: 下载所需的文件 :otter,zookeeper,aria2 otte ...

  5. Otter双A同步搭建入门教程

    1.准备阶段 1.1 环境 虚拟机A :192.168.0.130 虚拟机B :192.168.0.131 系统:Ubuntu 16.04 LTS JRE:OpenJDK 1.8.0_151(A.B都 ...

  6. MySQL 5.7双主同步部分表

    参考:http://www.jb51.net/article/122892.htm?pc 前言: 我们要配置双主同步的mysql服务器. 暂时叫做,mysql1和mysql2吧. 一  mysql的配 ...

  7. mysql同步之otter/canal环境搭建完整详细版

    接上一篇mysql 5.7多源复制(用于生产库多主库合并到一个查询从库). 这一篇详细介绍otter/canal环境搭建以及当同步出现异常时如何排查.本文主要参考https://blog.csdn.n ...

  8. MySQL热机双备之双主同步复制配置

    此配置方案来源于csdn前辈博客,奈何找不到出处了,抱拳!!! 1.  MySQL同步机制概述 MySQL支持单向.异步复制,复制过程中一台服务器充当主服务器,一台或多台服务器充当从服务器,双主同步要 ...

  9. 转载:阿里canal实现mysql binlog日志解析同步redis

    from: http://www.cnblogs.com/duanxz/p/5062833.html 背景 早期,阿里巴巴B2B公司因为存在杭州和美国双机房部署,存在跨机房同步的业务需求.不过早期的数 ...

随机推荐

  1. JAVA上传文件到数据库

    前端代码 <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"> <html> &l ...

  2. 正则re模块--入门

    本文来源:https://www.cnblogs.com/dyfblog/p/5880728.html 对字符串操作 1.应用: 当我们爬取的东西在js文件中,比如我爬今日头条美女的图片时,它的图片u ...

  3. nginx 报错:[crit] 12456#0: *5 SSL_do_handshake() failed (SSL: error:1408A0A0:SSL routines:SSL3_GET_CLIENT_HELLO

    解决方法: 将配置 listen ssl; 更换为: listen ; ssl on; 从版本1.15.0开始,ssl on; 指令被废弃,使用 listen 443 ssl; 代替. 具体查看官网: ...

  4. HIVE udf实例

    本例中udf来自<hive编程指南>其中13章自定义函数中一个例子. 按照步骤,第一步,建立一个项目,创建 GenericUDFNvl 类. /** * 不能接受第一个参数为null的情况 ...

  5. 嵌套泛型参数IList<IList<Object>>如何传参

    在调用第三方库的时候,有这么一个泛型参数,如下图: 按照经验,使用两个List嵌套声明变量即可: IList<IList<AnnotatedPoint2D>>  outImag ...

  6. eclipse 创建Java web项目 Cannot change version of project facet Dynamic web module to xxx

    问题描述: 用Eclipse创建Java web项目时选择的Artifact Id为maven-artchetype-webapp,由于这个archetype比较老,用的servlet还是2.3的. ...

  7. XVS 操作

    1. xvs安装   rpm -i  ***.rpm 2.获取license root@ubuntu:/usr/local/xvs# ./xvs -L .Host ID: 16b3d720584704 ...

  8. URL的 ? 和 # (hash),如何将参数保存在URL中,用于刷新获取之前的变量?

    URL中会带上参数,假如是?开头的,那这个是会被加入到ajax请求中的,#(hash)相当于书签锚点,用于定位页面,不会加入到ajax请求中,所以有些时候,我们可以把一些参数放在#后面 如何获取URL ...

  9. java 获取视频时间

    //先将视频保存到项目生成临时文件,获取时长后删除临时文件 // 使用fastdfs进行文件上传 @RequestMapping("/uploadVideoToFast") @Re ...

  10. Webmin代码执行漏洞复现

    0x00 前言之前由于hw,没得时间分析.这个webmin相信大家很多次都在内网扫到过.也是内网拿机器得分的一环. 0x01影响版本Webmin<=1.920 0x02 环境搭建 建议大家以后用 ...