博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
数据库路由中间件MyCat - 使用篇(4)
阅读量:7221 次
发布时间:2019-06-29

本文共 3639 字,大约阅读时间需要 12 分钟。

此文已由作者张镐薪授权网易云社区发布。

欢迎访问,了解更多网易技术产品运营经验。

配置MyCat

3. 配置conf/rule.xml

1.5GA版本中的规则配置比较笨,2.0中优化了一些,将tableRule标签和function标签合并了,并且支持Velocity模板语言,更加灵活。这里先介绍1.5GA的,2.0等以后稳定了,会推的:

id
mod-long
2
复制代码
  • tableRule标签(多个表可以对应一个表规则)

    • name 属性指定唯一的名字,用于标识不同的表规则。 内嵌的rule标签则指定对物理表中的哪一列进行拆分和使用什么路由算法。

    • columns 内指定要拆分的列名字。

    • algorithm 使用function标签中的name属性。连接表规则和具体路由算法。当然,多个表规则可以连接到同一个路由算法上。

  • function标签

    • name 指定算法的名字。

    • class 制定路由算法具体的类名字。

    • property 为具体算法需要用到的一些属性。 上面的例子有一个表规则,对应一个算法,是MyCat1.5GA中内置的算法。我们也可以实现自己的算法。 这里配置文件实现的原理,其实就是反射,MyCat动态加载里面的规则,并动态设置class中的filed的值。 分片规则涉及到的类(算法实现类不完整)图:

RuleAlgorithm :路由规则接口抽象,规定了分片规则的初始化(init),路由分片计算(calculate),及路由多值分片计算(calculateRange)。 分片规则中calculate方法是基本的分片路由计算方法,根据分片字段值,计算出分片。 分片规则中calculateRange方法是范围查询时分片计算,即如果查询类似: select * from t_user t where t.id<100; 需要解析出指定范围的所有值对应分片。 自定义的分片规则只需要继承AbstractPartitionAlgorithm,按照自己的规则初始化配置文件(即正在介绍的rule.xml),并且实现calculate或者calculateRange方法即可。 AbstractPartitionAlgorithm是一个抽象类,只实现了多值路由计算。并且,根据下面的代码我们可以了解到路由算法必须继承AbstractPartitionAlgorithm

AbstractPartitionAlgorithm.java:

public abstract class AbstractPartitionAlgorithm implements RuleAlgorithm {    @Override    public void init() {    }    /**     * 返回所有被路由到的节点的编号     * 返回长度为0的数组表示所有节点都被路由(默认)     * 返回null表示没有节点被路由到     */    @Override    public Integer[] calculateRange(String beginValue, String endValue) {        return new Integer[0];    }    /**     * 对于存储数据按顺序存放的字段做范围路由,可以使用这个函数     * @param algorithm     * @param beginValue     * @param endValue     * @return     */    public static Integer[] calculateSequenceRange(AbstractPartitionAlgorithm algorithm, String beginValue, String endValue) {        Integer begin = 0, end = 0;        begin = algorithm.calculate(beginValue);        end = algorithm.calculate(endValue);        if(begin == null || end == null){            return new Integer[0];        }        if (end >= begin) {            int len = end-begin+1;            Integer [] re = new Integer[len];            for(int i =0;i

下面看看PartitionByMod的源代码: org.opencloudb.route.function.PartitionByMod:

private int count;    @Override    public void init() {    }    public void setCount(int count) {        this.count = count;    }    @Override    public Integer calculate(String columnValue) {        BigInteger bigNum = new BigInteger(columnValue).abs();        return (bigNum.mod(BigInteger.valueOf(count))).intValue();    }复制代码

这段代码很简单,就是将列的值传入后,对count取模,之后的值就是分片节点id。分片节点个数就是count。查看rule.xml里面的配置,我们在function标签传入了count值,并且在tableRule标签定义是哪一列作为分片字段。 可以优化下这段代码,根据习惯,我们一般取2的n次方作为分片个数(这样做有很多好处)。对2的n次方取模等于对2的n次方-1取与运算。代码如下:

private int count;    private boolean watch = false;    @Override    public void init() {    }    public void setCount(int count) {        this.count = count;        if ((count & (count - 1)) == 0) {            watch = true;        }    }    @Override    public Integer calculate(String columnValue) {        BigInteger bigNum = new BigInteger(columnValue).abs();        if (watch) {            System.out.println("sigoui");            return bigNum.intValue() & (count - 1);        }        return (bigNum.mod(BigInteger.valueOf(count))).intValue();    }复制代码

下面我们更深入些,实现使用篇(2)中的7.多重规则-可扩容哈希路由:是从分片字段中抽取一段做分片路由,再取另一段做自动哈希分片。同时再规定某个范围内是某个分片规则,另一范围是另一个分片规则。 通过读取外部规则配置文件scalable-route-hash.txt,来实现灵活的规则配置。增加规则时,修改scalable-route-hash.txt之后在9066端口的控制台动态加载即可(之后会介绍)。 scalable-route-hash.txt:

北京(A0000000~A9999999)=0,1,2,3,4北京(B0000000)=5,6,7,8,9上海(00000000~10000000)=10,11上海=10,11,12,13,14,15复制代码

更多网易技术、产品、运营经验分享请。

相关文章:

【推荐】
【推荐】
【推荐】

转载地址:http://xpxym.baihongyu.com/

你可能感兴趣的文章
一段测试代码,哦哦哦,
查看>>
uiimagepickercontroller,中文,--》摘
查看>>
第四次作业
查看>>
在python中调用js或者nodejs
查看>>
【年终总结】2年计划还是要有的,万一实现了呢?(转自叶小钗)
查看>>
数字图像处理学习笔记(1.1)---位图的读写、几何变换、傅里叶变换、直方图均衡...
查看>>
javascript数组顺序-----1冒泡的另一种比较好理解的写法
查看>>
数据结构-栈的实现之行编译器核心实现
查看>>
C++ Project 积累(2)
查看>>
(1)用VisualSvn Server,Tortoise Svn,AnkhSvn搭建Svn版本控制
查看>>
Mysql索引
查看>>
格式化输出
查看>>
hdu 3804 Query on a tree (树链剖分+线段树)
查看>>
定位、指南针、地理编码
查看>>
Kafka 简介
查看>>
MySQL 用户连接与用户线程
查看>>
RabbitMq、ActiveMq、Kafka和Redis做Mq对比
查看>>
C# 图片处理(压缩、剪裁,转换,优化)
查看>>
Linux bridge-utils tunctl 使用
查看>>
Leetcode Pascal&#39;s Triangle II
查看>>