超级链接网站模板,网站开发费,建筑建设网站,园艺wordpress模板枚举分片之前的《mycat字符串枚举分片示例》中已经介绍过。
使用这种分片策略之后碰到了一个问题#xff1a; 场景#xff1a; 使用连锁店的店铺编号枚举分片#xff08;第1至第100分布店分在第一个分片#xff0c;第101至第250分店#xff09;#xff0c;全国的连锁店会…枚举分片之前的《mycat字符串枚举分片示例》中已经介绍过。
使用这种分片策略之后碰到了一个问题 场景 使用连锁店的店铺编号枚举分片第1至第100分布店分在第一个分片第101至第250分店全国的连锁店会不断增加。在还没有来得及往配置文件中配置新的店铺编号时新店铺的数据无法插入到mycat中mycat会抛出异常cant find datanode for sharding column:SHOP_NO val:SHOP1002 而且店铺可能今天加一个新店明天再加一个新店难道维护人员每天来给你修改这个枚举店铺编号的配置文件 解决办法 不识别的枚举值路由到一个默认的节点这样mycat将新店铺的数据全部插入到默认节点。当不识别的店铺编号达到一定的数量后比如新增了1000个店铺后新增一个数据节点将默认节点上的那1000个店铺的数据整体迁移到新节点上。枚举分片的迁移非常容易两个命令搞定 1、默认节点的mysql服务器上执行导出
mysqldump -uroot -p123456 databasename shop --where shop_no in (shop1001,shop1002.....,shop2000) /data/shop.sql 2、新节点的mysql服务器上执行导入
mysql -uroot -p123456 databasename /data/shop.sql 修改的代码 为了支持该方案对org.opencloudb.route.function.PartitionByFileMap类做修改增加一个属性
defaultNode如下 /*** 默认节点:小于0表示不设置默认节点大于等于0表示设置默认节点* * 默认节点的作用枚举分片时如果碰到不识别的枚举值就让它路由到默认节点* 如果不配置默认节点defaultNode值小于0表示不配置默认节点碰到* 不识别的枚举值就会报错* like thiscant find datanode for sharding column:column_name val:ffffffff */private int defaultNode -1;
defaultNode的默认值为-1表示不配置默认节点如果要配置默认节点需要从配置文件配置defaultNode的值一般是从rule.xml中配置
function namesharding-by-string-enumFunc classorg.opencloudb.route.function.PartitionByFileMapproperty namemapFilepartition-by-shop_no-enum.txt/propertyproperty nametype1/propertyproperty namedefaultNode0/property !-- 表示默认节点为第一个节点 --
/function
private void initialize() 方法根据defaultNode的值往map中增加defaultNode
//设置默认节点
if(defaultNode 0) {app2Partition.put(DEFAULT_NODE, defaultNode);
}
public Integer calculate(String columnValue) 方法
Integer pid app2Partition.get(value);
if (pid ! null) {rst pid;
} else {rst app2Partition.get(DEFAULT_NODE);
}
return rst;