otter数据同步,文件同步
一、使用背景
因为业务的特性,站长主要集中在国内,客户主要集中在国外,需要国内和美国异地机房的需求,同时为了提升用户体验,整个机房的架构为双A,两边均可写。
网上很多同步数据库的博客,同步文件的没有;
二、otter搭建教程:
百度很多,我的参考是:https://www.bbsmax.com/A/D854rqvYzE/
三、otter文件同步(图片、excel、world等)
首先解释一下文件同步的需求,阿里巴巴国际站业务,主要模式为对外贸易,卖家基本在国内,买家在国外. 所以,目前我们的机房部署为杭州和美国各一个,卖家访问杭州机房,买家访问美国机房。卖家在国内发布产品和图片,通过otter同步到美国,同步产品数据记录的同时,同样需要把图片同步过去,保证买家用户的访问体验. 所以,基于这个业务场景,衍生出了文件同步的需求.
所以,做文件同步的几个前提:
异地同步 (需要部署为两个node,S/E和T/L分为两地. )
数据触发文件同步 (数据库记录做为类似文件索引信息,不支持单独同步文件)
本地文件同步 (需要同步的文件需要和node部署在一台机器上或者通过nfs mount,如果要同步 公司自带的分布式文件系统的数据,otter需要做额外扩展)
文件同步准备工作:
- 准备两台机器,分别部署上两个node
- 配置channel/pipeline同步,配置映射规则
- 编写FileResolver解析类,根据binlog中的变更数据,转化为文件的路径信息
举例:
package com.alibaba.otter.node.extend.fileresolver; import java.util.Map; import org.apache.commons.lang.StringUtils; import com.alibaba.otter.shared.etl.extend.fileresolver.FileInfo; public class TestFileResolver extends AbstractFileResolver { public FileInfo[] getFileInfo(Map<String, String> rowMap) { // 基本步骤: // 1. 获取binlog中的变更字段,比如组成文件有多个字段组成version+path // 2. 基于字段内容,构造一个文件路径,目前开源版本只支持本地文件的同步.(如果是网络文件,建议进行NFS mount到ndde机器). // 3. 返回FileInfo数组,(目前不支持目录同步,如果是目录需要展开为多个FileInfo的子文件),如果不需要同步,则返回null. String path = rowMap.get("FIELD"); //注意为大写 FileInfo fileInfo = null; if (StringUtils.isNotEmpty(path)) { fileInfo = new FileInfo(path); return new FileInfo[] { fileInfo }; } else { return null; } } }
注意:1、“FIELD” 为当前数据库的字段大写,且字段不能有下划线
2、FileInfo类为阿里封装和Java中的File类不可通用,可以用File类对文件进行删除、重命名等操作
3、文件路径字段名不发生改变,是无法覆盖原有文件的,可以用重命名的方式曲线解决不覆盖的问题
四、配置方式
五、错误解决
- 报错信息
pid:3 nid:3 exception:setl:java.lang.NullPointerException
解决:1、文件路径错误,文件不存在;2、文件权限不够
- 报错信息
pid:4 nid:4
exception:setl:com.alibaba.otter.shared.common.utils.extension.exceptions.ExtensionLoadException:
ERROR ## classload this fileresolver=[package
com.alibaba.otter.node.extend.fileresolver;
解决:更改File Resolver的类型为SOURCE