Go语言 ShardingSphere 分表实战

项目介绍

本项目是一个基于 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

  • 只保留 modeauthority 字段,删除不被识别的字段(如 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
  • 观察控制台日志,无报错即启动成功。

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 配置文档

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值