一、为什么要分库分表?

单机 MySQL 的极限大致在:

维度经验值
单表行数≤ 1 000 万行(B+ 树三层)
单库磁盘≤ 2 TB(SSD)
单机 QPS≤ 1 万(InnoDB)

当业务继续增长,数据量和并发量都会突破单机天花板,此时就需要 水平拆分
业内常见方案:

  • Client 模式:ShardingSphere-JDBC、TDDL
  • Proxy 模式:MyCat、ShardingSphere-Proxy、Vitess

今天的主角是 MyCat —— 轻量级、配置简单、社区成熟,适合中小团队快速落地。


二、MyCat 是什么?

一句话:
MyCat 是 MySQL 协议的代理中间件,对外表现为“一台”大 MySQL,内部帮你把 SQL 路由到真正的分片。

核心概念:

名词作用
schema逻辑库(业务代码看到的)
table逻辑表(可配置分片规则)
dataNode分片节点(逻辑库+物理库名)
dataHost物理实例(主从/集群)
rule分片算法(取模、范围、哈希等)

三、实战目标

  • 3 台 MySQL 物理机
  • 订单表 t_order 按 user_id 取模 分成 6 张分表
  • 商品表 t_product 数据量少 → 全局广播表
  • 配置表 t_config 全局广播
  • Java 代码零侵入,只连 MyCat 8066 端口

四、环境准备

角色IP:Port备注
MyCat 节点192.168.1.10:8066 / 9066代理端口/管理端口
MySQL-1192.168.1.100:3306主库
MySQL-2192.168.1.101:3306主库
MySQL-3192.168.1.102:3306主库

4.1 安装 MyCat

wget http://dl.mycat.org.cn/1.6-RELEASE/Mycat-server-1.6-RELEASE-20161028204710-linux.tar.gz
tar -zxvf Mycat-server-1.6-RELEASE-*.tar.gz
cd mycat

目录结构:

mycat├─ bin/mycat       # 启停脚本├─ conf/*.xml      # 配置文件└─ logs            # 日志

五、MySQL 端建库建表

每台机执行:

CREATE DATABASE IF NOT EXISTS db1 DEFAULT CHARSET utf8mb4;
CREATE DATABASE IF NOT EXISTS db2 DEFAULT CHARSET utf8mb4;
CREATE DATABASE IF NOT EXISTS db3 DEFAULT CHARSET utf8mb4;-- 订单分表
CREATE TABLE db1.t_order_0 (id BIGINT AUTO_INCREMENT PRIMARY KEY,user_id BIGINT NOT NULL,amount DECIMAL(10,2) NOT NULL,create_time DATETIME DEFAULT CURRENT_TIMESTAMP
);
CREATE TABLE db1.t_order_1 LIKE db1.t_order_0;CREATE TABLE db2.t_order_2 LIKE db1.t_order_0;
CREATE TABLE db2.t_order_3 LIKE db1.t_order_0;CREATE TABLE db3.t_order_4 LIKE db1.t_order_0;
CREATE TABLE db3.t_order_5 LIKE db1.t_order_0;-- 广播表(每台库一份)
CREATE TABLE db1.t_product (id INT PRIMARY KEY,name VARCHAR(100),price DECIMAL(8,2)
);
CREATE TABLE db2.t_product LIKE db1.t_product;
CREATE TABLE db3.t_product LIKE db1.t_product;CREATE TABLE db1.t_config (k VARCHAR(50) PRIMARY KEY,v VARCHAR(200)
);
CREATE TABLE db2.t_config LIKE db1.t_config;
CREATE TABLE db3.t_config LIKE db1.t_config;

六、MyCat 配置

6.1 server.xml —— 用户、逻辑库

<user name="root" defaultAccount="true"><property name="password">123456</property><property name="schemas">shop</property>
</user>

6.2 schema.xml —— 逻辑表、节点、主机

