-
Notifications
You must be signed in to change notification settings - Fork 2.5k
Manager配置介绍
演示视频(5分钟教你配置一个同步任务):请点击图片或者这里
演示说明:
1. 搭建一个数据库同步任务,源数据库ip为:10.20.144.25,目标数据库ip为:10.20.144.29. 源数据库已开启binlog,并且binlog_format为ROW.
mysql> show variables like '%binlog_format%'; +---------------+-------+ | Variable_name | Value | +---------------+-------+ | binlog_format | ROW | +---------------+-------+
2. 数据同步精确到一张表进行测试,测试的表名为test.example,简单包含两个子段,测试过程中才创建.
3. 配置完成后,手动在源库插入数据,然后快速在目标库进行查看数据,验证数据是否同步成功.
-------视频中的演示文本:
CREATE TABLE `test`.`example` ( `id` int(11) NOT NULL AUTO_INCREMENT, `name` varchar(32) COLLATE utf8_bin DEFAULT NULL , PRIMARY KEY (`ID`) ) ENGINE=InnoDB DEFAULT CHARSET=utf8; insert into test.example(id,name) values(null,'hello'); ----- Otter QuickStart 如何配置一个任务 ----- 操作步骤: 1. 添加数据库 a. 源库 jdbc:mysql://10.20.144.25:3306 b. 目标库 jdbc:mysql://10.20.144.29:3306 2. 添加canal a. 提供数据库ip信息 3. 添加同步表信息 a. 源数据表 test.example b. 目标数据表 test.example 4. 添加channel 5. 添加pipeline a. 选择node节点 b. 选择canal 6. 添加同步映射规则 a. 定义源表和目标表的同步关系 7. 启动 8. 测试数据
单向同步为最基本的同步方式,目前支持mysql -> mysql/oracle的同步.
基本配置方式就如操作视频中所演示的,操作步骤:
- 配置一个channel
- 配置一个pipeline
对应node机器选择时,建议遵循:S/E节点选择node需尽可能离源数据库近,T/L节点选择node则离目标数据库近. 如果无法提供双节点,则选择离目标数据库近的node节点相对合适. - 配置一个canal
- 定义映射关系.
canal中配置解析的数据库ip需要和映射关系中源表对应的数据库ip一致. ps. 映射关系进行匹配的时候是基于表名,虽然数据库ip不匹配也会是有效.
双向同步可以理解为两个单向同步的组合,但需要额外处理避免回环同步. 回环同步算法: 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,定义映射关系
双A同步相比于双向同步,主要区别是双A机房会在两地修改同一条记录,而双向同步只是两地的数据做互相同步,两地修改的数据内容无交集.
所以双A同步需要额外处理数据同步一致性问题. 同步一致性算法:Otter数据一致性 ,目前开源版本主要是提供了单向回环补救的一致性方案.
双A同步相比于双向同步,整个配置主要是一些参数上有变化,具体步骤:
- 配置一个channel
- 配置两个pipeline
- 每个pipeline各自配置canal,定义映射关系
单向同步/双向同步,都是针对一个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进行匹配,就会忽略此同步.
基于以上的单向/双向/双A/级联同步,可以随意搭建出多A同步,不过目前受限于同步数据的一致性算法,只能通过星形辐射,通过级联同步的方式保证全局多A机房的数据一致性.
比如图中B和C之前的一致性同步,需要通过主站点A来保证.
主要功能是在不修改原始表数据的前提下,触发一下数据表中的数据同步。
可用于:
- 同步数据订正
- 全量数据同步. (自 由 门触发全量,同时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)
- 同步一致性. ==> 基于数据库反查(根据binlog反查数据库),基于当前变更(binlog数据)。针对数据库反查,在延迟比较大时比较有效,可将最新的版本快速同步到目标,但会对源库有压力.
- 同步模式. ==> 行模式,列模式。行模式特点:如果目标库不存在记录时,执行插入。列模式主要是变更哪个字段,只会单独修改该字段,在双A同步时,为减少数据冲突,建议选择列模式。
- 是否开启数据一致性. ==> 请查看数据一致性文档:Otter数据一致性
a. 数据一致性算法
b. 一致性反查数据库延迟阀值
- 并行度. ==> 查看文档:Otter调度模型,主要是并行化调度参数.(滑动窗口大小)
- 数据反查线程数. ==> 如果选择了同步一致性为反查数据库,在反查数据库时的并发线程数大小
- 数据载入线程数. ==> 在目标库执行并行载入算法时并发线程数大小
- 文件载入线程数. ==> 数据带文件同步时处理的并发线程数大小
- 主站点. ==> 双A同步中的主站点设置
- 消费批次大小. ==> 获取canal数据的batchSize参数
- 获取批次超时时间. ==> 获取canal数据的timeout参数
- 使用batch. ==> 是否使用jdbc batch提升效率,部分分布式数据库系统不一定支持batch协议
- 跳过load异常. ==> 比如同步时出现目标库主键冲突,开启该参数后,可跳过数据库执行异常
- 仲裁器调度模式. ==> 查看文档:Otter调度模型
- 负载均衡算法. ==> 查看文档:Otter调度模型
- 传输模式. ==> 多个node节点之间的传输方式,RPC或HTTP. HTTP主要就是使用aria2c,如果测试环境不装aria2c,可强制选择为RPC
- 记录selector日志. ==> 是否记录简单的canal抓取binlog的情况
- 记录selector详细日志. ==> 是否记录canal抓取binlog的数据详细内容
- 记录load日志. ==> 是否记录otter同步数据详细内容
- dryRun模式. ==> 只记录load日志,不执行真实同步到数据库的操作
- 支持ddl同步. ==> 是否同步ddl语句
- 是否跳过ddl异常. ==> 同步ddl出错时,是否自动跳过
- 文件重复同步对比 ==> 数据带文件同步时,是否需要对比源和目标库的文件信息,如果文件无变化,则不同步,减少网络传输量.
- 文件传输加密 ==> 基于HTTP协议传输时,对应文件数据是否需要做加密处理
- 启用公网同步 ==> 每个node节点都会定义一个外部ip信息,如果启用公网同步,同步时数据传递会依赖外部ip.
- 跳过自 由 门数据 ==> 自定义数据同步的内容
- 跳过反查无记录数据 ==> 反查记录不存在时,是否需要进行忽略处理,不建议开启.
- 启用数据表类型转化 ==> 源库和目标库的字段类型不匹配时,开启改功能,可自动进行字段类型转化
- 兼容字段新增同步 ==> 同步过程中,源库新增了一个字段(必须无默认值),而目标库还未增加,是否需要兼容处理
- 自定义同步标记 ==> 级联同步中屏蔽同步的功能.
- 数据源信息
单库配置: 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; (分号分隔) - 数据库帐号
- 数据库密码
- connectionCharset ==> 获取binlog时指定的编码
- 位点自定义设置 ==> 格式:{"journalName":"","position":0,"timestamp":0};
指定位置:{"journalName":"","position":0};
指定时间:{"timestamp":0}; - 内存存储batch获取模式 ==> MEMSIZE/ITEMSIZE,前者为内存控制,后者为数量控制. 针对MEMSIZE模式的内存大小计算 = 记录数 * 记录单元大小
- 内存存储buffer记录数
- 内存存储buffer记录单元大小
- HA机制
- 心跳SQL配置 ==> 可配置对应心跳SQL,如果配置 是否启用心跳HA,当心跳SQL检测失败后,canal就会自动进行主备切换.
- 机器名称 ==> 自定义名称,方便记忆
- 机器ip ==> 机器外部可访问的ip,不能选择127.0.0.1
- 机器端口 ==> 和manager/node之间RPC通讯的端口
- 下载端口 ==> 和node之间HTTP通讯的端口
- 外部Ip ==> node机器可以指定多IP,通过pipeline配置决定是否启用
- zookeeper集群 ==> 就近选择zookeeper集群
- 集群名字 ==> 自定义名称,方便记忆
- zookeeper集群 ==> zookeeper集群机器列表,逗号分隔,最后以分号结束
- group Key ==> 自定义名称,otter其他地方基于该名称进行引用
- master / slave ==> 主备库ip信息
生成了groupKey,1. 可以在数据库配置时,设置url:jdbc:mysql://groupKey=key (更改 key). 2. 在canal配置时,选择HA机制为media,可填入该groupKey进行引用