1.按月分片的概念

1.按月分片的概念

按照日期进行分片,单位为月,根据设置的规则属性,例如1个月分一次表。

设置分片规则属性时,指定开始日期和结束日期,虽然指定了范围,但是范围不妨碍后期的数据,即使我们指定了范围是1月-3月,后期有5月的数据依旧可以正常写入。

设置了按月分片后,1月的数据写入到分片1,2月的数据写入到分片2,3月的数据写入分片3,4月的数据写入分片1。

注意按月分片最少需要三个分片节点,否则将会报错。

第114讲:Mycat实践指南:按照单位为月的日期实现水平分表-LMLPHP

2.按照天数对某张表进行水平拆分

2.1.在所有的分片节点中创建表结构

分片依旧是2个,还是之前垂直分库分表时使用的两套双主双从集群。

#在分片1节点中创建表结构
[root@mysql-1 ~]# mysql -uroot -p123456 -P3306 -h 192.168.20.11
mysql> use db_2;
mysql> create table tb_monthpart (id int,name varchar(10),create_time date);


#在分片2节点中创建表结构
[root@mysql-1 ~]# mysql -uroot -p123456 -P3307 -h 192.168.20.11
mysql> use db_2;
mysql> create table tb_monthpart (id int,name varchar(10),create_time date);

2.2.配置Mycat实现字符串按月分片的水平分表

2.2.1.配置Schema配置文件
[root@mysql-1 ~]# vim /data/mycat/conf/schema.xml
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">  
<mycat:schema xmlns:mycat="http://io.mycat/">
         <!--定义逻辑库 库名叫做db_shopping 该逻辑库关联dn1这个数据节点-->
        <schema name="db_2" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1">
       		<!-- 按月分片 -->
            <table name="tb_monthpart" dataNode="dn1,dn2,dn3" rule="sharding-by-month" />
        </schema>  

        <!--定义数据节点 也就是分片 一个分片会关联一个数据主机组 然后对应真实的数据库名称-->
        <dataNode name="dn1" dataHost="mysqlcluster-1" database= "db_2" />          
        <dataNode name="dn2" dataHost="mysqlcluster-2" database= "db_2" />          
        <dataNode name="dn3" dataHost="mysqlcluster-1" database= "db_2" />            

        <!--定义数据主机 在这个标签下定义具体的读写操作路由的数据库实例地址 schema、table划分如何指定的是该数据主机关联的数据节点 那么对应的库、表都会被存储在数据主机定义的数据库实例中-->
        <dataHost name="mysqlcluster-1" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql"  dbDriver="native" switchType="1">    
                <heartbeat>select user()</heartbeat>  
                <!--定义写操作路由的数据库实例-->
                <writeHost host="c1-1-master3306" url="192.168.20.11:3306" user="root" password="123456">
                        <!--定义读操作路由的数据库实例-->
                        <readHost host="c1-1-slave3308" url="192.168.20.11:3308" user="root" password="123456" />
                </writeHost> 
                <!--备用的主库 也是提供写操作的数据库,当主库c1-1-master3306故障后 备用库开始提供写操作-->
                <writeHost host="c1-2-master3306" url="192.168.20.12:3306" user="root" password="123456">
                        <!--备用主库的从库 从始至终 只要备用主库不故障 会一直提供读服务-->
                        <readHost host="c1-2-slave3308" url="192.168.20.12:3308" user="root" password="123456" />
                </writeHost> 
        </dataHost>  

        <dataHost name="mysqlcluster-2" maxCon="1000" minCon="10" balance="1"  writeType="0" dbType="mysql"  dbDriver="native" switchType="1">    
                <heartbeat>select user()</heartbeat>  
                <writeHost host="c2-1-master3307" url="192.168.20.11:3307" user="root" password="123456">
                        <readHost host="c2-1-slave3309" url="192.168.20.11:3309" user="root" password="123456" />
                </writeHost> 
                <!--备用主库db3 主库db1故障后 开始提供写操作-->
                <writeHost host="c2-2-master3307" url="192.168.20.12:3307" user="root" password="123456">
                        <!--备用主库的从库 从始至终 只要备用主库不故障 会一直提供读服务-->
                        <readHost host="c2-2-slave3309" url="192.168.20.12:3309" user="root" password="123456" />
                </writeHost> 
        </dataHost>  

</mycat:schema>
2.2.2.配置Rule分片规则配置文件
[root@mysql-1 ~]# vim /data/mycat/conf/rule.xml
    <tableRule name="sharding-by-month"> 
        <rule>
            <columns>create_time</columns>
            <algorithm>partbymonth</algorithm>
        </rule>
    </tableRule>

    <function name="partbymonth" class="io.mycat.route.function.PartitionByDate">
        <!--定义日期格式-->
        <property name="dateFormat">yyyy-MM-dd</property>
        <!--定义按月分表的开始日期-->
        <property name="sBeginDate">2022-01-01</property>
        <!--定义按月分表的结束日期-->
        <property name="sEndDate">2022-03-31</property>
    </function>    
2.2.3.配置Server配置文件
[root@mysql-1 ~]# vim /data/mycat/conf/server.xml
    <user name="root" defaultAccount="true">
        <!--登录用户的密码-->
        <property name="password">123456</property>
        <!--该用户登录后可以显示那些Schema-->
        <property name="schemas">db_2</property>
    </user>
2.2.4.重启Mycat
[root@mysql-1 ~]# mycat restart
Stopping Mycat-server...
Stopped Mycat-server.
Starting Mycat-server...

2.3.写入数据观察分片效果

[root@mysql-1 ~]# mysql -uroot -p123456 -P8066 -h 192.168.20.11
mysql> use db_2;
create table tb_monthpart( id bigint not null comment 'ID' primary key, name varchar(100) null comment '姓名', create_time date null );
insert into tb_monthpart(id,name ,create_time) values(1,'Tom','2022-01-01'); 
insert into tb_monthpart(id,name ,create_time) values(2,'Cat','2022-01-10'); 
insert into tb_monthpart(id,name ,create_time) values(3,'Rose','2022-01-31');
insert into tb_monthpart(id,name ,create_time) values(4,'Coco','2022-02-20');
insert into tb_monthpart(id,name ,create_time) values(5,'Rose2','2022-02-25');
insert into tb_monthpart(id,name ,create_time) values(6,'Coco2','2022-03-10');
insert into tb_monthpart(id,name ,create_time) values(7,'Coco3','2022-03-31'); 
insert into tb_monthpart(id,name ,create_time) values(8,'Coco4','2022-04-10'); 
insert into tb_monthpart(id,name ,create_time) values(9,'Coco5','2022-04-30');

可以看到1月的数据写入到分片1中,2月的数据写入到了分片2中,3月的数据写入到了分片2中,4月的数据写入到了分片1中。

第114讲:Mycat实践指南:按照单位为月的日期实现水平分表-LMLPHP

03-26 11:39