一般来说,水平切分并不要对所有表进行
(只有业务原因,不能进行历史归档的表才需要考虑是否水平切分)
(订单经常要按用户来查,此处选customer_id作为分片键)
node1修改schema.xml配置:
(并没有增加主机,所以不需要增加dataHost。需要增加dataNode)
node1配置rule.xml来水平切分:
(order_master是在schema.xml中定义的。partitionByMod:取模的方式)
重启mycat,并查看是否重启成功:
插入模拟数据后在node2查看:
然而,通过mycat查询逻辑库数据,会发现order_id有重复,不是有序自增的:
所以要全局自增:
可以在一个统一的地方生成order_id,可以是redis等,这里用的是mycat提供的功能:
在node1,也就是mycat节点:
在mycat安装目录下的conf目录下有个dbseq.sql,将其导入数据库:
这个库有一个表:
在server.xml(当然是node1中)中配置:
(sequnceHandlerType标签配置生成全局序列号的方式:0.本地文件,1.数据库,2.时间戳,3.zk递增方式)
还要增加一个配置文件(指定相关表和函数所在的数据节点 ):
还要在schema.xml中新增一个数据节点:
(刚才建立的mycat数据库的节点)
还要增加一个数据节点:
查看是否存在该用户:
查看其权限:
但是,新增的全局库/表中包含mysql的函数,而帐号未授权,插入数据会报错,所以,增加执行函数/存储过程的权限:
在全局表中增加一条记录:
(ORDER_MASTER:order水平分库的全局自增。当前值1,以1递增。注意:使用的是大写的表名,在配置中也要大写)
怎么告诉mycat要使用全局自增id呢?
(增加autoIncrement="true")
重启mycat,查看是否启动成功:
接下来插入数据,全局自增order_id成功
但是,如果需要关联查询:
order_master做了切片操作,而order_detail并没有对它进行切片操作,所以是跨分片关联!
那用什么方式解决呢?
可以用全局表,但显然这是很大的表,并且是随着增长的,修改频繁,显然不适合全局表场景,这里用到mycat提供的另外一个解决跨分片关联问题的方法——ER分片表(通过ER关系来分片,可以把需要关联的两个表,根据它们的关联键,把关联的数据分布到同一个分片内,这样就可以在同一个分片内解决关联问题):
在orderdb01、orderdb02、orderdb03、orderdb04中创建表order_detail(node2、node3中):
同样在orderdb02、orderdb03、orderdb04中创建表order_master......
编辑schema.xml(废话,当然还是node1):
(删掉dataNode)
(增加名为order_detail的子表/childTable,primarykey为该表本来的主键,关联键joinkey,父表主键parentKey,同样要使用全局自增id(autoIncrement="true"))
配置全局自增id:
插入测试数据后,order_master和order_detail都生成了10条数据:
看下数据的分布:
相同order_id的数据是放在同一个数据库分片的:
现在可以进行关联查询了: