zoukankan      html  css  js  c++  java
  • MySQL 异地 双机房同步之otter

    一、背景:

    阿里巴巴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 export JRE_HOME=/usr/java/jdk1.8.0_151/jre export PATH=$PATH:/usr/java/jdk1.8.0_151/bin export 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)/

  • 相关阅读:
    跳跃游戏1,2
    重叠子区间问题
    最长公共子序列问题
    由leetcode俄罗斯套娃信封问题到C++的sort()函数学习
    一道笔试题,做的很垃圾
    Spring boot框架快速入门
    Redis常用数据类型及其对应的底层数据结构
    Java 类加载机制及双亲委派模型
    Java面试高频知识点总结 part3
    Spring框架专题
  • 原文地址:https://www.cnblogs.com/chinaops/p/9321426.html
Copyright © 2011-2022 走看看