mycat之分表分库

本文涉及的产品
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
云数据库 RDS MySQL,高可用系列 2核4GB
简介: mycat,分表分库
环境:master:192.168.225.128  slave:192.168.225.129
master和slave上面各有两个数据库db01,db02。users表存放在db01,db02中都有,但是不做分表,查询随机发送到哪台服务器。item表其中一部分数据存放在master的db02中,另一部分数据存放在slave的db02中。
item_detail依赖父表进行分片(也即E-R分片策略),两个表的关联关系为t_user_detail.user_id=t_user.id。分片规则用取模的方式,如果在分表的时候还要做读写分离,只需要在writeHost下面添加readhost选项即可。

1,mycat安装部署

参考上一篇博文:
link

2,修改配置文件

[root@slave conf]# cat schema.xml
<?xml version="1.0"?>  
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">  
<mycat:schema xmlns:mycat="http://io.mycat/">
 
   <!-- 设置表的存储方式.schema name="TESTDB" 与 server.xml中的 TESTDB 设置一致  -->  
   <schema name="MYDB" checkSQLschema="false" sqlMaxLimit="100">  

   <!-- global表示全局表,即表示users表所有记录都在node_db01中,不做拆分,如果user表很小,当业务需要这个表和其他大表进行join的时候,也可以-->
                    <!--将这个users表在每个库中都保存一份,只需要在node_db01后面添加其他的库名即可。-->  
       <table name="users" primaryKey="id" type="global" dataNode="node_db01" />
       <table name="item" primaryKey="id" dataNode="node_db02,node_db03" rule="mod-long">  
               <childTable name="item_detail" primaryKey="id" joinKey="item_id" parentKey="id" />  
       </table>  
   </schema>  
 
   <!-- 设置dataNode 对应的数据库,及 mycat 连接的地址dataHost -->  
    <dataNode name="node_db01" dataHost="dataHost01" database="db01" />
   <dataNode name="node_db02" dataHost="dataHost01" database="db02" />  
   <dataNode name="node_db03" dataHost="dataHost02" database="db02" />  
 
   <!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->  
   <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">  
           <heartbeat>select user()</heartbeat>  
           <writeHost host="slave" url="192.168.225.129:3306" user="root" password="123456"/>  
   </dataHost>  
<dataHost name="dataHost02" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
           <heartbeat>select user()</heartbeat>
           <writeHost host="master" url="192.168.225.128:3306" user="root" password="123456"/>
   </dataHost>
</mycat:schema>  

3,测试:

create database db01;  
create database db02;  
 
