MySQL运维6-Mycat分库分表之垂直分库

这篇具有很好参考价值的文章主要介绍了MySQL运维6-Mycat分库分表之垂直分库。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、垂直分库场景

  场景:在业务系统中,涉及一下表结构,但是由于用户与订单每天都会产生大量的数据,单台服务器的数据存储以及处理能力是有限的,可以对数据库表进行拆分,原有数据库如下

  MySQL运维6-Mycat分库分表之垂直分库

  说明1:整个业务系统中的表,大致分为四个,商品信息类的表,订单相关的表,用户相关表及省市区相关的表,这里暂时将省市区的表和用户相关的表放在一个数据节点上。

  说明2:因为商品,订单和用户相关的数据,每天都会产生海量的数据,所以我们采取的分库策略是将不同业务类型数据,放在不同数据库中,即垂直分库。

 

MySQL运维6-Mycat分库分表之垂直分库

二、准备工作

  在192.168.3.90,192.168.3.91,192.168.3.92三台服务器上创建shopping数据库

  MySQL运维6-Mycat分库分表之垂直分库

三、配置schema.xml

  MySQL运维6-Mycat分库分表之垂直分库

  说明1:在schema标签里面的table标签不需要rule属性的,只有在分表时才需要rule,我们现在是分库操作,不需要rule属性
  说明2:在table标签中,商品相关的表都放在dn1数据节点上,和订单相关的表都放在dn2数据节点上,和用户和地址相关的都放在dn3数据节点上

四、配置server.xml

  MySQL运维6-Mycat分库分表之垂直分库

  说明1:修改schemas标签中的数据库名称为shopping  

五、Mycat分库测试

  首先因为修改Mycat的配置文件,所以需要重启一下Mycat,保证新的配置起作用。

  MySQL运维6-Mycat分库分表之垂直分库

  重启之后,在192.168.3.91服务器上连接Mycat

  MySQL运维6-Mycat分库分表之垂直分库

  查看逻辑库和逻辑表

  MySQL运维6-Mycat分库分表之垂直分库

  说明1:目前这些表都还只是逻辑表,在mycat中存在,但是在MySQL的数据库中都没不存在,所以还需要把这些表创建出来。

  说明2:这里我们创建三个表作为代表,其他暂时用不到的表就先不创建了,每个数据节点上创建一个表,然后这些表就会自动的出现在配置好的数据节点上。

create table tb_goods_base(id int auto_increment primary key, goods_name varchar(20),  category varchar(20), price int);
create table tb_order_master(order_id int auto_increment primary key, money int, goods_id int, receiver_province varchar(6), receiver_city varchar(6), receiver varchar(20));
create table tb_user(id int auto_increment primary key, name varchar(20),  age int, gender varchar(1));

  MySQL运维6-Mycat分库分表之垂直分库

 

  在往每个表中插入一些测试数据

insert into tb_user (name, age, gender) values ("张三", 21, "男");
insert into tb_user (name, age, gender) values ("李四", 22, "女");
insert into tb_user (name, age, gender) values ("王五", 23, "男");
insert into tb_goods_base (goods_name, category, price) values ("华为手机","家电", 5888); insert into tb_goods_base (goods_name, category, price) values ("中国李宁","服装", 499); insert into tb_goods_base (goods_name, category, price) values ("双汇火腿","食品", 15); insert into tb_order_master (money, goods_id, receiver_province, receiver_city, receiver) values (5888, 1, "130000", "130200", "张三"); insert into tb_order_master (money, goods_id, receiver_province, receiver_city, receiver) values (499, 2, "130000", "130800", "李四"); insert into tb_order_master (money, goods_id, receiver_province, receiver_city, receiver) values (15, 3, "110000", 110100, "王五");

  MySQL运维6-Mycat分库分表之垂直分库

  以上是对Mycat数据垂直分库的创建表,插入数据和查询数据的测试。

六、Mycat多表查询测试

  情况一:同一数据节点上的多表查询

    首先创建一个三个的表用于测试,同一数据节点内的多表查询,tb_areas_provinces, tb_areas_city, tb_user_address 三个表都是在dn3数据节点上的。

create table tb_areas_provinces (id int auto_increment primary key, provinceid varchar(6), province varchar(20));
create table tb_areas_city (id int auto_increment primary key, cityid varchar(6), city varchar(20), provinceid varchar(6));
create table tb_user_address (id int auto_increment primary key, user_id int, province_id varchar(6), city_id varchar(6), address varchar(20));

    说明1:根据分库策略,创建的这三个测试表,都是属于用户和地址相关的数据,都在dn3数据节点上。

    MySQL运维6-Mycat分库分表之垂直分库

    添加一些测试数据

