我花了一个周末,总算在Windows本机上把“基于MySQL使用ShardingSphere-Proxy做分库分表和读写分离”这条链路完整跑通了,还顺手用Python把业务侧调用也接上。之前查资料时最大的感受是:官方文档偏Linux,网上教程又大量在讲ShardingSphere-JDBC,真正讲Proxy独立部署、Windows全流程、再配合Python连接的少之又少,而且不少配置片段一抄就报错。
这篇文章就把我实际验证过的方案完整梳理出来,覆盖MySQL 8.0 + ShardingSphere-Proxy 5.4.1 + Python pymysql的完整安装、配置、启动和验证过程,包含分库分表路由演示、一主一从读写分离演示,以及我踩过的各种坑。适合三种人看:准备面试想有一个本地可复现的分库分表Demo的开发者、要在企业项目里评估中间件选型的后端工程师、以及第一次接触ShardingSphere-Proxy、被Windows环境卡住的新手。
1. 整体设计思路:为什么这个方案最适合本地复现
1.1 先搞懂Proxy和JDBC两种模式的差异
ShardingSphere有两条主流落地路径:ShardingSphere-JDBC和ShardingSphere-Proxy。JDBC模式是嵌入式SDK,应用通过DataSource直接拿连接,分片逻辑在应用进程内执行;Proxy模式则是一个独立代理服务,应用把Proxy当作普通MySQL数据库去连,分片路由在代理层完成。
如果只在本地做技术验证,我更推荐Proxy模式,原因很直接:JDBC模式改动侵入大,你得在Java工程里引入依赖、配置数据源、替换MyBatis/JPA的连接池,验证成本高;而Proxy模式只需要一个MySQL客户端或者pymysql就能连,业务侧不用改一行SQL。
打个比方:JDBC模式相当于你把“前台接待”直接安排在每个部门里,每个部门都有一套自己的接待规则;Proxy模式则像是单独租了一间前台,所有客户先到前台,再由前台按规则把人分流到不同部门。前台坏了只影响前台,部门内部不用动。
1.2 逻辑拓扑与库表规划
本地验证不需要搞很多机器,我规划了一个MySQL主实例(3306)和一个从实例(3307),主实例上建两个业务库ds0和ds1用于分库分表演示,主从两个实例各建一个app_shop库用于读写分离演示。
分库分表选择了最常见的订单场景,逻辑表t_order拆成4张物理表:
- 分库键:
user_id,按user_id % 2路由到ds0或ds1 - 分表键:
order_id,按order_id % 2路由到t_order_0或t_order_1 - 主键策略:使用雪花算法生成分布式ID,确保多个分片下的主键全局唯一
选择取模算法是为了直观。HASH_MOD、MOD这类算法在演示时能一眼看出数据分布规律,排查问题方便,后续如果需要哈希一致性算法,也只是改配置的问题。
1.3 为什么把读写分离拆成独立逻辑库
我知道ShardingSphere允许把读写分离和分库分表配置在同一个逻辑库中,数据源可以是读写分离组。但我强烈建议第一次做本地Demo时拆成两个逻辑库:sharding_db专门演分库分表,readwrite_db专门演读写分离。
原因是组合使用时,一旦数据分布不对,你得同时怀疑分片规则、读写分离规则、主从同步状态三个环节,排查链路太长。拆开后可以让每个环节变成“黑盒”,先挨个验证通过,再考虑合并。这不是能力问题,是排障效率问题。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Windows环境准备与ShardingSphere-Proxy安装
2.1 JDK环境与目录规划
ShardingSphere-Proxy 5.4.1基于Java构建,要求JDK 8及以上,我直接装了JDK 17。Windows下最重要的是把环境变量配好:
bash复制JAVA_HOME=D:\Java\jdk-17
# 在Path中追加
%JAVA_HOME%\bin
验证方式老生常谈,但确实有效:
bash复制java -version
如果输出显示openjdk version "17.0.x",说明环境没问题。这里有个容易忽略的点:很多开发机装了多个JDK,命令行里java可能指向旧版本,最好在cmd中重新打开一个窗口验证,避免使用了缓存PATH。
目录规划建议直接建在某个盘的根目录下,不要带中文和空格:
| 组件 | 目录 |
|---|---|
| JDK | D:\Java\jdk-17 |
| ShardingSphere-Proxy | D:\shardingsphere-proxy-5.4.1 |
| MySQL主实例 | D:\mysql-8.0\mysql-3306 |
| MySQL从实例 | D:\mysql-8.0\mysql-3307 |
路径中带中文或空格,在启动脚本解析时经常出诡异问题,这个坑我踩过一次之后就长记性了。
2.2 下载安装ShardingSphere-Proxy
从Apache ShardingSphere官网下载二进制发布包,选择apache-shardingsphere-proxy-5.4.1-bin.tar.gz对应Windows的ZIP包,解压到上述目录。
解压后目录结构里重点关注两个目录:conf存放配置,bin存放启停脚本,lib存放依赖包。
这里有个从4.x流传到5.x的大坑:官方发布包默认不一定带MySQL驱动。如果启动后代理能起来、但连接逻辑库时报找不到驱动或者无法加载数据源,先去检查lib目录里有没有mysql-connector-j*.jar。如果没有,从Maven中央仓库下载mysql-connector-j-8.0.33.jar,直接丢进lib目录。注意版本要和后端MySQL 8.0匹配,别用5.x的老驱动去连MySQL 8。
2.3 准备两个MySQL实例模拟主从
读写分离必须要有一主一从两个真实MySQL实例,但Windows本机装两个MySQL实例并不复杂。
我准备了两个独立目录mysql-3306和mysql-3307,各自维
