分片计算规则
当你的逻辑表来自于多个数据库中,就是分片表,分片表也是需要保证数据一致性的。
在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>