數據同步工具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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM