水平拆分实现 - 按月分片

MyCat Nicholas 2018-11-28 412浏览
相关标签: MyCat

image.png

表 tdate 的数据水平分布在3 个数据库上

新建3个数据库:

CREATE DATABASE db1;
CREATE DATABASE db2;
CREATE DATABASE db3;

每个数据库新建表:

CREATE TABLE `tdate` (
   `id` INT(11) NOT NULL,
   `createdate` DATETIME DEFAULT NULL,
   PRIMARY KEY (`id`)
) ENGINE=INNODB DEFAULT CHARSET=utf8;


schema.xml 配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://org.opencloudb/">
    <schema name="mycat" checkSQLschema="true" sqlMaxLimit="100">
        <table name ="t_user" primaryKey="user_id" dataNode="dn1,dn2" rule="rule1" />
        <table name ="t_node" autoIncrement="true" primaryKey="vid" dataNode="dn1,dn2" rule="rule1" />
        <table name ="t_area" type="global" primaryKey="ID" dataNode="dn1,dn2" />
        <table name ="tdate" primaryKey="id" dataNode="dne$1-3" rule="sharding-by-month" />
    </schema>

    <dataNode name="dn1" dataHost="jdbchost1" database="mycat_node1" />
    <dataNode name="dn2" dataHost="jdbchost2" database="mycat_node1" />
    <dataNode name="dne1" dataHost="jdbchost1" database="db1" />
    <dataNode name="dne2" dataHost="jdbchost1" database="db2" />
    <dataNode name="dne3" dataHost="jdbchost1" database="db3" />

    <dataHost name="jdbchost1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select 1</heartbeat>
        <writeHost host="db195" url="192.168.1.195:3306" user="root" password="zhujie1986">
            <readHost host="db18" url="192.168.1.18:3310" user="root" password="zhujie1986" />
        </writeHost>
    </dataHost>
    <dataHost name="jdbchost2" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
        <heartbeat>select 1</heartbeat>
        <writeHost host="db1806" url="192.168.1.18:3306" user="root" password="zhujie1986"/>
    </dataHost>
</mycat:schema>


rule.xml 配置

<tableRule name="sharding-by-month">
    <rule>
        <columns>createdate</columns>
        <algorithm>partbymonth</algorithm>
    </rule>
</tableRule>
<function name="partbymonth" 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>


数据入库:

mysql> insert into tdate(id,createdate) values(1,'2015-01-01 00:00:00');
Query OK, 1 row affected (0.10 sec)
mysql> insert into tdate(id,createdate) values(2,'2015-04-01 00:00:00');
Query OK, 1 row affected (0.00 sec)
mysql> insert into tdate(id,createdate) values(3,'2015-02-01 00:00:00');
Query OK, 1 row affected (0.01 sec)
mysql> insert into tdate(id,createdate) values(4,'2015-03-01 00:00:00');
Query OK, 1 row affected (0.01 sec)
mysql> insert into tdate(id,createdate) values(11,'2016-02-01 00:00:00');
ERROR 1064 (HY000): Index: 4, Size: 4
mysql> insert into tdate(id,createdate) values(11,'2014-02-01 00:00:00');
ERROR 1064 (HY000): -11

根据以上schema.xml 配置,数据将从 2015-01-01 00:00:00 开始进行分片,到 2015-04-01 00:00:00 (包含2015-04 的数据)结束分片;

大于设置的时间,插入报错 ERROR 1064 (HY000): Index: 4, Size: 4

小于设置的时间,插入报错 ERROR 1064 (HY000): -11

如要增加分片时间设置,需修改 schema.xml 文件,重启 mycat,否则报错

mysql> insert into tdate(id,createdate) values(11,'2016-02-01 00:00:00');
ERROR 1064 (HY000): can't find table define in schema TDATE schema:mycat

有多少个月,就要分多少个片。如果要以循环分片的写法,比如

    <dataNode name="dne1" dataHost="jdbchost1" database="db1" />
    <dataNode name="dne2" dataHost="jdbchost1" database="db2" />
    <dataNode name="dne3" dataHost="jdbchost1" database="db3" />
    <dataNode name="dne4" dataHost="jdbchost1" database="db1" />
    <dataNode name="dne5" dataHost="jdbchost1" database="db2" />
    <dataNode name="dne6" dataHost="jdbchost1" database="db3" />

数据插入是没有问题的,而且 1月份,4月份的数据都会插入到分片1 中,但是通过mycat 查询则会重复出现一份数据。

是分别查出来 节点1 节点4 结果之后,再次 union 的

相关标签: MyCat
相关文章
1. 问题:分表的自增主键重复 现象: 对point_msg_his和broadcast_msg_his表进行了分表操作,该表有自增主键id,分表键使用的是其他字段。 在sqlmap中的insert语句: <!--table insert--> <insert id="insert" parameterClass="pointMsgHisDO" > insert into&nb继续阅读>>
2018-12-01 600浏览 2个赞
分片规则: 1:官方建议是做成MyCAT Cluster  ,但是测试环境中开启两个MyCAT,会有时而连不上的问题; 2:MyCAT 在修改配置文件之后,可以通过 reload @@config ,在不重启的情况下更新配置:比如修改schema.xml  <table /> <dataNode /> <dataHost />,server.xml 。但是在管理端口看不到修改后的配置信息。 3:对节点、表的扩展操作可以执继续阅读>>
2018-11-28 347浏览 0个赞
数据库配置方式: 在数据库中建立一张表,存放sequence 名称(name) sequence 当前值(current-value),步长(increment int 类型每次读取多少个 sequence,假设为 K)等信息 创建全局序列表: CREATE TABLE MYCAT_SEQUENCE     (`name` VARCHAR(50) NOT NULL,    继续阅读>>
2018-11-28 288浏览 0个赞
表 tdate 的数据水平分布在3 个数据库上 新建3个数据库: CREATE DATABASE db1; CREATE DATABASE db2; CREATE DATABASE db3; 每个数据库新建表: CREATE TABLE `tdate` (    `id` INT(11) NOT NULL,   &nbs继续阅读>>
2018-11-28 411浏览 0个赞
水平拆分:通俗来讲就是将大表按行还拆分 在一般的应用系统中,用户表及其密切相关的关联表,可根据“用户表”(eg:t_user)中的“用户ID”(user_id)进行水平切分,并基于MyCAT的E-R关系分片策略将其密切相关的表(eg:t_user_class_rel)也分到对应的库中。 多(2)实例实现水平拆分:192.168.1.195:3306、192.168.1.18:3306 在每个实例上新建库、表: CREATE DATABAS继续阅读>>
2018-11-28 259浏览 1个赞
垂直切分即常说的分库,降低数据库耦合性。可以配置同一个实例下不同库,不同实例下不同库 schema.xml 配置 <?xml version="1.0"?> <!DOCTYPE mycat:schema SYSTEM "schema.dtd"> <mycat:schema xmlns:mycat="http://org.opencloudb/"> 继续阅读>>
2018-11-28 184浏览 0个赞
1、安装 JAVA 环境,必须是 JDK7 或更高版本 yum search JDK yum install java-1.7.0 java -version     java version "1.7.0_95"     OpenJDK Runtime Environment (rhel-继续阅读>>
2018-11-28 287浏览 2个赞
版权声明
本站的文章和资源来自互联网或者站长的原创。如果有侵犯版权的资源请尽快联系站长,我们会在24h内删除有争议的资源。