CREATE TABLE users (  
   id INT NOT NULL AUTO_INCREMENT,  
   name varchar(50) NOT NULL default '',  
   indate DATETIME  default null,  
   PRIMARY KEY (id)  
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;  
 
CREATE TABLE item (  
   id INT NOT NULL AUTO_INCREMENT,  
   value INT NOT NULL default 0,  
   indate DATETIME default  NULL ,
   PRIMARY KEY (id)  
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;  
 
CREATE TABLE item_detail (  
   id INT NOT NULL AUTO_INCREMENT,  
   value INT NOT NULL default 0,  
   name varchar(50) NOT NULL default '',  
   item_id INT NOT NULL,  
   PRIMARY KEY (id),  
   key (item_id)  
)AUTO_INCREMENT= 1 ENGINE=InnoDB DEFAULT CHARSET=utf8;  


#mysql -umy -p123456 -h192.168.225.129 -P8066
>insert into item(id,value,indate) values(1,100,now());  
>insert into item_detail(value,name,item_id) values('40','pad',1);  
>insert into item(id,value,indate) values(2,100,now());  
>insert into item_detail(value,name,item_id) values('50',phone,2);

*实际生产环境:
** 在实际中ip1和ip2是主从关系,假设dataHost01对应db1,dataHost02对应db2,这样ip1和ip2中存储了db1的分片数据,ip3中存储了db2的分片数据,在写操作的时候,mycat会将对应数据写入ip1,通过主从通过到ip2, 另一部分数据写入ip3
在读操作的时候,mycat会从ip2和ip3中获取对应数据合并后返回客户端。配置如下:

   <!-- mycat 逻辑主机dataHost对应的物理主机.其中也设置对应的mysql登陆信息 -->  
   <dataHost name="dataHost01" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">  
           <heartbeat>select user()</heartbeat>  
           <writeHost host="slave" url="192.168.225.129:3306" user="root" password="123456"/>  
       <readHost host="third" url="192.168.225.130:3009" user="root" password="123456"/>
   </dataHost>  
<dataHost name="dataHost02" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql" dbDriver="native">
           <heartbeat>select user()</heartbeat>
           <writeHost host="master" url="192.168.225.128:3306" user="root" password="123456"/>
   </dataHost>
</mycat:schema>  
相关实践学习
每个IT人都想学的“Web应用上云经典架构”实战
本实验从Web应用上云这个最基本的、最普遍的需求出发,帮助IT从业者们通过“阿里云Web应用上云解决方案”,了解一个企业级Web应用上云的常见架构,了解如何构建一个高可用、可扩展的企业级应用架构。
MySQL数据库入门学习
本课程通过最流行的开源数据库MySQL带你了解数据库的世界。 &nbsp; 相关的阿里云产品:云数据库RDS MySQL 版 阿里云关系型数据库RDS(Relational Database Service)是一种稳定可靠、可弹性伸缩的在线数据库服务,提供容灾、备份、恢复、迁移等方面的全套解决方案,彻底解决数据库运维的烦恼。 了解产品详情:&nbsp;https://www.aliyun.com/product/rds/mysql&nbsp;
目录
相关文章
|
2天前
|
搜索推荐 编译器 Linux
一个可用于企业开发及通用跨平台的Makefile文件
一款适用于企业级开发的通用跨平台Makefile,支持C/C++混合编译、多目标输出(可执行文件、静态/动态库)、Release/Debug版本管理。配置简洁,仅需修改带`MF_CONFIGURE_`前缀的变量,支持脚本化配置与子Makefile管理,具备完善日志、错误提示和跨平台兼容性,附详细文档与示例,便于学习与集成。
265 116
|
17天前
|
域名解析 人工智能
【实操攻略】手把手教学,免费领取.CN域名
即日起至2025年12月31日,购买万小智AI建站或云·企业官网,每单可免费领1个.CN域名首年!跟我了解领取攻略吧~
|
11天前
|
安全 Java Android开发
深度解析 Android 崩溃捕获原理及从崩溃到归因的闭环实践
崩溃堆栈全是 a.b.c?Native 错误查不到行号?本文详解 Android 崩溃采集全链路原理,教你如何把“天书”变“说明书”。RUM SDK 已支持一键接入。
655 220
|
5天前
|
数据采集 人工智能 自然语言处理
Meta SAM3开源:让图像分割,听懂你的话
Meta发布并开源SAM 3,首个支持文本或视觉提示的统一图像视频分割模型,可精准分割“红色条纹伞”等开放词汇概念,覆盖400万独特概念,性能达人类水平75%–80%,推动视觉分割新突破。
325 32
Meta SAM3开源:让图像分割,听懂你的话
|
9天前
|
人工智能 移动开发 自然语言处理
2025最新HTML静态网页制作工具推荐:10款免费在线生成器小白也能5分钟上手
晓猛团队精选2025年10款真正免费、无需编程的在线HTML建站工具,涵盖AI生成、拖拽编辑、设计稿转代码等多种类型,均支持浏览器直接使用、快速出图与文件导出,特别适合零基础用户快速搭建个人网站、落地页或企业官网。
1512 157
|
存储 人工智能 监控
从代码生成到自主决策:打造一个Coding驱动的“自我编程”Agent
本文介绍了一种基于LLM的“自我编程”Agent系统,通过代码驱动实现复杂逻辑。该Agent以Python为执行引擎,结合Py4j实现Java与Python交互,支持多工具调用、记忆分层与上下文工程,具备感知、认知、表达、自我评估等能力模块,目标是打造可进化的“1.5线”智能助手。
893 61
|
7天前
|
编解码 Linux 数据安全/隐私保护
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
教程分享免费视频压缩软件,免费视频压缩,视频压缩免费,附压缩方法及学习教程
290 140