场景需求:
在业务系统中, 涉及以下表结构 ,由于用户与订单每天都会产生大量的数据, 单台服务器的数据存储及处理能力是有限的, 可以对数据库表进行拆分, 原有的数据库表如下。
现考虑将其进行垂直分库操作,将商品相关的表拆分到一个数据库服务器,订单表拆分到一个数据库服务器,用户及省市区表拆分到一个服务器。最终结构如下:
准备工作:
1.10.168.5.183,安装mycat、mysql
2.10.168.5.193,安装mysql
3.10.168.5.194,安装mysql
4.在三台mysql机器上建立一个shopping数据库,然后退出mysql,不要进行其它任何增删改的操作。
配置schema.xml文件:
配置server.xml:
分库验证测试:
启动mycat后,查看每一台mysql节点主机的情况
如下所示,已经将不同的表成功分配到各自的节点上
Mycat上看到的库和表,如下:
分库查询测试:
一:如下所示,在mycat上查询用户的收件人及收件人地址信息(包含省、市、区),可以看到能过成功查询到相关的数据信息。
二:如下所示,当我们现在尝试查询每一笔订单及订单的收件地址信息(包含省、市、区)。 出现路由错误信息,无法进行查询
invalid route in sql, multi tables found but datanode has no intersection
造成改问题的原因如下:
MyCat在执行该SQL语句时,需要往具体的数据库服务器中路由,而当前没有一个数据库服务器完全包含了订单以及省市区的表结构,所以造成SQL语句失败,报错。
解决方式:
对于省、市、区/县表tb_areas_provinces , tb_areas_city , tb_areas_region,是属于数据字典表,在多个业务模块中都可能会遇到,可以将其设置为全局表,利于业务操作。修改schema.xml中的逻辑表的配置,修改 tb_areas_provinces、tb_areas_city、
tb_areas_region 三个逻辑表,增加 type 属性,配置为global,就代表该表是全局表,就会在所涉及到的dataNode中创建给表。对于当前配置来说,也就意味着所有的节点中都有该表了。
如下所示,我们修改schema.xml文件后,并重新连接mycat以后,查看每一台mysql节点,每一个实体mysql上都已经有了tb_areas_provinces , tb_areas_city , tb_areas_region三张表
如下所示,我们再次测试查询每一笔订单及订单的收件地址信息(包含省、市、区)。已经能够正常查询出结果,没有出现任何错误提示