otter使用和配置 - GavinHacker/otter GitHub Wiki

简介

https://github.com/alibaba/otter

image

深入理解otter架构地址:
http://note.youdao.com/noteshare?id=63f494d129da0498848d81c6055bd1a4

1. 基于Canal开源产品,获取数据库增量日志数据。

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

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

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

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

使用

(一)关于mysql的初始化

a. canal的原理是基于mysql binlog技术,所以这里一定需要开启mysql的binlog写入功能,建议配置binlog模式为row.

[mysqld]
log-bin=mysql-bin #添加这一行就ok
binlog-format=ROW #选择row模式
server_id=1 #配置mysql replaction需要定义,不能和canal的slaveId重复

b. canal的原理是模拟自己为mysql slave,所以这里一定需要做为mysql slave的相关权限.
CREATE USER canal IDENTIFIED BY 'canal';  
GRANT SELECT, REPLICATION SLAVE, REPLICATION CLIENT ON *.* TO 'canal'@'%';
-- GRANT ALL PRIVILEGES ON *.* TO 'canal'@'%' ;
FLUSH PRIVILEGES

(二)canal 

    https://github.com/alibaba/canal
    

(三)安装zookeeper

    解压应用;配置端口;启动;

(四)安装otter manager
    找到otter配置文件,配置ip, 端口,初始化数据库,并配置到配置文件中;配置zookeeper的地址
    
(五)安装otter node
    
    a.在otter manager中zookeeper中创建zookeeper记录
    b.在node管理中,创建对应的node记录。
    c.解压node,修改配置文件,配置otter manager的地址, 新建nid文件在conf下,并把b中的node记录中的id写入nid文件
    d.启动node, 查看otter manager的node列表
    
(六) Channel
    
    a.新建Chanel
    b.新建Pipeline,选择node, Canel
    c.在pipeline下新建表映射
    d.启动Chanel
    
(七)官方说明
    
    QuickStart:
    https://github.com/alibaba/otter/wiki/QuickStart

多种同步方式配置

a. 单向同步

    配置一个channel
    配置一个pipeline
    对应node机器选择时,建议遵循:S/E节点选择node需尽可能离源数据库近,T/L节点选择node则离目标数据库近. 如果无法提供双节点,则选择离目标数据库近的node节点相对合适.
    配置一个canal
    定义映射关系. 
    canal中配置解析的数据库ip需要和映射关系中源表对应的数据库ip一致. ps. 映射关系进行匹配的时候是基于表名,虽然数据库ip不匹配也会是有效.
    
b. 双向同步

    双向同步可以理解为两个单向同步的组合,但需要额外处理避免回环同步. 回环同步算法: Otter双向回环控制 .

    同时,因为双向回环控制算法会依赖一些系统表,需要在需要做双向同步的数据库上初始化所需的系统表.
    
    获取初始sql:
    wget https://raw.github.com/alibaba/otter/master/node/deployer/src/main/resources/sql/otter-system-ddl-mysql.sql
    配置上相比于单向同步有一些不同,操作步骤:
    
    配置一个channel
    配置两个pipeline 
    注意:两个单向的canal和映射配置,在一个channel下配置为两个pipeline. 如果是两个channel,每个channel一个pipeline,将不会使用双向回环控制算法,也就是会有重复回环同步.
    每个pipeline各自配置canal,定义映射关系

c. 双A同步

双A同步相比于双向同步,主要区别是双A机房会在两地修改同一条记录,而双向同步只是两地的数据做互相同步,两地修改的数据内容无交集.

所以双A同步需要额外处理数据同步一致性问题. 同步一致性算法:Otter数据一致性 ,目前开源版本主要是提供了单向回环补救的一致性方案.

双A同步相比于双向同步,整个配置主要是一些参数上有变化,具体步骤:

i.配置一个channel , 是否开启数据一致性,选择是
  一致性反查数据库延迟阀值 ,设置为60
ii.配置两个pipeline,定义一个主站点同步,另一个分站点同步;
* 注意:除了需要定义一个主站点外,需要在高级设置中将一个pipeline的“支持DDL”设置为false,另一个设置为true,否则将提示“一个channel中只允许开启单向ddl同步!”错误
iii.每个pipeline各自配置canal,定义映射关系


