一、垂直分库场景

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

  

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

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

二、准备工作

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

  

三、配置schema.xml

  

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

四、配置server.xml

  

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

五、Mycat分库测试

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

  

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

  

  查看逻辑库和逻辑表

  

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

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

  1. create table tb_goods_base(id int auto_increment primary key, goods_name varchar(20), category varchar(20), price int);
  2. 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));
  3. create table tb_user(id int auto_increment primary key, name varchar(20), age int, gender varchar(1));

  

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

  1. insert into tb_user (name, age, gender) values ("张三", 21, "男");
  2. insert into tb_user (name, age, gender) values ("李四", 22, "女");
  3. insert into tb_user (name, age, gender) values ("王五", 23, "男");

  4. insert into tb_goods_base (goods_name, category, price) values ("华为手机","家电", 5888);
  5. insert into tb_goods_base (goods_name, category, price) values ("中国李宁","服装", 499);
  6. insert into tb_goods_base (goods_name, category, price) values ("双汇火腿","食品", 15);
  7.  
  8. insert into tb_order_master (money, goods_id, receiver_province, receiver_city, receiver) values (5888, 1, "130000", "130200", "张三");
  9. insert into tb_order_master (money, goods_id, receiver_province, receiver_city, receiver) values (499, 2, "130000", "130800", "李四");
  10. insert into tb_order_master (money, goods_id, receiver_province, receiver_city, receiver) values (15, 3, "110000", 110100, "王五");

  

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

六、Mycat多表查询测试

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

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

  1. create table tb_areas_provinces (id int auto_increment primary key, provinceid varchar(6), province varchar(20));
  2. create table tb_areas_city (id int auto_increment primary key, cityid varchar(6), city varchar(20), provinceid varchar(6));
  3. 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数据节点上。

    

    添加一些测试数据

  1. insert into tb_areas_provinces (provinceid, province) values ("110000", "北京市");
  2. insert into tb_areas_provinces (provinceid, province) values ("120000", "天津市");
  3. insert into tb_areas_provinces (provinceid, province) values ("130000", "河北省");
  4.  
  5. insert into tb_areas_city (cityid, city, provinceid) values ("110100", "市辖区", "110000");
  6. insert into tb_areas_city (cityid, city, provinceid) values ("130200", "唐山市", "130000");
  7. insert into tb_areas_city (cityid, city, provinceid) values ("130800", "承德市", "130000");
  8.  
  9. insert into tb_user_address (user_id, province_id, city_id, address) values (1, "110000", "110100", "清河毛纺厂");
  10. insert into tb_user_address (user_id, province_id, city_id, address) values (2, "130000", "130200", "里二胡同");
  11. insert into tb_user_address (user_id, province_id, city_id, address) values (3, "130000", "130800", "避暑山庄");

    

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

  1. 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;

    

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

  情况二:不在同一数据节点上的多表查询
    需求:查询每一笔订单的收件地址信息(包含省、市信息),其中要用到tb_order_master在dn2数据节点上,tb_areas_provinces和tb_areas_city在dn3数据节点上

  1. 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;

    

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

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

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

    

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

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

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

    

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

    

    重新创建tb_areas_provinces和tb_areas_city两个表

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

    

    

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

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

  1. insert into tb_areas_provinces (provinceid, province) values ("110000", "北京市");
  2. insert into tb_areas_provinces (provinceid, province) values ("120000", "天津市");
  3. insert into tb_areas_provinces (provinceid, province) values ("130000", "河北省");
  4.  
  5. insert into tb_areas_city (cityid, city, provinceid) values ("110100", "市辖区", "110000");
  6. insert into tb_areas_city (cityid, city, provinceid) values ("130200", "唐山市", "130000");
  7. insert into tb_areas_city (cityid, city, provinceid) values ("130800", "承德市", "130000"); 

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

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

    

    说明6:当全局表中的数据发生改变的时候,每个数据节点下的表,也都会发生数据改变。

