zoukankan      html  css  js  c++  java
  • Mycat 月分片方法

    概述  

    本篇文章主要介绍Mycat以月进行分片的方法,包括配置方法、注意事项等。

    mycat版本:1.4

    数据节点:dn1,dn2,dn3

    架构:主从

    配置  

     创建测试表

    CREATE TABLE `tdate` (
       `id` int(11) NOT NULL,
       `createdate` datetime DEFAULT NULL,
       PRIMARY KEY (`id`)
     ) ENGINE=InnoDB DEFAULT CHARSET=utf8

    在三个节点上面分别执行创建表语句。

    分片配置

    <table>参数 

    在table参数配置中使用了rule="sharding-by-month"分片函数,同时配置了13个数据节点分别是dn1-dn13,当然数据节点的数目没有限制,在生产环境避免重复重启mycat这个节点的范围大小最好配置超过1年。

    <datanode>参数

    因为我这里只有三个节点,所以采取三个节点循环作为数据的保存节点,默认1,4,7,10,第二年1月,这些月份的数据保存在节点1。在生产婚假一般会配置12个节点,这样每年的1月可以存在节点1,

     不支持这样写,datanode中的节点定义一定要和table一样
     <dataNode name="dn1,dn4,dn7,dn10,dn13" dataHost="localhost1" database="db1" />

     <datahost>参数

           datahost配置的是主从读写分离,如果第一个writehost宕机了自动切换到第二个writehost

    分片函数 

    vim rule.xml
    <tableRule name="sharding-by-month">
                    <rule>
                            <columns>createdate</columns>
                            <algorithm>sharding-by-month</algorithm>
                    </rule>
    </tableRule>
    
    <function name="sharding-by-month"
                    class="org.opencloudb.route.function.PartitionByMonth">
                    <property name="dateFormat">yyyy-MM-dd HH:mm:ss</property>
                    <property name="sBeginDate">2015-01-01 00:00:00</property>
    
    </function>

    权威指南默认的自然月分片使用的dateFormat格式是yyyy-MM-dd,在这里我是故意这样测试的。

    注意:如果dateFormat格式是yyyy-MM-dd那么sBeginDate格式就必须是2015-01-01,否则就是上面我配置的这种对应关系。当我使用dateFormat格式是yyyy-MM-dd的时候我在插入语句的createdate字段使用“2015-01-01 00:00:00”格式的时间也可以识别,反之,我配置dateFormat格式是yyyy-MM-dd HH:mm:ss,当我的插入语句的createdate字段使用“2015-01-01”格式的时间会报错,建议函数这里配置的是什么格式在执行插入语句的时候时间也使用什么格式。

    在dateFormat格式是yyyy-MM-dd时分片字段的数据类型可以是date、datetime,在dateFormat格式是yyyy-MM-dd HH:mm:ss是分片字段的数据类型必须是datetime。

    sBeginDate是开始时间

    测试数据

    在mycat中执行插入语句。

    insert into tdate(id,createdate) values(1,'2015-01-01 00:00:00');
    insert into tdate(id,createdate) values(2,'2015-02-01 00:00:00');
    insert into tdate(id,createdate) values(3,'2015-03-01 00:00:00');
    insert into tdate(id,createdate) values(4,'2015-10-01 00:00:00');
    insert into tdate(id,createdate) values(5,'2016-01-01 00:00:00');

    到master中查看数据:

    select * from db1.tdate; 
    select * from db2.tdate; 
    select * from db3.tdate; 

    插入的结果也正常的分布到了各个分片中,测试结果正确。

    注意事项

    1.在进行insert插入时分片字段必须明确在table后面列出,其它的默认字段可以不列出在1.4中不受影响。

    2.values中不能使用函数,例如:now()

    总结

     mycat对月进行分片总体概念比较清晰,但是因为mycat本身对于容错的处理比较弱,所以在sql语句方面使用尽量简单的标准语法。

    备注:

        作者:pursuer.chen

        博客:http://www.cnblogs.com/chenmh

    本站点所有随笔都是原创,欢迎大家转载;但转载时必须注明文章来源,且在文章开头明显处给明链接。

    《欢迎交流讨论》

  • 相关阅读:
    【写一个自己的js库】 5.添加修改样式的方法
    【写一个自己的js库】 4.完善跨浏览器事件操作
    js跑马灯效果
    jquery hover延时
    chart
    【写一个自己的js库】 3.添加几个处理字符串的方法
    【写一个自己的js库】 2.实现自己的调试日志
    django踩坑记录
    单元测试框架unittest-3
    单元测试框架unittest-2
  • 原文地址:https://www.cnblogs.com/chenmh/p/5165636.html
Copyright © 2011-2022 走看看