开发者学堂课程【全面讲解开源数据库中间件MyCat使用及原理(二):MyCat - 分片 - 垂直拆分 - 全局表配置】学习笔记,与课程紧密联系,让用户快速学习知识。
课程地址:https://developer.aliyun.com/learning/course/756/detail/13261
MyCat - 分片 - 垂直拆分 - 全局表配置
内容介绍:
一、全局表介绍
二、如何成为全局表
一、全局表介绍
在复杂查询当中,查询了四张表,有 order 订单的相关信息,区域的相关信息,这个时候他报错了是因为涉及到了跨库的连接查询。
由于 order master 是订单相关的表,它是存放在第三个数据节点当中
后来又查询了用户的省份和城市信息,而这些是在第一个数据节点当中,在一条Sql 当中,查询了 order master,还查询了关联的省份和城市信息,就涉及到了跨库的连接查询。mycat 是有问题的,所以报错了。那么,如何避免跨库的连接查询呢?就要用到 mycat 当中提到过的全局表。全局表指的是有一部分表,表结构当中的数据是比较少的,这些表结构是属于系统当中的基础表结构,在很多应用系统当中都要关联这张表结构中的数据,为了避免跨库的连接查询,就可以把它变成全局表。比如关于省份区域这块的表,就可以把它变成全局表。在第一个节点中有一份,在第二个节点中还有一份。同样在第三个数据节点当中,也会有一份。这时候这三个节点当中都会有一份,查询订单信息的时候,关联查询订单所归属的区域信息就不再涉及到跨库的操作了。同样在查询用户信息,以及用户所关联的城市和省份信息,也不用再涉及到跨库的操作,因为每一个节点当中都会有这样基础的全局表。所以接下来要做的就是把区域的表升级为全局表。
二、如何成为全局表
1)导入的第一部分:
mysq1dump -uroot -pitcast user_ _db tb_ areas provinces> provinces ;
先把表结构导出来,再把这三张表中的表数据导入到第二个数据节点以及第三个数据节点,这时候就需要用到 mysql 当中的关于数据备份的指令,即 mysqldump。
直接在 linux 命令行直接执行这条指令。
-uroot 为用户名,-pitcat 为密码,user_db 为要导出的数据库以及这个数据库中的哪一张表和把这张表中的数据导出到哪个文件当中。输入 ll,发现数据已经导出来了
把它移到 root 目录下
[rootolocalhost conf ]#mv provinces / root/
[root@localhost conf ]#cd
2)导入的第二部分:
mysq1dump -uroot -pitcast user. _db tb_ areas_ city >city;
依然执行 mysqldump,输入 ll,city 也已经有了,
3)导入的第三部分:
mysq1dump -uroot -pitcast user- db tb_ areas. region > region
4)远程同步
在数据库 157 中是有这三个表的,现在要做的是把 City、province 和 region 这三个表同步到 158 上,因为 158 里面还没有这个表,这个时候需要借助 scp 远程拷贝的指令,这个时候吧 city 拷贝到 158 上,前面 root 是以哪个用户进行拷贝,@后面是要拷贝到哪一台服务器上以及拷贝到 root 目录下,拷贝的时候需要指定服务器的密码。接下来再拷贝到 159,这样 158 和 159 上面都会有 city 文件。
接下来拷贝 province
Province 也拷贝过去了,最后一个需要靠背的是 region
[ root@localhost ~]#scp region root@192.168.192 .158:/ root
root@192.168.192.158's password:
region
[ root@localhost ~]#scp region root192. 168.192.159:/ root
root192.168.192.159's password:
city、province 和 region 已经拷贝到 158 和 159 了,接下来把拷贝过来的三个脚本文件导入进来,使用 source/root/city、source/root/provinces 和source/root/region ,然后 show tables
三张表结构已经有了,接下来在 159 上面进行 show tables,同样执行source/root/city、source/root/provinces 和 source/root/region,再次执行show tables,这样这三张表在三个节点当中都已经有了。
但是目前还不是全局表,如果想让这三张表成为全局表,还需要在 schema.xml 进行配置,上面三张表的三个节点中都已经存在了,既然在三张表里面都已经存在了,Datanode 节点就不仅仅是 dn1 了,还有 dn2 和 dn3
<table name="tb_ areas_ city" dataNode="dn1, dn2, dn3" primaryKey="id" />
<table name="tb areas provinces" dataNode= "dn1 , dn2 , dn3" pr imaryKey="id" />
<table name="tb areas region" dataNode="dn1, dn2,dn3" pr imaryKey=" id"
还要去设置 type 属性,需要把 type 设置成 global
<table name="tb_ areas. city" dataNode="dn1, dn2 , dn3" pr imaryKey="id" tfype="g1oba1"/>
<table name="tb_ areas_ pr ovinces" dataNode="dn1, dn2,dn3" pr imarykey="id" type="global"/>
<table name="tb_ areas. region" dataNode=" dn1, dn2 ,dn3" pr imaryKey="id" type="globa1"/>
type="global" 就代表当前表为全局表,一旦声明 type 为 global,相当于 tb areas region 表在 dn1, dn2 , dn3 节点当中都会存在
<table name="tb_ areas_ city" dataNode="dn1 ,dn2 , dn3" primaryKey="id" type="global"/>
<table name="tb areas provinces" dataNode="dn1 ,dn2,dn3" primaryKey="id" type="g1oba1"/>
<table name="tb_ areas_ region" dataNode="dn1 , dn2 , dn3" primaryKey="id" type="global"/>
到此为止基本的配置已经配置完毕
5)重新启动 mycat
Bin/mycat restart
6)重新连接 mycat
这三个全局表在 mycat 当中依然可以看到,再去执行 SELECT order_id,payment ,receiver, province ,city,area FROM tb_ order. master。,tb_ areas provinces p,tb_ _areas city C,tb_ areas_ region r
WHERE o.receiver_ province = p.provinceid AND o.receiver- city = c.cityid AND o.receiver_ region =r ,areaid ;
语句
这时候数据已经查询出来了
SQL 语句查询的依然是订单,并且关联查询出订单的省份、地域和城市。这样的话就能查询到每一个订单,是哪个省份的,哪个区域的,哪个市的,哪个区的,都可以看到。
还需要做最后的一个测试,需要更新一条数据,输入 select*from city 和show tables 以及 select*from tb_areas_city。这样的话就能看到 city 下面的数据。
进行更新操作,update tb_ areas_ city set city = '石家庄’ where id = 5;在更新areas_ city 这张表的时候,把原来的石家庄市改为石家庄,更新是成功的
更新的是 mycat,这张表又属于全局表,第一个节点的数据已经更新出来了。
当在 mycat 当中更新全局表中的数据,下面所有数据节点中的数据都会发生变更。
当对 Mycat 全局表进行增删改的操作时,其他节点主机上的后端 MySQI 数据库中的数据时会同步变化的;
以上为垂直拆分的相关操作。