insert into tb_areas_provinces (provinceid, province) values ("110000", "北京市");
insert into tb_areas_provinces (provinceid, province) values ("120000", "天津市");
insert into tb_areas_provinces (provinceid, province) values ("130000", "河北省");

insert into tb_areas_city (cityid, city, provinceid) values ("110100", "市辖区", "110000");
insert into tb_areas_city (cityid, city, provinceid) values ("130200", "唐山市", "130000");
insert into tb_areas_city (cityid, city, provinceid) values ("130800", "承德市", "130000");


insert into tb_user_address (user_id, province_id, city_id, address) values (1, "110000", "110100", "清河毛纺厂");
insert into tb_user_address (user_id, province_id, city_id, address) values (2, "130000", "130200", "里二胡同");
insert into tb_user_address (user_id, province_id, city_id, address) values (3, "130000", "130800", "避暑山庄");

    MySQL运维6-Mycat分库分表之垂直分库

    现多表查询需求是:根据tb_user, tb_user_address表,tb_areas_provinces表和tb_areas_city表查出用户的名字已经所在的省,市,已经详细的地址:使用Mycat查询

select u.name, p.province, c.city, ua.address from tb_user as u, tb_user_address as ua, tb_areas_provinces as p, tb_areas_city as c where u.id = ua.user_id and ua.province_id = p.provinceid and ua.city_id = c.cityid;

    MySQL运维6-Mycat分库分表之垂直分库

    说明:同一数据节点内的多表联合查询在mycat中可以正确查出结果。 

  情况二:不在同一数据节点上的多表查询
    需求:查询每一笔订单的收件地址信息(包含省、市信息),其中要用到tb_order_master在dn2数据节点上,tb_areas_provinces和tb_areas_city在dn3数据节点上
select o.order_id, o.receiver,p.province, c.city from tb_order_master as o, tb_areas_provinces as p, tb_areas_city as c where o.receive_province=p.provinceid and o.receiver_city=c.cityid;

    MySQL运维6-Mycat分库分表之垂直分库

    这个时候就报错了, 报错的原因是:夸数据节点的多表查询,在执行sql的时候,Mycat并不知道,将这条sql给哪一个数据节点处理。

    解决方式:将一些数据量少,并且一旦确定了就很少改变的表,设置为全局表,全局表可以在每个数据节点上都能访问。而本案例中的省/市表就符合这个特性,中国每个城市的编码一旦确定,几乎就不会变化,这样的数据表,我们就可以设置为全局表。全局表会存在每一个数据节点上。

    如果要设置全局表,只需要在schema.xml设置逻辑表的时候加上 type="global"参数即可

    MySQL运维6-Mycat分库分表之垂直分库

    说明1: 因为省市相关的数据表需要在dn1,dn2,dn3 三个数据节点上,所以dataNode这里要设置dn1,dn2,dn3三个节点

    说明2:在table标签内添加type="global"属性

    说明3:因为之前的areas的表,都要变成全局表,所以需要数据清空在重新添加测试数据

    MySQL运维6-Mycat分库分表之垂直分库

    说明4:因为修改了Mycat配置,所以需要重新启动Mycat

    MySQL运维6-Mycat分库分表之垂直分库

    重新创建tb_areas_provinces和tb_areas_city两个表

create table tb_areas_provinces (id int auto_increment primary key, provinceid varchar(6), province varchar(20));
create table tb_areas_city (id int auto_increment primary key, cityid varchar(6), city varchar(20), provinceid varchar(6));  

    MySQL运维6-Mycat分库分表之垂直分库

    MySQL运维6-Mycat分库分表之垂直分库

    说明5:这时候就会发现tb_areas_procinces和tb_areas_city出现在了三个数据节点上

    再次插入数据进行多表查询测试:

insert into tb_areas_provinces (provinceid, province) values ("110000", "北京市");
insert into tb_areas_provinces (provinceid, province) values ("120000", "天津市");
insert into tb_areas_provinces (provinceid, province) values ("130000", "河北省");

insert into tb_areas_city (cityid, city, provinceid) values ("110100", "市辖区", "110000");
insert into tb_areas_city (cityid, city, provinceid) values ("130200", "唐山市", "130000");
insert into tb_areas_city (cityid, city, provinceid) values ("130800", "承德市", "130000"); 

    会发现插入的这些测试数据,会在dn1,dn2,dn3的每个数据节点的表中都添加成功。

    现在就可以顺利的进行多表查询了。

    MySQL运维6-Mycat分库分表之垂直分库

    说明6:当全局表中的数据发生改变的时候,每个数据节点下的表,也都会发生数据改变。 文章来源地址https://www.toymoban.com/news/detail-760150.html

到了这里,关于MySQL运维6-Mycat分库分表之垂直分库的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • mysql运维------分库分表

    随着互联网以及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行数据存储,存在以下性能瓶颈: IO瓶颈 :热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。请求数据太多,带宽不够,网络IO瓶颈。 CPU瓶颈 :排序、分组、连接查询、

    2023年04月11日
    浏览(45)
  • MySQL运维3-分库分表策略

    单库瓶颈:如果在项目中使用的都是单MySQL服务器,则会随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增长,若采用单数据库进行存储,存在一下性能瓶颈: IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率低下,请求数据太多,带宽不够,

    2024年02月05日
    浏览(41)
  • Mycat分库分表实时同步到GreatSQL

    MyCat作为经典的分库分表中间件,在长时间内被广泛认为是管理超大MySQL数据库集合的有效解决方案。近来接到客户需求,需要将MyCat集群迁移到GreatSQL中,并且在一段时间内需要实时从MyCat中同步数据到GreatSQL中,全量同步数据比较容易操作,增量同步有如下两个棘手的问题:

    2024年02月03日
    浏览(43)
  • 15天学习MySQL计划(运维篇)分库分表-监控-第十四天

    1.介绍 1.问题分析 ​ 随着互联网及移动互联网的发展,应用系统的数据量也是成指数式增加,若采用但数据进行数据存储,存在以下性能瓶颈: IO瓶颈:热点数据太多,数据库缓存不足,产生大量磁盘IO,效率较低。请求数据太多,带宽不够,网络IO瓶颈。 CPU瓶颈:排序,分

    2024年02月05日
    浏览(49)
  • MyCat2介绍以及部署和读写分离/分库分表(MyCat2.0)

    1.什么是mycat ​ mycat是数据库中间件 它可以干什么? 读写分离 数据分片:垂直拆分,水平拆分 多数据源整合 2.数据库中间件 ​ 中间件:是一类连接软件组件和应用的计算机软件,以便于软件各部件之间的沟通。 ​ 例子:tomcat,kafka,redis等中间件 3.为什么使用macat java与数

    2024年02月09日
    浏览(40)
  • MySQL 数据存储和优化------MySQL索引原理和优化 ---- (架构---索引---事务---锁---集群---性能---分库分表---实战---运维)持续更新

    Mysql架构体系全系列文章主目录(进不去说明还没写完) https://blog.csdn.net/grd_java/article/details/123033016 本文只是整个系列笔记的第二章:MySQL索引原理和优化,只解释索引相关概念。 索引可以提高查询效率,影响where查询和order by排序,它可以从多方面进行分类,但是实际创建时

    2024年02月02日
    浏览(54)
  • 运维高级--shell脚本完成分库分表

         随着系统的运行,存储的数据量会越来越大,系统的访问的压力也会随之增大,如果一个库中的表数据超过了一定的数量,比如说MySQL中的表数据达到千万级别,就需要考虑进行分库分表;      其次随着表数据的不断增大,会发现查询也随着变得缓慢,如果添加索

    2024年02月15日
    浏览(49)
  • 运维——编写脚本,使用mysqldump实现分库分表备份。

     编写脚本,使用mysqldump实现分库分表备份。 需要将 和 替换为您的 MySQL 用户名和密码,并将 替换为您希望保存备份文件的路径。 your_username your_password \\\"/path/to/backup\\\" 此脚本将遍历所有数据库和表,并使用 mysqldump 工具将每个表的数据导出到单独的备份文件中。备份文件的命

    2024年02月15日
    浏览(53)
  • 【分库分表】基于mysql+shardingSphere的分库分表技术

    目录 1.什么是分库分表 2.分片方法 3.测试数据 4.shardingSphere 4.1.介绍 4.2.sharding jdbc 4.3.sharding proxy 4.4.两者之间的对比 5.留个尾巴 分库分表是一种场景解决方案,它的出现是为了解决一些场景问题的,哪些场景喃? 单表过大的话,读请求进来,查数据需要的时间会过长 读请求过

    2024年03月12日
    浏览(48)
  • 掌握MySQL分库分表(一)数据库性能优化思路、分库分表优缺点

    不能⼀上来就说分库分表! 根据实际情况分析,两个角度思考:不分库分表、分库分表 软优化 数据库参数调优 分析慢查询SQL语句,分析执行计划,进行sql改写和程序改写 优化数据库索引结构 优化数据表结构优化 引入NOSQL和程序架构调整 硬优化 提升系统硬件(更快的IO、更

    2023年04月19日
    浏览(59)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包