zoukankan      html  css  js  c++  java
  • 数据同步工具otter(二)

    简述

    otter是一个基于canal的数据同步平台,含义是水獭,主要的功能就是可以将mysql的数据同步至另外mysql或者oracle,在项目中应用场景主要是多数据中心、BI系统抽取数据、灾备。

    另外也支持双向同步(即A库同步给B库,B库也同步给A库)、文件同步,不过目前笔者这还没用到。

    简单就可以理解成在canel的基础上做了一个mysql的同步平台(带WEB管理界面),在界面上,你可以定义相应的映射规则,otter进程就会根据你定义的规则读取binlog,并更新到目标库中去

    github的地址:https://github.com/alibaba/otter
    架构

    otter是典型的管理结构,由以下三部分组成:

    1、一个后台的manager(web,对应一个jvm),管理员通过这个管理界面配置相应的同步任务

    2、一个或者多个真正做事情的node(工作节点,对应一个jvm),manager将配置任务推送给node,由node真正干活

    3、为了node之间能协同工作,需要有个zookeeper,解决分布式的调度问题

    整体的架构如下:

    Pipeline:从源端到目标端的整个过程描述,主要由一些同步映射过程组成。

    Channel:同步通道,单项同步中由一个Pipeline组成,在双向同步中由两个Pipleline组成。
    安装配置

    参考此博文吧,不赘述,不难
    https://blog.csdn.net/wudufeng/article/details/78688240

    自-C-由-X-门

    otter默认是只支持源库的增量更新的(因为他只是读取源库的binlog),如果我们有全表更新或者想要历史数据的需求怎么办?这就涉及到otter的自-C-由-X-门功能。

    这个功能在官网的文档中说的语焉不详,而且也不好找,但是是个非常有用的功能。因此简单说下

    首先需要在源库中,需要增加一个retl库和一个密码为retl的retl用户

    /*
    供 otter 使用, otter 需要对 retl.* 的读写权限,以及对业务表的读写权限
    1. 创建database retl
    */
    CREATE DATABASE retl;

    /* 2. 用户授权 给同步用户授权 */
    CREATE USER retl@'%' IDENTIFIED BY 'retl';
    GRANT USAGE ON *.* TO `retl`@'%';
    GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO `retl`@'%';
    GRANT SELECT, INSERT, UPDATE, DELETE, EXECUTE ON `retl`.* TO `retl`@'%';
    /* 业务表授权,这里可以限定只授权同步业务的表 */
    GRANT SELECT, INSERT, UPDATE, DELETE ON *.* TO `retl`@'%';  

    /* 3. 创建系统表 */
    USE retl;
    DROP TABLE IF EXISTS retl.retl_buffer;
    DROP TABLE IF EXISTS retl.retl_mark;
    DROP TABLE IF EXISTS retl.xdual;

    CREATE TABLE retl_buffer
    (   
        ID BIGINT(20) AUTO_INCREMENT,
        TABLE_ID INT(11) NOT NULL,
        FULL_NAME varchar(512),
        TYPE CHAR(1) NOT NULL,
        PK_DATA VARCHAR(256) NOT NULL,
        GMT_CREATE TIMESTAMP NOT NULL,
        GMT_MODIFIED TIMESTAMP NOT NULL,
        CONSTRAINT RETL_BUFFER_ID PRIMARY KEY (ID)
    )  ENGINE=InnoDB DEFAULT CHARSET=utf8;

    CREATE TABLE retl_mark
    (   
        ID BIGINT AUTO_INCREMENT,
        CHANNEL_ID INT(11),
        CHANNEL_INFO varchar(128),
        CONSTRAINT RETL_MARK_ID PRIMARY KEY (ID)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

    CREATE TABLE xdual (
      ID BIGINT(20) NOT NULL AUTO_INCREMENT,
      X timestamp NOT NULL DEFAULT CURRENT_TIMESTAMP,
      PRIMARY KEY (ID)
    ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

    /* 4. 插入初始化数据 */
    INSERT INTO retl.xdual(id, x) VALUES (1,now()) ON DUPLICATE KEY UPDATE x = now();

    下面说说retl_buffer这张表

    CREATE TABLE retl_buffer
       (    
        ID BIGINT AUTO_INCREMENT,   ## 无意义,自增即可
        TABLE_ID INT(11) NOT NULL,   ## tableId, 可通过该链接查询:http://otter.alibaba-inc.com/data_media_list.htm,即序号这一列,如果配置的是正则,需要指定full_name,当前table_id设置为0.
        FULL_NAME varchar(512),  ## schemaName + '.' +  tableName  (如果明确指定了table_id,可以不用指定full_name)
        TYPE CHAR(1) NOT NULL,   ## I/U/D ,分别对应于insert/update/delete
        PK_DATA VARCHAR(256) NOT NULL, ## 多个pk之间使用char(1)进行分隔
        GMT_CREATE TIMESTAMP NOT NULL, ## 无意义,系统时间即可
        GMT_MODIFIED TIMESTAMP NOT NULL,  ## 无意义,系统时间即可
        CONSTRAINT RETL_BUFFER_ID PRIMARY KEY (ID)
       )  ENGINE=InnoDB DEFAULT CHARSET=utf8;

    之后的操作其实就是,把你想要同步表的表名及记录ID插入到retl_buffer表即可

    insert into retl.retl_buffer(ID,TABLE_ID, FULL_NAME,TYPE,PK_DATA,GMT_CREATE,GMT_MODIFIED) (select null,0,'$schema.table$','I',id,now(),now() from $schema.table$);

    如果针对多主键时,对应的PK_DATA需要将需要同步表几个主键按照(char)1进行拼接。

    以下这条sql的意思就是将rrrr.t_test的主键为aaa的这条记录按照规则插入到目标库

    insert into `retl`.`retl_buffer` ( `TABLE_ID`, `FULL_NAME`, `TYPE`, `PK_DATA`, `GMT_CREATE`, `GMT_MODIFIED`) values ( '0', 'rrrr.t_test', 'I', 'aaa', now(), now());

    其实原理还是使用canel读取了源库的retl_buffer操作binlog来进行实现的,所以在使用此功能时,channel必须处于工作状态。
    注意事项

        同步表必须有主键
        如果channel已经建立,数据表字段更新的时候,只允许新增字段到末尾。还有就是新增字段要先加目标库,再加源库
    ————————————————
    版权声明:本文为CSDN博主「frog4」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
    原文链接:https://blog.csdn.net/frog4/java/article/details/81613025

  • 相关阅读:
    从虚拟地址,到物理地址(开PAE)
    无LoadLibrary获取指定模块基址
    练习
    Centos安装Python3及设置对应版本pip
    Varnish安装使用(初学)
    luogu P2463 [SDOI2008]Sandy的卡片 |二分+hash
    luogu P2852 [USACO06DEC]牛奶模式Milk Patterns |二分+hash
    luogu P4051 [JSOI2007]字符加密 |后缀数组(SA)
    弦图 学习笔记&
    luogu P1600 天天爱跑步 |树上差分+LCA
  • 原文地址:https://www.cnblogs.com/purple5252/p/13176667.html
Copyright © 2011-2022 走看看