Mycat范围分片设置默认分片

MyCat范围分片设置默认分片

最近使用mycat,数据设计不满足字段枚举分片的条件,于是使用 autopartition-long 分片。
有个问题,数据超过范围,怎么办?mycat一直报错,我不可能事先预知数据即将超过范围分片设置的范围。
mycat群106088787 有个叫武的群友,使用了枚举分片自动扩容,参考了其思想,我改写了范围分片
org.opencloudb.route.function.AutoPartitionByLong源文件
@Override
	public Integer calculate(String columnValue) {
		long value = Long.valueOf(columnValue);
		Integer rst = null;
		for (LongRange longRang : this.longRongs) {
			if (value <= longRang.valueEnd && value >= longRang.valueStart) {
				return longRang.nodeIndx;
			}
		}
		if(rst ==null && defaultNode>=0){
			return defaultNode ;
		}
		return rst;
	}
在rule.xml中,分片函数新加了一个属性配置
   <function name="rang-long" class="org.opencloudb.route.function.AutoPartitionByLong">
    <property name="mapFile">autopartition-long.txt</property>
	<property name="defaultNode">0</property>
  </function>

这个属性配置了默认节点0,所以0预留出来了,在autopartition-long.txt中
# range start-end ,data node index
# K=1000,M=10000.
0-500K=1
500K-1000K=2
1000K-1500K=3

节点索引从1开始。
 
不用担心org.opencloudb.route.function.AutoPartitionByLong更改会有问题
org.opencloudb.config.loader.xml.XMLRuleLoader加载rule.xml的时候,
private void loadFunctions(Element root) throws ClassNotFoundException,
			InstantiationException, IllegalAccessException,
			InvocationTargetException {
.....
ParameterMapping.mapping(function, ConfigUtil.loadElements(e));
.....
}

ParameterMapping.mapping中,处理了rule.xml function的子节点property
 if (cls != null) {
                if (value != null) {
                    Method method = pd.getWriteMethod();
                    if (method != null) {
                        method.invoke(object, new Object[] { value });
                    }
                }
            }

通过java 反射调用了 AutoPartitionByLong类的属性写入函数,也就是setD efaultNode。
 
这样当数据超过范围后,节点0中的表就会有数据,发现后,可以新增节点,再将节点0中的数据dump过去就好了。
106088787
106088787

版权声明:本文为博主原创文章,未经博主允许不得转载。

你可能感兴趣的:(mysql,Mycat)