Mycat——分片表计算规则,全局表和ER表,springboot中使用方法

分片计算规则

当你的逻辑表来自于多个数据库中,就是分片表,分片表也是需要保证数据一致性的。
在schema标签中有一个rule属性,它是用来配置分片规则的

auto-sharding-long :整数范围约束,默认规则,对表格中一个叫id的整数字段进行计算,每个节点500w条,超过的放下一个节点,没有下一个节点报错。

table name=“tb_student” primaryKey=“id” dataNode="dn1,dn2“ rule=“auto-sharding-long”/>

自己定义使用什么规则:
name:计算规则名称,table的rule绑定的值就是这个标签的名字
columns:定义了这个规则使用的表格字段是哪个/哪些
algorithm:就是绑定的计算方法function的名字

<tableRule name="sharding-by-murmur">
		<rule>
			<columns>id</columns>
			<algorithm>murmur</algorithm>
		</rule>
</tableRule>

sharding-by-murmur
只要对应表格有一个字段id,可以在表格的rule分片计算规则中使用rule="sharding-by-murmur"就能实现任何格式数据的一致性hash计算.

全局表:

数据库中可以做链接查询,但是如果表是分片的,那么就可以出现链接查询的两张表不在一个分片中,mycat又不支持跨分片查询,所以就会查询失败。要想进行跨分片查询,就需要做一些配置,全局表就是一种。

在这里插入图片描述
商品表是一个分片表,在数据库1和2中都存在,而商品分类表只在数据库1中存在,当我们使用链接查询的时候,数据如果在数据库2,就无法查询出结果,所以我们使用了一个叫全局表的方式。
我们仔细想商品分类这张表,其实这张表里的内容数量不多,并且很稳定,所以我们可以在每一个分片中都存放一张这个表,这就是全局表。

配置方式:

<table name="tb_product" primaryKey="id" dataNode="dn1,dn2" rule="auto-sharding-long"/>

<table name="tb_category" primaryKey="id" dataNode="dn1,dn2" type="global"/>

第一个是商品逻辑表,他的数据来自于两个分片,第二个是商品分类全局表。一张表格在配置table标签时,给指定了多个分片,但是没有指定rule计算分片规则,默认就会将表格新增数据同步到所有分片。

ER表:

有的时候,表有可能是主从的关系,并且两张表数量都很大,都在不同的数据库做了分片,这时候就需要使用ER表。
那么ER表是怎么来解决跨分片查询问题的?
分片表格之间关联查询之所以出现跨分片,原因:两张表各自维护了自己的分片计算规则。
只要将有关联的表格分片计算规则统一起来,就可以将所有关联数据切分到同一个分片中.
在这里插入图片描述

在微服务中的使用:

只用在application配置文件中声明:

#10.9.151.60:8066/TESTDB,mycat的地址端口和逻辑库名称
spring.datasource.url=jdbc:mysql://10.9.151.60:8066/TESTDB
spring.datasource.password=root
spring.datasource.username=root

其对应的mycat的schema文件:

<?xml version="1.0"?>
<!DOCTYPE schema SYSTEM "schema.dtd">
-<mycat:schema xmlns:mycat="http://org.opencloudb/">
<!--mycat only one logic database TESTDB-->
-<schema sqlMaxLimit="100" checkSQLschema="true" name="TESTDB">

<!--order tables-->
-<table name="t_order" dataNode="dn3,dn4" primaryKey="order_id" rule="easymall-order-hash">
<childTable name="t_order_item" primaryKey="id" parentKey="order_id" joinKey="order_id"/>
</table>
</schema>
<dataNode name="dn3" database="easydb" dataHost="localhost1"/>

<dataNode name="dn4" database="easydb" dataHost="localhost2"/>

-<dataHost name="localhost1" slaveThreshold="100" switchType="1" dbDriver="native" dbType="mysql" writeType="0" balance="0" minCon="10" maxCon="1000">

<heartbeat>select user()</heartbeat>

<writeHost password="root" user="root" url="10.9.48.69:3306" host="M1"> </writeHost>

</dataHost>


-<dataHost name="localhost2" slaveThreshold="100" switchType="1" dbDriver="native" dbType="mysql" writeType="0" balance="0" minCon="10" maxCon="1000">

<heartbeat>select user()</heartbeat>

<writeHost password="root" user="root" url="10.9.151.60:3306" host="M1"> </writeHost>

</dataHost>

</mycat:schema>

猜你喜欢

转载自blog.csdn.net/weixin_42596778/article/details/106577246