<schema name="shop" checkSQLschema="false" sqlMaxLimit="100"><!-- 1) 分片表 --><table name="t_order" dataNode="dn1,dn2,dn3" rule="mod-long" /><!-- 2) 广播表 --><table name="t_product" dataNode="dn1,dn2,dn3" type="global" /><table name="t_config"  dataNode="dn1,dn2,dn3" type="global" />
</schema><!-- 数据节点 -->
<dataNode name="dn1" dataHost="host1" database="db1" />
<dataNode name="dn2" dataHost="host2" database="db2" />
<dataNode name="dn3" dataHost="host3" database="db3" /><!-- 物理主机 -->
<dataHost name="host1" maxCon="1000" minCon="10" balance="0" writeType="0" dbType="mysql"><heartbeat>select user()</heartbeat><writeHost host="hostM1" url="192.168.1.100:3306" user="root" password="mysql123" />
</dataHost>
<dataHost name="host2" ...> ... </dataHost>
<dataHost name="host3" ...> ... </dataHost>

6.3 rule.xml —— 取模算法

<tableRule name="mod-long"><rule><columns>user_id</columns><algorithm>mod-long</algorithm></rule>
</tableRule><function name="mod-long" class="io.mycat.route.function.PartitionByMod"><property name="count">3</property> <!-- 3 节点 × 2 表 = 6 分片 -->
</function>

七、启动 MyCat

bin/mycat start   # 启动
tail -f logs/mycat.log  # 观察 “success”

测试连通:

mysql -uroot -p123456 -h127.0.0.1 -P8066 -Dshop

八、Java 代码示例(零侵入)

8.1 Maven 依赖

<dependency><groupId>mysql</groupId><artifactId>mysql-connector-java</artifactId><version>8.0.28</version>
</dependency>

8.2 连接池配置

spring:datasource:url: jdbc:mysql://192.168.1.10:8066/shop?useSSL=false&serverTimezone=UTCusername: rootpassword: 123456driver-class-name: com.mysql.cj.jdbc.Driver

8.3 订单 DAO(MyBatis 示例)

@Mapper
public interface OrderMapper {@Insert("INSERT INTO t_order(user_id,amount) VALUES(#{userId},#{amount})")void insert(@Param("userId") Long userId, @Param("amount") BigDecimal amount);@Select("SELECT * FROM t_order WHERE user_id = #{userId}")List<Order> findByUserId(Long userId);
}

8.4 商品 DAO

@Select("SELECT * FROM t_product WHERE id = #{id}")
Product getProduct(Integer id);

商品表全局广播,JOIN 时不会跨库:

SELECT o.id, o.amount, p.name
FROM t_order o
JOIN t_product p ON o.product_id = p.id
WHERE o.user_id = 123;   -- 只在 1 个分片执行

九、扩容与运维

9.1 水平扩容(从 3 → 6 节点)

  1. 新增 3 台 MySQL,建 db4/db5/db6,建相同 6 张分表 t_order_6 … t_order_11
  2. 修改 rule.xmlcount 改成 6。
  3. mysqldump / mydumper 把旧数据按 user_id mod 6 重新分布。
  4. 灰度切流 → 观察 → 下线旧节点。

9.2 一致性校验(广播表)

# 1. 安装 percona-toolkit
pt-table-checksum h=192.168.1.100,u=checksum_user,p=xxx \--databases=db1,db2,db3 --tables=t_product,t_config
# 2. 差异行修复
pt-table-sync --print --execute ...  # 自动生成修复 SQL

十、踩坑与最佳实践

说明解决方案
全局序列自增主键在分片后冲突雪花算法 / MyCat 全局序列
深分页LIMIT 1000000,10 会拉全表游标分页 / ES 搜索
跨分片 JOINMyCat 只能内存合并反范式冗余或应用层拼装
广播表 DDL漏执行导致查询报错统一脚本 + pt-osc

十一、小结

  • MyCat = 透明代理 + 路由规则 + 全局表 + 读写分离,几分钟就能把单机 MySQL 扩展到百节点百亿行
  • 小表全局广播,大表水平拆分,业务代码零改动。
  • 监控、扩容、一致性校验要提前规划,否则 3 个月后追悔莫及。

参考资料
MyCat 官方文档 https://www.yuque.com/books/share/05b6e74e-9a1a-4e5d-a21e-4f93e9e3d5a3

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/pingmian/93037.shtml
繁体地址,请注明出处:http://hk.pswp.cn/pingmian/93037.shtml
英文地址,请注明出处:http://en.pswp.cn/pingmian/93037.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

电池模组奇异值分解降阶模型

