垂直拆分根据业务模块把数据库划分独立出来,来矫情数据库的总体带来的压力! |
接上一篇:企业实战_08_Mycat清除冗余数据
https://blog.csdn.net/weixin_40816738/article/details/100057317
Mycat 跨分片查询_全局表
主机名 | IP地址 | 角色 | 数据库 |
---|---|---|---|
mycat | 192.168.43.32 | MYCAT MYSQL | imooc_db(物理主机) |
node1 | 192.168.43.104 | MYSQL | order_db(物理从机) |
node2 | 192.168.43.217 | MYSQL | product_db(物理从机) |
node3 | 192.168.43.172 | MYSQL | customer_db(物理从机) |
mysql -uapp_imooc -p123456 -h192.168.43.32 -P8066
use imooc_db;
SELECT
supplier_name,
b.region_name AS '省',
c.region_name AS '市',
d.region_name AS '区'
FROM
product_supplier_info a
JOIN region_info b ON b.region_id = a.province
JOIN region_info c ON c.region_id = a.city
JOIN region_info d ON d.region_id = a.district;
ERROR 1064 (HY000): invalid route in sql, multi tables found but datanode has no intersection sql
表 | 节点 |
---|---|
region_info | node1 |
product_supplier_info | node2 |
针对这种情况应该如何处理呢? |
方式 | 说明 |
---|---|
api方式 | 通过前端程序,去订单模块中分别获取省市区的信息,之后拼接在一起 |
数据冗余的方式 | 把这些省市区的信息冗余到商品模块的供应商表中 |
全局表 | 字典表跨分片操作 |
如果通过api方式,查询的频率比较高,api调取的次数也会很高,而且通过前台程序,api调用再去拼接,比较耗时。
如果通过数据冗余方式,这个数据的冗余度比较大,字段不多还好说,针对字段比较多的字典表的话,一旦修改的话,我们就要修改和字段表相关的表,因此,字典类型的不适用api和数据冗余的方式进行处理。
MyCat提供的全局表的功能,在每个分片上都会有这个全局表,也就是说,我们会把region_info这个表以相同的数据,存储到这3个数据节点中,然后再schema.xml中声明全局表。
步骤 | 命令 | 说明 |
---|---|---|
第一步 | mysql -uroot -p product_db < region_info | 将region_info 数据导入到product_db数据库中 |
第二步 | mysqldump -uroot -p order_db region_info > region_info | 导出备份region_info表 |
第二步 | scp region_info [email protected]:/root | 将region_info 表以root用户同步到ip为192.x服务器的root目录下面 |
#在node1上导出备份region_info表
mysqldump -uroot -p order_db region_info > region_info
#复制到node2上
scp region_info [email protected]:/root
#复制到node3上
scp region_info [email protected]:/root
#将region_info 数据导入到product_db数据库中
mysql -uroot -p product_db < region_info
#将region_info 数据导入到customer_db数据库中
mysql -uroot -p customer_db< region_info
#进入mycat的conf目录下面
cd /app/mycat/conf/
#编辑schema.xml文件
vim schema.xml
#将region_info逻辑表,定义为全局表
#停止mycat
mycat stop
#启动mycat
mycat start
#使用mysql客户端连接mycat
mysql -uapp_imooc -p123456 -h192.168.43.32 -P8066
#验证跨分片查询
#执行跨分片查询
SELECT
supplier_name,
b.region_name AS '省',
c.region_name AS '市',
d.region_name AS '区'
FROM
product_supplier_info a
JOIN region_info b ON b.region_id = a.province
JOIN region_info c ON c.region_id = a.city
JOIN region_info d ON d.region_id = a.district;
#使用mysql客户端连接mycat
mysql -uapp_imooc -p123456 -h192.168.43.32 -P8066
#使用逻辑库
use imooc_db;
#查看全局表数据
select * from region_info limit 10;
#更新全局表数据
update region_info set region_name='中国' where region_id=1;
#更新后,再次查看全局表数据
select * from region_info limit 10;
注:mysql更新数据库失败 --read-only 请进入传送门:
https://blog.csdn.net/weixin_40816738/article/details/100059688
#登录数据库
mysql -uroot -p
#使用指定数据
use order_db;
#更新后,再次查看全局表数据
select * from region_info limit 10;
发现通过登录mycat节点修改全局表数据,node1节点的数据已经更新
#登录数据库
mysql -uroot -p
#使用指定数据
use product_db;
#更新后,再次查看全局表数据
select * from region_info limit 10;
发现通过登录mycat节点修改全局表数据,node1节点的数据已经更新
#登录数据库
mysql -uroot -p
#使用指定数据
use customer_db;
#更新后,再次查看全局表数据
select * from region_info limit 10;
发现通过登录mycat节点修改全局表数据,node1节点的数据已经更新
①切换应用通过MyCat连接数据库
②删除不属于本模块的表
此场景验证Mysql主从复制到垂直拆分的演化。 由一开始有MySql主机主从复制方式,到由MyCat来控制后台的MySql主机--->>>垂直拆分场景 |
思路:优缺点出发
①数据库的拆分简单明了,拆分规则明确
②应用程序模块清晰明确,整合容易
③数据维护,简单易行,容易定位
①部分表关联无法在数据库完成级别完成,需要在程序中完成
②对于访问比较频繁且数据量超大的表仍然存在性能瓶颈
③切分达到一定程度后,扩展性会遇到限制
①适应MyCat全局表
②冗余部分关联数据
③使用API的方式获取数据
下一篇:企业实战_10_Mycat 水平扩展_分库分表
https://blog.csdn.net/weixin_40816738/article/details/100059793