一、水平切分
A、配置 server.xml
指定主键生成策略
B、配置 schema.xml
指定逻辑库,分片结点,结点主机等
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100">
<!-- 要实现分库分表,那么就需要在<schema>标签下配置表了,现在是水平切分,表示要对哪张表进行切分 -->
<table name="orders" primaryKey="id" autoIncrement="true" dataNode="dn1,dn2,dn3" rule="mod-long" />
</schema>
<!--配置真实的数据库名称 test -->
<dataNode name="dn1" dataHost="localhost1" database="test01" />
<dataNode name="dn2" dataHost="localhost1" database="test02" />
<dataNode name="dn3" dataHost="localhost1" database="test03" />
<dataHost name="localhost1"
maxCon="1000"
minCon="10"
balance="1"
writeType="0"
dbType="mysql"
dbDriver="native"
switchType="1"
slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM3307" url="localhost:3307" user="root" password="aszhuo123">
<readHost host="hostS3308" url="localhost:3308" user="root" password="aszhuo123" />
<readHost host="hostS3309" url="localhost:3309" user="root" password="aszhuo123" />
</writeHost>
<writeHost host="hostM3308" url="localhost:3308" user="root" password="aszhuo123">
<readHost host="hostS3307" url="localhost:3307" user="root" password="aszhuo123" />
<readHost host="hostS3310" url="localhost:3310" user="root" password="aszhuo123" />
</writeHost>
</dataHost>
</mycat:schema>
C、配置 rule.xml
指定分片结点数
<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
<!-- how many data nodes -->
<property name="count">3</property>
</function>
D、水平切分测试
(1) 通过 Navicat 在 3307 上创建三个库 test01、test02 和 test03,并在每个库中创建 orders 表
不管是何种方式的切分,主键生成必须交给 MyCat 实现
(2) 插入数据验证
next value for MYCATSEQ_GLOBAL
:MyCat 主键生成的方式
insert into orders (id,money) values (next value for MYCATSEQ_GLOBAL,90.1);
insert into orders (id,money) values (next value for MYCATSEQ_GLOBAL,90.2);
insert into orders (id,money) values (next value for MYCATSEQ_GLOBAL,90.3);
insert into orders (id,money) values (next value for MYCATSEQ_GLOBAL,90.4);
分别插入到不同的数据库的 orders 表中。
(3) 查询测试
查询操作,会将所有库中的 orders 数据查询出来
二、垂直切分
A、配置 server.xml
指定主键生成策略
<!--配置数据库的主键怎么生成,0为本地文件方式,1为数据库方式,2为时间戳序列方式-->
<property name="sequnceHandlerType">0</property>
B、配置 schema.xml
也同样需要配置 table 标签,水平切分是要对哪张表进行切分就配置那张表,垂直切分需要将数据库中的所有表都配置上,指定不同的 datanode。
需求:整个P2P平台的数据库(p2p)进行垂直切分,分为前台数据库(p2p-web)、后台数据库(p2p-admin)
<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">
<schema name="mycatdb" checkSQLschema="false" sqlMaxLimit="100">
<!-- 要实现分库分表,那么就需要在<schema>标签下配置表了,现在是垂直切分 -->
<!--需求:整个P2P平台的数据库(p2p)进行垂直切分,分为前台数据库(p2p-web)、后台数据库(p2p-admin)-->
<!--P2P前台数据库-->
<table name="orders" primaryKey="id" autoIncrement="true" dataNode="dn1"/>
<table name="users" primaryKey="id" autoIncrement="true" dataNode="dn1"/>
<!--P2P后台数据库-->
<table name="products" primaryKey="id" autoIncrement="true" dataNode="dn2"/>
<table name="creditor" primaryKey="id" autoIncrement="true" dataNode="dn2"/>
</schema>
<!--配置真实的数据库名称 testdb01 -->
<dataNode name="dn1" dataHost="localhost1" database="p2p-web" />
<dataNode name="dn2" dataHost="localhost1" database="p2p-admin" />
<dataHost name="localhost1"
maxCon="1000"
minCon="10"
balance="1"
writeType="0"
dbType="mysql"
dbDriver="native"
switchType="1"
slaveThreshold="100">
<heartbeat>select user()</heartbeat>
<writeHost host="hostM3307" url="localhost:3307" user="root" password="aszhuo123">
<readHost host="hostS3308" url="localhost:3308" user="root" password="aszhuo123" />
<readHost host="hostS3309" url="localhost:3309" user="root" password="aszhuo123" />
</writeHost>
<writeHost host="hostM3308" url="localhost:3308" user="root" password="aszhuo123">
<readHost host="hostS3307" url="localhost:3307" user="root" password="aszhuo123" />
<readHost host="hostS3310" url="localhost:3310" user="root" password="aszhuo123" />
</writeHost>
</dataHost>
</mycat:schema>
C、垂直切分测试
(1) 在 3307 上创建两个个数据库 p2p-web、p2p-admin
(2) 在 p2p-web 库中创建 users 和 orders 表
(3) 在 p2p-admin 库中创建 products 和 news 表
(4) 插入、查询测试
next value for MYCATSEQ_GLOBAL
D、注意
垂直切分带来的价值:
可以屏蔽掉多数据源的问题,只需要一个统一入口 MyCat 就可以操作下面的多个数据库。不管是何种方式的切分,主键生成必须交给 MyCat 实现。