otter数据同步,文件同步

@高效码农  February 27, 2020

一、使用背景

因为业务的特性,站长主要集中在国内,客户主要集中在国外,需要国内和美国异地机房的需求,同时为了提升用户体验,整个机房的架构为双A,两边均可写。

网上很多同步数据库的博客,同步文件的没有;

二、otter搭建教程:

百度很多,我的参考是:https://www.bbsmax.com/A/D854rqvYzE/

三、otter文件同步(图片、excel、world等)

首先解释一下文件同步的需求,阿里巴巴国际站业务,主要模式为对外贸易,卖家基本在国内,买家在国外. 所以,目前我们的机房部署为杭州和美国各一个,卖家访问杭州机房,买家访问美国机房。卖家在国内发布产品和图片,通过otter同步到美国,同步产品数据记录的同时,同样需要把图片同步过去,保证买家用户的访问体验. 所以,基于这个业务场景,衍生出了文件同步的需求.

所以,做文件同步的几个前提:

异地同步 (需要部署为两个node,S/E和T/L分为两地. )
数据触发文件同步 (数据库记录做为类似文件索引信息,不支持单独同步文件)
本地文件同步 (需要同步的文件需要和node部署在一台机器上或者通过nfs mount,如果要同步 公司自带的分布式文件系统的数据,otter需要做额外扩展)
文件同步准备工作:

  1. 准备两台机器,分别部署上两个node
  2. 配置channel/pipeline同步,配置映射规则
  3. 编写FileResolver解析类,根据binlog中的变更数据,转化为文件的路径信息
  4. 举例:

      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、文件路径字段名不发生改变,是无法覆盖原有文件的,可以用重命名的方式曲线解决不覆盖的问题

四、配置方式

2020-02-27T02:27:18.png

五、错误解决

  1. 报错信息
pid:3 nid:3 exception:setl:java.lang.NullPointerException

解决:1、文件路径错误,文件不存在;2、文件权限不够

  1. 报错信息
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



评论已关闭

  1. [...]具体同步操作流程步骤请移步:https://www.xugj520.cn/archives/otter.html[...]

  2. 有问题可在首页右侧关于博主联系

    1. 柳豪
      @高效码农

      您好,感谢您的文献分享,看到第二章节中otter manager数据库建表语句有个疑问,联合索引例如KEY `idx_PipelineID_GmtModified_ID` (`PIPELINE_ID`,`GMT_MODIFIED`,`ID`),对于MySQL innodb我记得联合索引不需要指定本身ID吧,innodb的索引中隐含主键了吧好像,小白问题勿怪。