一般来说,水平切分并不要对所有表进行

mycat水平分库_第1张图片



(只有业务原因,不能进行历史归档的表才需要考虑是否水平切分)

mycat水平分库_第2张图片

mycat水平分库_第3张图片

mycat水平分库_第4张图片

mycat水平分库_第5张图片

mycat水平分库_第6张图片

(订单经常要按用户来查,此处选customer_id作为分片键)

mycat水平分库_第7张图片

mycat水平分库_第8张图片


node1修改schema.xml配置:

spacer.gifspacer.gifspacer.gifspacer.gifmycat水平分库_第9张图片

(并没有增加主机,所以不需要增加dataHost。需要增加dataNode)

node1配置rule.xml来水平切分:

mycat水平分库_第10张图片

(order_master是在schema.xml中定义的。partitionByMod:取模的方式)

重启mycat,并查看是否重启成功:

mycat水平分库_第11张图片

插入模拟数据后在node2查看:

mycat水平分库_第12张图片


然而,通过mycat查询逻辑库数据,会发现order_id有重复,不是有序自增的:

mycat水平分库_第13张图片

所以要全局自增:

可以在一个统一的地方生成order_id,可以是redis等,这里用的是mycat提供的功能:

在node1,也就是mycat节点:

image.png

在mycat安装目录下的conf目录下有个dbseq.sql,将其导入数据库:

image.png

这个库有一个表:

mycat水平分库_第14张图片

在server.xml(当然是node1中)中配置:

mycat水平分库_第15张图片

(sequnceHandlerType标签配置生成全局序列号的方式:0.本地文件,1.数据库,2.时间戳,3.zk递增方式)

还要增加一个配置文件(指定相关表和函数所在的数据节点 ):

image.png

image.png

还要在schema.xml中新增一个数据节点:

mycat水平分库_第16张图片

(刚才建立的mycat数据库的节点)

还要增加一个数据节点:

mycat水平分库_第17张图片

查看是否存在该用户:

mycat水平分库_第18张图片

查看其权限:

mycat水平分库_第19张图片

但是,新增的全局库/表中包含mysql的函数,而帐号未授权,插入数据会报错,所以,增加执行函数/存储过程的权限

image.png

在全局表中增加一条记录:

mycat水平分库_第20张图片

(ORDER_MASTER:order水平分库的全局自增。当前值1,以1递增。注意:使用的是大写的表名,在配置中也要大写)

怎么告诉mycat要使用全局自增id呢?

image.png

mycat水平分库_第21张图片

(增加autoIncrement="true")

重启mycat,查看是否启动成功:

mycat水平分库_第22张图片

mycat水平分库_第23张图片

接下来插入数据,全局自增order_id成功


但是,如果需要关联查询:

image.png

order_master做了切片操作,而order_detail并没有对它进行切片操作,所以是跨分片关联!

那用什么方式解决呢?

可以用全局表,但显然这是很大的表,并且是随着增长的,修改频繁,显然不适合全局表场景,这里用到mycat提供的另外一个解决跨分片关联问题的方法——ER分片表(通过ER关系来分片,可以把需要关联的两个表,根据它们的关联键,把关联的数据分布到同一个分片内,这样就可以在同一个分片内解决关联问题):

在orderdb01、orderdb02、orderdb03、orderdb04中创建表order_detail(node2、node3中):

mycat水平分库_第24张图片

mycat水平分库_第25张图片

mycat水平分库_第26张图片

同样在orderdb02、orderdb03、orderdb04中创建表order_master......

编辑schema.xml(废话,当然还是node1):

mycat水平分库_第27张图片(删掉dataNode)

(增加名为order_detail的子表/childTable,primarykey为该表本来的主键,关联键joinkey,父表主键parentKey,同样要使用全局自增id(autoIncrement="true"))

配置全局自增id:

image.png

image.png

mycat水平分库_第28张图片

mycat水平分库_第29张图片

插入测试数据后,order_master和order_detail都生成了10条数据:

mycat水平分库_第30张图片

mycat水平分库_第31张图片

看下数据的分布:

mycat水平分库_第32张图片

相同order_id的数据是放在同一个数据库分片的:

mycat水平分库_第33张图片

现在可以进行关联查询了:

mycat水平分库_第34张图片