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类的属性写入函数,也就是setDefaultNode。
这样当数据超过范围后,节点0中的表就会有数据,发现后,可以新增节点,再将节点0中的数据dump过去就好了。
106088787
106088787
版权声明:本文为博主原创文章,未经博主允许不得转载。
4713

被折叠的 条评论
为什么被折叠?