了解如何将奇异值分解 (SVD) 降阶模型 (ROM) 应用于电池模块热模拟。挑战随着电池模块在电动汽车和储能系统中的重要性日益提升&#xff0c;其热性能管理也成为一项重大的工程挑战。高功率密度会产生大量热量&#xff0c;如果散热不当&#xff0c;可能导致电池性能下降、性能下…

《Python函数:从入门到精通,一文掌握函数编程精髓》

坚持用 清晰易懂的图解 代码语言&#xff0c;让每个知识点变得简单&#xff01; &#x1f680;呆头个人主页详情 &#x1f331; 呆头个人Gitee代码仓库 &#x1f4cc; 呆头详细专栏系列 座右铭&#xff1a; “不患无位&#xff0c;患所以立。” Python函数&#xff1a;从入门到…

【记录贴】STM32 I2C 控制 OLED 卡死?根源在 SR1 与 SR2 的读取操作

问题描述最近在复用以前STM32F407控制OLED的代码&#xff0c;移植到STM32F103 上&#xff0c;使用硬件 I2C 通信方式。按照常规流程&#xff0c;先发送 OLED 的从机地址&#xff0c;OLED 有正常应答&#xff0c;但当发送第一个控制命令&#xff08;0xAE&#xff09;前的控制字节…

【AI驱动的语义通信:突破比特传输的下一代通信范式】

文章目录1 语义通信简介1.1 基本概念&#xff1a;什么是语义通信&#xff1f;语义通信的核心目标1.2 基本结构&#xff1a;语义通信系统结构语义通信系统的通用结构组成语义通信系统的结构关键模块1.3 基于大模型的语义通信关键技术&#x1f9e0;语义通信系统中AI大模型的设计建…

网络原理-HTTP

应用层自定义协议自定义协议是指根据特定需求设计的通信规则&#xff0c;用于设备或系统间的数据交换。其核心在于定义数据结构、传输方式及处理逻辑。协议结构示例典型的自定义协议包含以下部分&#xff1a;头部&#xff08;Header&#xff09;&#xff1a;标识协议版本、数据…

ROS配置debug指南

