问题现象
因为游戏公司在开始会设计多款游戏,所以开始的时候架构并不是很完美,久而久之,随着数据量越来越大,就会需要将数据进行拆分,但是如果游戏火起来,可能会需要进行多次拆分,每次拆分需要将数据进行拆分导出导入到新的数据库,确实很麻烦,所以基于这个背景,再加上之前博主用过otter同步数据,所以衍生一个想法,能否用otter进行同步过滤到后端多个数据库,经过我的测试发现是可以实现这样的功能的,也算是给大家提供一个拆分数据思路。
实验结果
在同步关系的Event Processor选择source
然后在Event Processor文本中嵌入下面的代码
package com.alibaba.otter.node.extend.processor;
import com.alibaba.otter.shared.etl.model.EventColumn;
import com.alibaba.otter.shared.etl.model.EventData;
import org.apache.commons.lang.StringUtils;
public class TestEventProcessor extends AbstractEventProcessor {
public boolean process(EventData eventData) {
//isHandle就是用来控制该条数据是否需要进行同步
boolean isHandle = false;
//这里的sbtest1是要进行分表数据的表名
if(StringUtils.equals("sbtest1", eventData.getTableName())){
//这里的k是对应的列名。需要根据哪个列名进行数据分片规则
EventColumn eventColumn = getColumn(eventData , "k");
//eventColumn.getColumnValue())%10这是一种简单的取模规则
//也可以自己重写规则,我这里就是把k列末位位0的数据同步到后端数据库中
//如果要拆分到10个表中,可以采用otter批量建立同步关系的方法,可以自行百度
if((Integer.parseInt(eventColumn.getColumnValue())%10) == 0){
isHandle =true;
}
}
return isHandle;
}
}
总结
通过otter工具的使用,可以减少很大的人力消耗以及时间投入,毕竟开发一个DTS工具是很麻烦的。