首页 > 数据库 >MySQL运维6-Mycat垂直分库

MySQL运维6-Mycat垂直分库

时间:2023-12-17 18:35:31浏览次数:38  
标签:city 分库 运维 insert Mycat values tb id areas

一、垂直分库场景

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

  

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

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));

  

 

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

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, "王五");

  

  以上是对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数据节点上。

    

    添加一些测试数据

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", "避暑山庄");

    

    现多表查询需求是:根据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;

    

    说明:同一数据节点内的多表联合查询在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;

    

    这个时候就报错了, 报错的原因是:夸数据节点的多表查询,在执行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两个表

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));  

    

    

    说明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的每个数据节点的表中都添加成功。

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

    

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

标签:city,分库,运维,insert,Mycat,values,tb,id,areas
From: https://www.cnblogs.com/Se7eN-HOU/p/17908887.html

相关文章

  • 菜鸡运维成长记-第二周
    文本处理工具总结:查看文本文件内容:cat:-A|--show-all#显示所有控制符-n|--number#对显示出的每一行进行编号-b|--number-nonblank#非空行编号-s|--squeeze-blank#压缩连续的空行成一行nl:显示行号,相当于cat-btac:逆向显示文本内容,行倒序显示rev:将同一行的内......
  • 某航空公司引入运维管理软件,提升信息化运营效率
      在信息化时代,企业信息化的程度已经成为影响其核心竞争力的重要因素。某航空公司作为行业领导者,积极推进信息化建设,不断提升运维管理水平,以适应日益激烈的市场竞争。该公司成功引入了一款先进的运维管理软件,实现了对IT设备的集中监控、自动化管理和安全管理,显著提升了信息化业......
  • SRE Google运维解密 第三章
    第二部分指导思想本部分将描述SRE日常工作背后的指导思想——工作模式、行为方式,以及平时运维工作中关注的重点等。第三章拥抱风险管理风险在构建系统的过程中,可靠性的进一步提升成本并不是线性增加的。高昂的成本主要存在于以下两个维度:冗余物理服务器/计算资源的成......
  • 云平台运维过程问题,以及解决方法
    1.裸金属替换下发,后bond1网络不通或者丢包。:排查用到的命令:ifdown  ifconfigeth0down/up ip-bra  demsg|grepDMI查看服务器厂家 、cat/etc/os-release查看操作系统版本#用带外看服务器的状态ipmitool-Ilanplus-H22.234.11.158-Uadmin-PPCfwq@psbc202......
  • openGauss学习笔记-161 openGauss 数据库运维-备份与恢复-导出数据-使用gs_dump和gs_d
    openGauss学习笔记-161openGauss数据库运维-备份与恢复-导出数据-使用gs_dump和gs_dumpall命令导出数据-导出所有数据库-无权限角色导出数据161.1无权限角色导出数据gs_dump和gs_dumpall通过-U指定执行导出的用户帐户。如果当前使用的帐户不具备导出所要求的权限时,会无法导出......
  • openGauss学习笔记-160 openGauss 数据库运维-备份与恢复-导出数据-使用gs_dump和gs_d
    openGauss学习笔记-160openGauss数据库运维-备份与恢复-导出数据-使用gs_dump和gs_dumpall命令导出数据-导出所有数据库-导出全局对象160.1导出全局对象openGauss支持使用gs_dumpall工具导出所有数据库公共的全局对象,包含数据库用户和组、表空间及属性(例如:适用于数据库整体的......
  • 【漫话运维】信创化浪潮下,如何实现运维丝滑过渡
    点击立即体验WeOps简便易用的平台,全面的监管控功能,从工具、人员到流程,全面应对挑战,让信创化变得更加便捷和可控。嘉为蓝鲸WeOps一体化平台嘉为蓝鲸WeOps一体化运维平台,是为企业的IT运维部门提供覆盖资源管理、监控告警、健康扫描、运维工具、知识库、IT服务台等多项功能为一体的运......
  • Java云架构、云服务、云运维的医院信息管理系统源码(云HIS)
    医院信息系统(HIS)经历了从手工到单机再到局域网的两个阶段,随着云计算、大数据新技术迅猛发展,基于云计算的医院信息系统将逐步取代传统局域网HIS,以适应人们对医疗卫生服务越来越高的要求。利用云计算、大数据等现代信息技术研发的医疗卫生信息平台(HIP)实现了医院信息化从局域网向互......
  • MySQL运维5-Mycat配置
    一、schema.xml1.1简介schema.xml作为Mycat中最重要的配置文件之一,涵盖了Mycat的逻辑库、逻辑表、分片规则、分片节点即数据源的配置。主要包括一下三组标签schema标签datanode标签datahost标签1.2schema标签用于定于Mycat实例中的逻辑库,......
  • openGauss学习笔记-159 openGauss 数据库运维-备份与恢复-导出数据-使用gs_dump和gs_d
    openGauss学习笔记-159openGauss数据库运维-备份与恢复-导出数据-使用gs_dump和gs_dumpall命令导出数据-导出所有数据库-导出所有数据库159.1导出所有数据库openGauss支持使用gs_dumpall工具导出所有数据库的全量信息,包含openGauss中每个数据库信息和公共的全局对象信息。可根......