d. 级联同步

    单向同步/双向同步,都是针对一个channel下的多pipeline配置进行控制,是否可以使用多个channel完成类似级联同步的功能.
    
    几种级联同步.
    
        A->B->C ,A单向同步到B,B再单向同步到C
        A<->B->C,A和B组成一个双向,B再单向同步到C
        A<->B<-C,A和B组成一个双向,C将数据单向同步B,也就是B是一个接受多M同步写入的的节点,目前mysql不支持
        A<->B->C,B-/->D,A和B组成一个双向,B再单向同步到C,但A同步到B的数据不同步到D,但B地写入的数据同步到D,目前mysql不支持.
    
    操作步骤:
    
        目前channel之间的级联同步,不需要设置任何参数,只要通过canal进行binlog解析即可.

针对级联屏蔽同步,需要利用到自定义同步标记的功能,比如A->B,B同步到C但不同步到D。需要在A->B的同步高级参数里定义NOT_DDD,然后在B同步到D的高级参数里也定义NOT_DDD. 原理:这样在B解析到A->B写入的同步标记为NOT_DDD,与当前同步定义的NOT_DDD进行匹配,就会忽略此同步.

e. 多A同步
    
    基于以上的单向/双向/双A/级联同步,可以随意搭建出多A同步,不过目前受限于同步数据的一致性算法,只能通过星形辐射,通过级联同步的方式保证全局多A机房的数据一致性. 
    比如图中B和C之前的一致性同步,需要通过主站点A来保证.

image

自由门

主要功能是在不修改原始表数据的前提下,触发一下数据表中的数据同步。

可用于:

同步数据订正
全量数据同步. (自 由 门触发全量,同时otter增量同步,需要配置为行记录模式,避免update时因目标库不存在记录而丢失update操作)

主要原理:

a. 基于otter系统表retl_buffer,插入特定的数据,包含需要同步的表名,pk信息。

b. otter系统感知后会根据表名和pk提取对应的数据(整行记录),和正常的增量同步一起同步到目标库。

目前otter系统感知的自 由 门数据方式为:

日志记录. (插入表数据的每次变更,需要开启binlog,otter获取binlog数据,提取同步的表名,pk信息,然后回表查询整行记录)
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;


全量同步操作示例:

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进行拼接,比如 concat(id,char(1),name)

具体参数详解

channel参数

同步一致性. ==> 基于数据库反查(根据binlog反查数据库),基于当前变更(binlog数据)。针对数据库反查,在延迟比较大时比较有效,可将最新的版本快速同步到目标,但会对源库有压力.

同步模式. ==> 行模式,列模式。行模式特点:如果目标库不存在记录时,执行插入。列模式主要是变更哪个字段,只会单独修改该字段,在双A同步时,为减少数据冲突,建议选择列模式。

是否开启数据一致性. ==> 请查看数据一致性文档:Otter数据一致性
    a. 数据一致性算法
    b. 一致性反查数据库延迟阀值

pipeline参数

1.并行度. ==> 查看文档:Otter调度模型,主要是并行化调度参数.(滑动窗口大小)
2.数据反查线程数. ==> 如果选择了同步一致性为反查数据库,在反查数据库时的并发线程数大小
3.数据载入线程数. ==> 在目标库执行并行载入算法时并发线程数大小
4.文件载入线程数. ==> 数据带文件同步时处理的并发线程数大小
5.主站点. ==> 双A同步中的主站点设置 
6.消费批次大小. ==> 获取canal数据的batchSize参数
7.获取批次超时时间. ==> 获取canal数据的timeout参数

pipeline 高级设置