一. 安装插件 下面的这一个插件过期了需要用下面的这一个插件来替换:二. 设置CMakeLists.txt的编译模式 set(CMAKE_BUILD_TYPE "Debug") set(CMAKE_CXX_FLAGS_DEBUG "$ENV{CXXFLAGS} -O0 -Wall -g -ggdb") set(CMAKE_CXX_FLAGS_RELEASE "$ENV{CXXFLAG…

微软正式将GPT-5接入Microsoft Copilot Studio(国际版)

微软宣布正式在Microsoft Copilot Studio&#xff08;国际版&#xff09;中集成GPT-5&#xff0c;推动智能体构建能力实现突破性升级。此次更新不仅为企业用户带来更高效的响应速度、更精准的语境理解能力&#xff0c;还通过增强的逻辑推理功能&#xff0c;显著提升了AI交互的深…

微算法科技(NASDAQ:MLGO)通过蚁群算法求解资源分配的全局最优解,实现低能耗的区块链资源分配

随着区块链网络规模的不断扩大和业务需求的日益复杂&#xff0c;资源分配问题逐渐成为制约其发展的关键因素之一。传统的区块链资源分配方法往往存在效率低下、能耗过高、难以达到全局最优解等问题。高能耗不仅增加了运营成本&#xff0c;还对环境造成了较大的压力。因此&#…

深入浅出JVM:Java虚拟机的探秘之旅

深入浅出JVM&#xff1a;Java虚拟机的探秘之旅一、JVM 初相识&#xff1a;揭开神秘面纱 在 Java 的世界里&#xff0c;JVM&#xff08;Java Virtual Machine&#xff0c;Java 虚拟机&#xff09;就像是一个神秘的幕后大 boss&#xff0c;掌控着 Java 程序运行的方方面面。你可以…

Nginx学习笔记(八)—— Nginx缓存集成

&#x1f5c4;&#x1f5c4; Nginx缓存集成 &#x1f4cc;&#x1f4cc; 一、缓存核心价值 #mermaid-svg-CNji1KUDOsF8MwoY {font-family:"trebuchet ms",verdana,arial,sans-serif;font-size:16px;fill:#333;}#mermaid-svg-CNji1KUDOsF8MwoY .error-icon{fill:#5522…

httpx 设置速率控制 limit 时需要注意 timeout 包含 pool 中等待时间

假设通过 httpx.Client 设置 limit 速率控制后&#xff0c;同时发起多个请求访问 youtube。并且由于科学原因一直连接不上 假设一共 4 个连接&#xff0c;max_connection2&#xff0c;timeout5s。 默认会发生的情况不是前两个连接 tcp 握手 timeout&#xff0c;后两个连接再发起…

【网络】TCP/UDP总结复盘

1.UDP的格式2.TCP的格式3.TCP是来解决什么问题的&#xff1f;答&#xff1a;解决IP层的不可靠传输问题&#xff0c;可能数据包丢失、损坏、重复等为上层应用层提高可靠有序的数据传输服务通过校验和、确认应答机制、序列号来解决不可靠传输和无序性问题通过流量控制--->>…

Nginx 配置中,root 和 alias 区别

在 Nginx 配置中&#xff0c;root 和 alias 都用于定义文件路径&#xff0c;但它们的行为有重要区别&#xff0c;特别是 路径拼接方式 和 末尾斜杠 (/) 的影响。1. root 和 alias 的区别 (1) root 指令 作用&#xff1a;root 会将 location 的 URI 拼接到 root 路径后面&#x…

基于vue.js的无缝滚动

方法一&#xff1a;基于requestAnimationFrame demo <template><h-page-container class"hoem-page"><h1>无缝滚动</h1><h2>垂直方向</h2><div class"container1"><AutoScroll :data"list" :item-…

【Linux学习|黑马笔记|Day4】IP地址、主机名、网络请求、下载、端口、进程管理、主机状态监控、环境变量、文件的上传和下载、压缩和解压

【DAY4】 今天看的是Linux第四章剩余部分 至此Linux暂时学到这&#xff0c;第五章还包含很多软件的安装&#xff0c;但是等我要用的时候再装吧 我现在只装了MySQL8.0&#xff0c;具体教程请看笔记安装教程 内容包含更换镜像源和安装配置步骤 文章目录【DAY4】6&#xff09;IP地…

【合新通信】射频光纤传输模块详解

射频光纤传输模块是一种将射频(RF)信号通过光纤进行传输的关键设备&#xff0c;广泛应用于通信、军事、广播电视等领域。以下是关于射频光纤传输模块的全面介绍&#xff1a;基本原理与组成射频光纤传输模块主要由以下几部分组成&#xff1a;电光转换单元&#xff1a;将输入的射…

【信息收集】从GET到POST:破解登录表单的全流程

目标&#xff1a;将浏览器数据代理至BP的proxy模块。将个人PHP的留言板项目首页登录数据包代理至BP&#xff0c;并转发至intrder模块&#xff0c;进行暴力破解。免责声明&#xff1a;本文章内容仅用于个人网络安全知识学习与研究&#xff0c;严禁用于任何未经授权的攻击或非法活…

【办公自动化】如何使用Python操作PPT和自动化生成PPT?

在现代商业和教育环境中&#xff0c;PowerPoint演示文稿是信息传递的重要工具。通过Python自动化PPT创建和编辑过程&#xff0c;可以大幅提高工作效率&#xff0c;特别是在需要批量生成或更新演示文稿的场景下。本文将介绍如何使用python-pptx库实现PPT自动化&#xff0c;并提供…

18 ABP Framework 模块管理

ABP Framework 模块管理 概述 该页面详细介绍了在 ABP Framework 解决方案中使用 ABP CLI 及相关工具添加、更新和管理模块的方法。模块管理是 ABP 模块化架构的核心&#xff0c;支持可重用业务和基础设施功能的集成。模块通常以 NuGet 和/或 NPM 包的形式分发&#xff0c;有时…

外观模式C++

外观模式&#xff08;Facade Pattern&#xff09;是一种结构型设计模式&#xff0c;它为复杂系统提供一个简化的接口&#xff0c;隐藏系统内部的复杂性&#xff0c;使客户端能够更轻松地使用系统。这种模式通过创建一个外观类&#xff0c;封装系统内部的交互逻辑&#xff0c;客…