mycat+mysql实现分库分表

场景描述

mycat已配置读写分离,读写分离链接:mycat+mysql实现读写分离

mycat拥有两个逻辑数据库test1、test2;
test2拥有三个逻辑表:aa、bb、cc,对应下面真实数据库的aa、bb、cc

mysql拥有三个真正的数据库test1、test2、test3
test2拥有两个真正表:aa、bb
test3拥有两个真正表:aa、cc

所有真实表都需要设置主键自增

对aa表进行分库分表

mycat分库分表配置

schema.xml

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
        <schema name="test1" checkSQLschema="false" sqlMaxLimit="100" dataNode="dn1"></schema>
        <schema name="test2" checkSQLschema="fales" sqlMaxLimit="100">
        		<!-- 
	        		name:表名;
	        		dataNode:数据库节点名称;
	        		primaryKey:主键;
	        		autoIncrement:设置主键自增
	        		rule:分片规则
        		 -->
                <table name="aa" dataNode="dn2,dn3" primaryKey="id" autoIncrement="true" rule="auto-sharding-long"/>
                <table name="bb" dataNode="dn2" primaryKey="id"/>
                <table name="cc" dataNode="dn3" primaryKey="id"/>
        </schema>

		<!-- 
			name:表名;
        	dataNode:数据库节点名称;
        	dataHost:dataHost名称;
        	database:真正数据库名
        -->
        <dataNode name="dn1" dataHost="localhost1" database="test1" />
        <dataNode name="dn2" dataHost="localhost1" database="test2" />
        <dataNode name="dn3" dataHost="localhost1" database="test3" />

        <dataHost name="localhost1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native" switchType="-1"  slaveThreshold="100">
                <heartbeat>select user()</heartbeat>
                <!-- can have multi write hosts 写数据库-->
                <writeHost host="hostM1" url="192.168.81.129:3306" user="root" password="123456">
                        <!-- can have multi read hosts 读数据库-->
                        <readHost host="HostS1" url="192.168.81.130:3306" user="root" password="123456" />
                </writeHost>
        </dataHost>
</mycat:schema>

rule.xml

这里采用范围约定,提前规划好分片字段某个范围属于哪个分片。
了解更多分片规则,参考这篇文章:Mycat分片规则详解

<tableRule name="auto-sharding-long">
    <rule>
        <columns>id</columns>
        <algorithm>rang-long</algorithm>
    </rule>
</tableRule>
<function name="rang-long" class="io.mycat.route.function.AutoPartitionByLong">
    <property name="mapFile">autopartition-long.txt</property>
    <property name="defaultNode">1</property>
</function>

配置说明:

  • columns 标识将要分片的表字段
  • algorithm 分片函数
  • mapFile 标识配置文件名称
  • defaultNode 超过范围后的默认分片

autopartition-long.txt

#0-500M=0
#500M-1000M=1
#1000M-1500M=2

# 以下配置说明id是0-5的,属于0节点;id是6-10的,属于1节点
0-5=0
6-10=1

sequence_conf.properties
配置全局序列号

AA.HISIDS=
AA.MINID=1
AA.MAXID=5
AA.CURID=0

配置说明:

  • AA:需要分库分表的表名,必须用大写字母;需要配置多个表复制以上参数即可
  • HISIDS:使用过的历史分段(一般无特殊需要可不配置)
  • MINID:最小主键值
  • MAXID:最大主键值
  • CURID:当前主键值

注意:测试过程中如果需要重置真正数据库的主键,这边的配置也需要重置

server.xml

<!--全局序列方式: 0 为本地文件方式(读取sequence_conf.properties)1 为数据库方式,2 为时间戳序列方式,3 为分布式 ZK ID 生成器,4 为 zk 递增 id 生成 -->
<property name="sequnceHandlerType">0</property> 

测试

mycat中的aa逻辑表数据:
在这里插入图片描述

test2真实数据库的aa真实表数据:
在这里插入图片描述
test3真实数据库的aa真实表数据:
在这里插入图片描述
结论:
mycat中拥有主键1-11的数据,test2中拥有主键1-5的数据,test3中拥有主键6-11的数据;上面配置的1-5属于0分片、6-10属于1分片,而超出的部分默认属于1分片;由此可以看出mycat分库分表成功

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值