8.使用batch. ==> 是否使用jdbc batch提升效率,部分分布式数据库系统不一定支持batch协议
9.跳过load异常. ==> 比如同步时出现目标库主键冲突,开启该参数后,可跳过数据库执行异常
10.仲裁器调度模式. ==> 查看文档:Otter调度模型
11.负载均衡算法. ==> 查看文档:Otter调度模型
12.传输模式. ==> 多个node节点之间的传输方式,RPC或HTTP. HTTP主要就是使用aria2c,如果测试环境不装aria2c,可强制选择为RPC
13.记录selector日志. ==> 是否记录简单的canal抓取binlog的情况
14.记录selector详细日志. ==> 是否记录canal抓取binlog的数据详细内容
15.记录load日志. ==> 是否记录otter同步数据详细内容
16.dryRun模式. ==> 只记录load日志,不执行真实同步到数据库的操作
17.支持ddl同步. ==> 是否同步ddl语句
18.是否跳过ddl异常. ==> 同步ddl出错时,是否自动跳过
19.文件重复同步对比 ==> 数据带文件同步时,是否需要对比源和目标库的文件信息,如果文件无变化,则不同步,减少网络传输量.
20.文件传输加密 ==> 基于HTTP协议传输时,对应文件数据是否需要做加密处理
21.启用公网同步 ==> 每个node节点都会定义一个外部ip信息,如果启用公网同步,同步时数据传递会依赖外部ip.
22.跳过自 由 门数据 ==> 自定义数据同步的内容
23.跳过反查无记录数据 ==> 反查记录不存在时,是否需要进行忽略处理,不建议开启.
24.启用数据表类型转化 ==> 源库和目标库的字段类型不匹配时,开启改功能,可自动进行字段类型转化
25.兼容字段新增同步 ==> 同步过程中,源库新增了一个字段(必须无默认值),而目标库还未增加,是否需要兼容处理
26.自定义同步标记 ==> 级联同步中屏蔽同步的功能.

Canal参数

1.数据源信息
单库配置: 10.20.144.34:3306;
多库合并配置: 10.20.144.34:3306,10.20.144.35:3306; (逗号分隔)
主备库配置:10.20.144.34:3306;10.20.144.34:3307; (分号分隔)
2.数据库帐号
3.数据库密码
4.connectionCharset ==> 获取binlog时指定的编码
5.位点自定义设置 ==> 格式:{"journalName":"","position":0,"timestamp":0}; 
指定位置:{"journalName":"","position":0}; 
指定时间:{"timestamp":0};
6.内存存储batch获取模式 ==> MEMSIZE/ITEMSIZE,前者为内存控制,后者为数量控制.  针对MEMSIZE模式的内存大小计算 = 记录数 * 记录单元大小
7.内存存储buffer记录数
8.内存存储buffer记录单元大小
9.HA机制
10.心跳SQL配置 ==> 可配置对应心跳SQL,如果配置 是否启用心跳HA,当心跳SQL检测失败后,canal就会自动进行主备切换.

Node参数

1.机器名称 ==> 自定义名称,方便记忆
2.机器ip ==> 机器外部可访问的ip,不能选择127.0.0.1
3.机器端口 ==> 和manager/node之间RPC通讯的端口
4.下载端口 ==> 和node之间HTTP通讯的端口
5.外部Ip ==> node机器可以指定多IP,通过pipeline配置决定是否启用
6.zookeeper集群 ==> 就近选择zookeeper集群

Zookeeper集群参数

集群名字 ==> 自定义名称,方便记忆
zookeeper集群 ==> zookeeper集群机器列表,逗号分隔,最后以分号结束

主备配置参数

group Key ==> 自定义名称,otter其他地方基于该名称进行引用
master / slave ==> 主备库ip信息
生成了groupKey,1. 可以在数据库配置时,设置url:jdbc:mysql://groupKey=key (更改 key). 2. 在canal配置时,选择HA机制为media,可填入该groupKey进行引用

其他

双向回环控制算法
https://github.com/alibaba/otter/wiki/Otter%E5%8F%8C%E5%90%91%E5%9B%9E%E7%8E%AF%E6%8E%A7%E5%88%B6

otter控制数据一致性

https://github.com/alibaba/otter/wiki/Otter%E6%95%B0%E6%8D%AE%E4%B8%80%E8%87%B4%E6%80%A7#%E4%BA%8B%E5%89%8D%E6%8E%A7%E5%88%B6

参考

https://my.oschina.net/dxqr/blog/524795
⚠️ **GitHub.com Fallback** ⚠️