项目介绍
本项目是一个基于 Go 语言和 MySQL 的编程考试题目生成与管理系统,支持通过环境变量灵活配置。系统实现了自动数据库初始化、灵活的多环境配置机制,并支持自定义编程语言列表。
1. Java 项目常见用法:内嵌 Jar 依赖(ShardingSphere-JDBC)
- 你在 Java 代码里加依赖(Maven/Gradle),
- 然后在自己项目的 resources 目录下写 yaml 配置,
- 最后由你的 SpringBoot 项目 直接启动和管理分表分库,所有 SQL 路由都跑在你的 JVM 进程里。
- 这种方式是ShardingSphere-JDBC,完全是一个数据库中间件,不需要单独运行 Proxy 服务器。
2. Go、Python 等语言常见用法:独立 Proxy(ShardingSphere-Proxy)
- 因为 Go 项目无法直接用 Java 的 ShardingSphere-JDBC(Go 没法 import Java Jar 包),
- 所以只能通过 ShardingSphere-Proxy —— 一个单独运行的数据库代理服务,你把它当成 MySQL 来连。
- 这种方式就需要你 下载并单独启动 ShardingSphere-Proxy,并且所有分表、分库逻辑写在 Proxy 目录的 yaml 文件里。
结论
- Java 项目(尤其是 SpringBoot)可以用 ShardingSphere-JDBC,分表分库都自己管理,配置文件写在自己的项目里。
- Go 项目只能用 ShardingSphere-Proxy,要单独跑代理服务,配置文件不能放到你的 Go 项目里,只能放到 Proxy 的 conf 目录下。
- Go 项目内无法直接用 Java 生态的分库分表依赖。
🚩简单说
- Java 用 ShardingSphere-JDBC,本地配 YAML,项目自带,不用独立 Proxy 服务。
- Go 用 ShardingSphere-Proxy,必须下 Proxy 包、写 conf 目录的 YAML,不能项目内直接生效!
最需要分表的是 **questions** 表(题目表)
原因
- 长期运营后,题库数量往往最先突破几十万甚至百万级。
- 查询和写入都高频(比如 AI 自动出题、用户刷题、组卷等)。
- 单表过大会拖慢 MySQL 的索引、统计和备份。
分片键怎么选?
- 推荐用user_id 作为分片键(即题目归属用户),如果大部分题目由用户生成,或者业务上有“私有题库”/“每人题库隔离”等诉求。
- 或者用题目id hash,适合 AI 全局题库和高并发横向扩展。
常用分片方案
- 按
user_id % N,比如 8 张分表(questions_0 … questions_7) - 或者
id % N,均匀分布
特殊情况
- 如果有很多“公有题目/平台题库”,可以增加特殊表 questions_public。
ShardingSphere-Proxy MySQL 分库分表配置步骤总结
1. 官网下载
- 访问 Apache ShardingSphere官网。
- 下载
apache-shardingsphere-5.5.2-shardingsphere-proxy-bin.tar.gz(或zip)版本。 - 解压至本地任意目录(如 D:\shardingsphere-proxy)。
2. 配置 JDBC 驱动
- 到 MySQL 官方 或 Maven仓库 下载
mysql-connector-java-8.0.x.jar。 - 将 jar 包复制到
apache-shardingsphere-5.5.2-shardingsphere-proxy-bin/lib/目录下。
3. 修改全局配置 global.yaml
-
进入
conf目录,编辑global.yaml。 -
只保留
mode、authority字段,删除不被识别的字段(如 logger、proxy)。 -
典型配置示例:
mode: type: Standalone repository: type: File props: path: data authority: users: - user: root password: 123456 privilege: type: ALL_PERMITTED
4. 配置分库分表 database-sharding.yaml
-
按实际业务需求编辑 database-sharding.yaml(或直接新建如 exam_system.yaml,文件名即逻辑库名)。
-
配置 dataSources 节点(每个物理库的信息),以及 rules 节点(分片策略)。
-
示例:
dataSources: ds_0: url: jdbc:mysql://127.0.0.1:3306/exam_0?serverTimezone=UTC&useSSL=false username: root password: 123456 ds_1: url: jdbc:mysql://127.0.0.1:3306/exam_1?serverTimezone=UTC&useSSL=false username: root password: 123456 rules: - !SHARDING tables: questions: actualDataNodes: ds_${0..1}.questions_${0..7} tableStrategy: standard: shardingColumn: user_id shardingAlgorithmName: questions_inline shardingAlgorithms: questions_inline: type: INLINE props: algorithm-expression: questions_${user_id % 8}
5. 检查和准备物理数据库
- 在各物理数据库(如 exam_0、exam_1)提前建好分表(如 questions_0, questions_1, …, questions_7)。
- 建表 SQL 结构保持一致。
6. 启动 Proxy 服务
- 使用命令行进入 Proxy 解压目录,执行启动脚本:
- Windows:
bin\start.bat - Linux/Mac:
bin/start.sh
- Windows:
- 观察控制台日志,无报错即启动成功。
7. 插入并验证数据分片
- 使用 Go、Navicat、DBeaver 等工具,通过 Proxy 端口(如 3307)连接逻辑库,往逻辑表(如 questions)插入多条测试数据(user_id 不同)。
- 用 Navicat/命令行直接连物理 MySQL,查询各物理分表数据量,验证分片路由效果。
8. 典型问题及排查方法
- global.yaml 有无效字段 → 删除 logger/proxy/provider/schemaName 等
- No suitable driver → 检查 lib 目录下有无 MySQL 驱动 jar
- 分表不可见 → Proxy 端口只暴露逻辑表,分表需物理库查看
- 无法连接 → 检查端口号、用户名、密码、数据库权限
9. 最终效果
- 各分表数据均匀分布,分片规则生效。
- 日志提示 Proxy 启动成功,可正常用逻辑表操作分库分表数据。
参考官方文档:ShardingSphere-Proxy 配置文档
555

被折叠的 条评论
为什么被折叠?



