mysql mycat水平分库_mycat水平分库

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

a5f347a1284609e89b7bdade4c97b79a.png

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

b3457f9a144b87e499abc79d707a1633.png

194d4b98b1490492c3d5abf312b18ba3.png

9d64400c85e09a58d3477aa96ade3483.png

be884fca18900f01ada2b491ce0a7be6.png

f7613fc42d14690b0af698da235ea126.png

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

0c0f2460021f98856ac8c3064ceef11a.png

ed35872c284c50177c370a150920eeae.png

node1修改schema.xml配置:

f9e9df1aea042bfdf5838a2f68414145.png

f9e9df1aea042bfdf5838a2f68414145.png

f9e9df1aea042bfdf5838a2f68414145.png

f9e9df1aea042bfdf5838a2f68414145.png

be3e51e7155b14d4b4817f1c87f2b80b.png

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

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

586d0b44c8f851af6904db7c25cdf6c5.png

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

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

126efa163842b88411fce16b4060dd27.png

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

4d68508ff1ec17db1a013c82176ca91f.png

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

e39f81c1020d8c3990a001fafdf67aba.png

所以要全局自增:

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

在node1,也就是mycat节点:

2afbeecfb2b3b835349e6521e1b7e085.png

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

162deee09cf879f5351fc85c9d4c973d.png

这个库有一个表:

1b320f4a8577072f41318378cd41b858.png

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

07abcb51c46852436655c410b0c10af6.png

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

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

cac1baa8cdf54446656e34a013755ea9.png

3e8c88376d2d85ce86898cd962e05da2.png

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

07368d54bcde773e73ab1e3837664215.png

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

还要增加一个数据节点:

e8621db4c6a33c5136b5ced851edfe84.png

查看是否存在该用户:

55c5a1b39b3b60726bec352896bcb0ac.png

查看其权限:

6abef82e9f734a17e529a7533dde4202.png

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

40bda3bbe9d931daff051b8794c17206.png

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

420cf2cd666a4fc17875eb8fb2cf6261.png

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

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

f1932707d50560bbd78e4ad48700bf8f.png

e80da413dea9fe5d88322532c435585c.png

(增加autoIncrement="true")

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

b5f799078d2a6c7064e975379a566ff0.png

586a68656007f4334f77de0ecd9caf3b.png

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

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

9be2e6bf68a4175939cd338ec0f56f30.png

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

那用什么方式解决呢?

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

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

277deee8a6762e0271c09c8b957b03ae.png

bf9032a30f9e4d22f2478b205a549b1a.png

00ff9b33715a4b515b715f7db3ef98a7.png

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

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

9c77f33d2081e1e3a4e6a5b6f5801a78.png(删掉dataNode)

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

配置全局自增id:

5944dd61ca38a0e9d5abbcf1c1919af0.png

b956f1b21f49831dd02e5da8c8f3f0e4.png

a882b83e535178a4541b7d3c032b505d.png

1771e3757419933984f143ef31bc8c0c.png

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

8430cfd883df68ae7784757201c897c7.png

ea543f5e90b6185f1a3ca07288a07935.png

看下数据的分布:

c27247d243975dbbbb7302bf56ac747e.png

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

777a55218a1c42e80ff48e3f0afb61db.png

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

788f3a7b9d645cd44f9dc025fb3ee302.png

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值