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
版权声明:本文为博主原创文章,未经博主允许不得转载。