MySQL运维6-Mycat垂直分库的更多相关文章

  1. 转:三思!大规模MySQL运维陷阱之基于MyCat的伪分布式架构

    在微信公众号看到一篇关于mycat的文章,觉得分析的很不错,给大家分享一下 三思!大规模MySQL运维陷阱之基于MyCat的伪分布式架构 原文链接:https://mp.weixin.qq.com/s ...

  2. mysql运维必会的一些知识点整理

    (1)基础笔试命令考察 1.开启MySQL服务 /etc/init.d/mysqld start service mysqld start systemctl start mysqld 2.检测端口是 ...

  3. 美图秀秀DBA谈MySQL运维及优化

    美图秀秀DBA谈MySQL运维及优化 https://mp.weixin.qq.com/s?__biz=MzI4NTA1MDEwNg==&mid=401797597&idx=2& ...

  4. mysql运维必会的一些知识点整理(转自民工哥)

    (1)基础笔试命令考察 1.开启MySQL服务 /etc/init.d/mysqld start service mysqld start systemctl start mysqld 2.检测端口是 ...

  5. 搭建稳固的MySQL运维体系

    MySQL 监控要点 MySQL 监控要点,主要涉及服务器和 MySQL 两个方向的监控告警. 在这两个监控告警方向需要重点关注监控策略.监控趋势图及报警方式. 监控策略指的是每个监控项的告警阈值,例 ...

  6. MyCat垂直分库

    一.什么是垂直分库 将一类功能的表从一个实例切分到另一个实例,横向扩展实例,增加写负载 目标:将1个实例的4类表拆分多4个实例中 二.垂直切分步骤 2.1收集分析业务模块间的关系,能分几个库 2.2全 ...

  7. MySQL运维工具

    Mysql运维过程中设计的各类工具以及各个场景的的命令行的分类.大体总结如下的xmind图片(.xmind附件 加 Q1123654342). 大体上分为: 实例管理工具.高可用工具.慢日志查询工具. ...

  8. mysql运维

    反反复复装了好多次的mysql,上学的时候从来没有考虑过稳定性,装起来,能跑通,增删改查没有问题万事大吉.参与工作后参与平台搭建和维护,平台的稳定性是首先必须要考虑的问题,之前装mysql使用经历了密 ...

  9. MySQL运维开发相关的所有工具

    http://www.ruzuojun.com/topic/592.html   Percona Toolkit 安装使用 http://cenalulu.github.io/mysql/mysql- ...

  10. 公司没有 DBA,Mysql 运维自己来

    如果你的公司有 DBA,那么我恭喜你,你可以无视 Mysql 运维.如果你的公司没有 DBA,那你就好好学两手 Mysql 基本运维操作,行走江湖,防身必备. 环境:CentOS7 版本: 一.虚拟机 ...

随机推荐

  1. .NET6.0实现IOC容器

    .NET6.0实现IOC容器 IOC的作用这里省略-只对如何使用进行说明. 1. 创建一个.NET6应用程序 这里使用 .NET6.0 WebAPI 应用 2. 声明接口 public interfa ...

  2. JWT(Json Wen Token)原理剖析

    JWT(即json web token),大家先看下面这张图 大家可以观察到,jwt String就是生成后的jwt字符集,其中有两个 "."(注意:jwt校验会对".& ...

  3. jquery实现表格导出Excel

    使用jQuery,jszip.js,FileSaver.js,excel-gen.js插件直接将网页中的table表格导出到本地Excel文件,而不需要经过后台. 导出结果: 实现步骤: 1.进入相关 ...

  4. SQL select关联表查询 统计另一个表合计

    db_order 是记录订单的,  一个订单一条记录.(oid, 运费, 实收金额, 产品KEY.......) db_soid  是记录出售商品的 (id, 商品名称, 售价, 数量, 成本, 标识 ...

  5. Mac SpringBoot项目 Gradle 7.3 转 Maven 手把手教学,包学会~

    导读 最近我手上有个使用Gradle构建的项目,国内使用Gradle的人相对较少.而且我也觉得Gradle的依赖管理方式有些复杂,让我感到有些困惑.因此,我想将项目转换为Maven构建方式.Maven ...

  6. Kafka Stream 高级应用

    9.1将Kafka 与其他数据源集成 对于第一个高级应用程序示例,假设你在金融服务公司工作.公司希望将其现有数据迁移到新技术实现的系统中,该计划包括使用 Kafka.数据迁移了一半,你被要求去更新公司 ...

  7. 【Python爬虫实战】爬虫封你ip就不会了?ip代理池安排上

    前言 在进行网络爬取时,使用代理是经常遇到的问题.由于某些网站的限制,我们可能会被封禁或者频繁访问时会遇到访问速度变慢等问题.因此,我们需要使用代理池来避免这些问题.本文将为大家介绍如何使用IP代理池 ...

  8. C#开源且免费的Windows桌面快速预览神器 - QuickLook

    前言 今天给大家推荐一款由C#开源且免费的Windows桌面快速预览神器:QuickLook. 工具介绍 QuickLook是一款在Windows操作系统上的实用工具,它提供了一种快速预览文件内容的方 ...

  9. WebKit Inside: CSS 样式表解码字符集

    CSS 样式表引入有3种方式: 外部样式表.内部样式表.行内样式,不同的引入方式,解码样式表的字符集原理不一样. 外部样式表 外部样式表由 link 标签引入,当 WebKit 解析到 link 标签 ...

  10. python第2~5章 code

    02基本语法 print('he\aaa\aaa') # 这是一个打印语句,请你看见了不要慌张# 这是一个注释# 注释会被解释器所忽略# print(123+456) 这行代码被注释了,将不会执行pr ...