一、ShardingProxy vs ShardingJDBC:如何选择?

架构对比

客户端方案:应用 → ShardingJDBC → 多数据库
服务端方案:应用 → ShardingProxy → 多数据库

ShardingProxy的核心优势

优势说明适用场景
ORM框架友好透明代理,ORM无需感知分库分表使用MyBatis、Hibernate等ORM框架的项目
DBA友好DBA直接操作真实数据库,无学习成本需要DBA独立管理数据库的场景
无侵入性业务代码零修改,配置外置管理已有系统改造,避免代码侵入
统一治理多数据源集中管理、监控、审计微服务架构,需要统一数据治理
分布式事务内置XA事务支持,简化分布式事务处理需要强一致性的金融、交易场景

关键洞察:ShardingProxy不是替代ShardingJDBC,而是互补。两者可结合使用,构建混合架构。


二、ShardingProxy快速入门

1. 下载与部署

# 下载发布包(以5.2.1为例)
wget https://archive.apache.org/dist/shardingsphere/5.2.1/apache-shardingsphere-5.2.1-shardingsphere-proxy-bin.tar.gz

# 解压
tar -zxvf apache-shardingsphere-5.2.1-shardingsphere-proxy-bin.tar.gz
cd apache-shardingsphere-5.2.1-shardingsphere-proxy-bin

目录结构:

├── bin/           # 启动脚本
├── conf/          # 配置文件
├── lib/           # 依赖库
├── licenses/      # 许可证
└── README.txt

2. 添加MySQL驱动

ShardingProxy默认只包含PostgreSQL驱动,连接MySQL需要手动添加:

# 将mysql-connector-java-8.0.20.jar复制到lib目录
cp mysql-connector-java-8.0.20.jar lib/

3. 基础配置

server.yaml(服务配置)

rules:
  - !AUTHORITY
    users:
      - root@:root           # 用户名@主机:密码
      - sharding@:sharding   # 支持多用户
    provider:
      type: ALL_PERMITTED    # 权限控制类型
      
  - !TRANSACTION
    defaultType: XA          # 默认事务类型
    providerType: Atomikos   # 事务管理器

  - !SQL_PARSER              # SQL解析配置
    sqlCommentParseEnabled: true
    sqlStatementCache:
      initialCapacity: 2000
      maximumSize: 65535

props:
  sql-show: true            # 显示SQL日志
  proxy-default-port: 3307  # 代理服务端口
  proxy-mysql-default-version: 8.0.20  # 模拟的MySQL版本

config-sharding.yaml(分片配置)

databaseName: sharding_db    # 逻辑数据库名

dataSources:
  m0:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    url: jdbc:mysql://localhost:3306/shardingdb1
    username: root
    password: root
    maxPoolSize: 50
    
  m1:
    dataSourceClassName: com.zaxxer.hikari.HikariDataSource
    url: jdbc:mysql://localhost:3306/shardingdb2
    username: root
    password: root
    maxPoolSize: 50

rules:
  - !SHARDING
    tables:
      course:
        actualDataNodes: m$->{0..1}.course_$->{1..2}
        databaseStrategy:
          standard:
            shardingColumn: cid
            shardingAlgorithmName: course_db_alg
        tableStrategy:
          standard:
            shardingColumn: cid
            shardingAlgorithmName: course_tbl_alg
        keyGenerateStrategy:
          column: cid
          keyGeneratorName: alg_snowflake
    
    shardingAlgorithms:
      course_db_alg:
        type: MOD
        props:
          sharding-count: 2
      course_tbl_alg:
        type: INLINE
        props:
          algorithm-expression: course_$->{cid % 2 + 1}
    
    keyGenerators:
      alg_snowflake:
        type: SNOWFLAKE

4. 启动与连接

# 启动ShardingProxy
cd bin
./start.sh

# 使用MySQL客户端连接
mysql -h127.0.0.1 -P3307 -uroot -proot

# 查看逻辑库
mysql> show databases;
+--------------------+
| Database           |
+--------------------+
| sharding_db        |  # 配置的逻辑库
+--------------------+

三、分布式事务:XA机制详解

1. XA事务基础

XA(eXtended Architecture)是X/Open组织定义的分布式事务标准。ShardingProxy集成了三种实现:

  • Atomikos(默认)

  • Narayana

  • Bitronix

XA事务流程:

-- 1. 开启事务
XA START 'transaction_id';

-- 2. 执行SQL
INSERT INTO table VALUES (...);

-- 3. 结束事务
XA END 'transaction_id';

-- 4. 准备提交
XA PREPARE 'transaction_id';

-- 5. 提交事务
XA COMMIT 'transaction_id';

2. 配置事务管理器

切换事务管理器示例:

# server.yaml
rules:
  - !TRANSACTION
    defaultType: XA
    providerType: Narayana  # 切换为Narayana

所需步骤:

  1. 下载对应JAR包到lib目录

  2. 修改配置文件

  3. 重启ShardingProxy

3. XA事务的局限性

问题说明解决方案
性能问题比本地事务慢10倍以上异步提交、批量提交
故障恢复复杂故障后状态恢复困难定期清理、监控工具
不支持自动提交必须显式管理事务框架封装、AOP切面

建议:非强一致性场景,考虑柔性事务(如Seata的AT模式)。


四、集群化部署与配置中心

1. 两种运行模式

模式特点适用场景
Standalone独立运行,内存管理配置开发测试、单节点部署
Cluster集群运行,配置中心同步生产环境、高可用部署

2. Zookeeper集群配置

server.yaml配置:

mode:
  type: Cluster
  repository:
    type: ZooKeeper
    props:
      namespace: governance_ds
      server-lists: 192.168.65.212:2181
      retryIntervalMilliseconds: 500
      timeToLiveSeconds: 60
      maxRetries: 3

Zookeeper节点结构:

/governance_ds/
├── metadata/           # 元数据
├── props/             # 属性配置
├── rules/             # 规则配置
├── nodes/             # 节点信息
└── active_version     # 激活版本

3. 配置中心同步流程

1. Proxy启动 → 2. 读取本地配置 → 3. 同步到Zookeeper → 
4. 其他节点从Zookeeper读取 → 5. 配置变更自动同步

优势:

  • 配置一致性:所有节点配置自动同步

  • 动态更新:修改配置无需重启

  • 版本管理:支持配置版本回滚


五、ShardingJDBC与ShardingProxy混合架构

1. 统一配置管理

应用通过注册中心获取配置:

# application.properties
spring.shardingsphere.mode.type=Cluster
spring.shardingsphere.mode.repository.type=ZooKeeper
spring.shardingsphere.mode.repository.props.namespace=governance_ds
spring.shardingsphere.mode.repository.props.server-lists=localhost:2181
spring.shardingsphere.database.name=sharding_db  # 指定逻辑库

优势:

  • ShardingJDBC与ShardingProxy共享同一份配置

  • 配置变更一处修改,处处生效

  • 便于灰度发布和版本管理

2. 使用ShardingSphereDriver

直接通过JDBC连接:

public class ShardingSphereDriverDemo {
    @Test
    public void test() throws Exception {
        // 使用ShardingSphere专用驱动
        String driver = "org.apache.shardingsphere.driver.ShardingSphereDriver";
        String url = "jdbc:shardingsphere:classpath:config.yaml";
        
        Class.forName(driver);
        try (Connection conn = DriverManager.getConnection(url);
             Statement stmt = conn.createStatement()) {
            ResultSet rs = stmt.executeQuery("SELECT * FROM course");
            // 处理结果
        }
    }
}

config.yaml文件与ShardingProxy配置文件完全兼容,可直接复用。


六、自定义扩展机制

1. 扩展包制作

自定义主键生成器示例:

public class MyKeyGeneratorAlgorithm implements KeyGenerateAlgorithm {
    private AtomicLong atom = new AtomicLong(0);
    
    @Override
    public Comparable<?> generateKey() {
        LocalDateTime now = LocalDateTime.now();
        String timestamp = DateTimeFormatter.ofPattern("HHmmssSSS").format(now);
        return Long.parseLong(timestamp + atom.incrementAndGet());
    }
    
    @Override
    public String getType() {
        return "MYKEY";  // 关键:类型标识
    }
}

Maven打包配置:

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-jar-plugin</artifactId>
            <version>3.2.0</version>
            <executions>
                <execution>
                    <id>ShardingSPIDemo</id>
                    <phase>package</phase>
                    <goals><goal>jar</goal></goals>
                    <configuration>
                        <classifier>spiextention</classifier>
                        <includes>
                            <include>com/roy/shardingDemo/algorithm/*</include>
                            <include>META-INF/services/*</include>
                        </includes>
                    </configuration>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

2. 部署到ShardingProxy

1. 将生成的JAR包复制到ShardingProxy的lib目录
2. 在配置文件中使用自定义类型
3. 重启ShardingProxy服务

配置文件使用:

keyGenerators:
  my_keygen:
    type: MYKEY  # 与getType()返回值一致

七、数据迁移实战方案

1. 迁移挑战

  • 海量数据:TB/PB级数据迁移

  • 业务连续性:迁移期间业务不能中断

  • 数据一致性:新旧数据必须一致

2. 混合架构迁移方案

┌─────────────────────────────────────────────────┐
│                   旧业务系统                      │
│    ┌─────────────┐                              │
│    │   DataSource│                              │
│    └──────┬──────┘                              │
└───────────┼─────────────────────────────────────┘
            │
    ┌───────▼────────┐     热数据双写
    │ ShardingJDBC   ├──────────────┐
    │ 数据双写库      │              │
    └───────┬────────┘              │
            │                       │
    ┌───────▼────────┐      ┌───────▼────────┐
    │   旧数据库集群   │      │ ShardingJDBC   │
    │                │      │ 数据写入库      │
    └───────┬────────┘      └───────┬────────┘
            │                       │
    ┌───────▼────────┐      ┌───────▼────────┐
    │   定时任务      │      │   ShardingProxy│
    │   (冷数据)     │      │                │
    └───────┬────────┘      └───────┬────────┘
            │                       │
            └───────────┬───────────┘
                        │
                ┌───────▼────────┐
                │   新数据库集群   │
                │                │
                └────────────────┘

3. 迁移步骤

阶段一:热数据双写

  • 配置ShardingJDBC双写数据源

  • 核心业务表同时写入新旧集群

  • 验证数据一致性

阶段二:冷数据迁移

  • 搭建ShardingProxy服务

  • 定时任务增量迁移历史数据

  • 监控迁移进度和数据质量

阶段三:切换与验证

  • 逐步将读流量切换到新集群

  • 验证业务功能完整性

  • 最终切换写流量

阶段四:清理与优化

  • 停用旧数据源

  • 移除双写配置

  • 优化新集群性能

4. 注意事项

  1. SQL兼容性:确保业务SQL符合ShardingSphere规范

  2. 事务一致性:双写期间注意事务边界

  3. 性能监控:迁移期间密切监控系统性能

  4. 回滚预案:准备完善的回滚方案


八、生产环境最佳实践

1. 版本选择策略

版本类型推荐说明
生产环境5.2.x稳定版经过验证,兼容性好
测试环境与生产一致保证环境一致性
开发环境最新快照版体验新功能,发现潜在问题

2. 监控指标

关键监控项:

  • 连接数:proxy-frontend-max-connections

  • 查询性能:平均响应时间、QPS

  • 资源使用:CPU、内存、网络IO

  • 错误率:SQL执行错误、连接错误

推荐工具:

  • Prometheus + Grafana

  • SkyWalking

  • ShardingSphere自带的监控接口

3. 高可用架构

                      ┌─────────────┐
                      │  负载均衡器   │
                      │ (HAProxy/Nginx)│
                      └──────┬──────┘
                             │
        ┌────────────────────┼────────────────────┐
        │                    │                    │
┌───────▼────────┐  ┌───────▼────────┐  ┌───────▼────────┐
│ ShardingProxy  │  │ ShardingProxy  │  │ ShardingProxy  │
│   节点1        │  │   节点2        │  │   节点3        │
└───────┬────────┘  └───────┬────────┘  └───────┬────────┘
        │                   │                   │
        └───────────────────┼───────────────────┘
                            │
                   ┌────────▼────────┐
                   │  配置中心        │
                   │  (Zookeeper)    │
                   └─────────────────┘

九、常见问题与解决方案

1. 连接问题

问题: MySQL客户端无法连接ShardingProxy
解决:

  • 检查MySQL驱动是否放入lib目录

  • 验证server.yaml中的用户权限配置

  • 确认端口是否被占用

2. 配置同步问题

问题: 集群节点配置不一致
解决:

  • 检查Zookeeper连接状态

  • 验证namespace配置一致性

  • 查看日志中的配置同步错误

3. 性能问题

问题: 查询性能下降明显
解决:

  • 调整max-connections-size-per-query

  • 优化分片算法,避免全路由

  • 增加数据库连接池大小


十、总结与展望

核心收获

  1. 理解ShardingProxy定位:不是替代ShardingJDBC,而是互补的服务端解决方案

  2. 掌握混合架构:ShardingJDBC + ShardingProxy + 配置中心的完美组合

  3. 实战迁移方案:基于ShardingSphere构建可落地的数据迁移方案

  4. 掌握扩展机制:通过SPI机制自定义算法,满足个性化需求

未来趋势

  1. 云原生支持:更好的Kubernetes集成

  2. 智能优化:基于AI的SQL优化和分片建议

  3. 多模数据支持:支持更多数据库类型和数据格式

  4. 生态整合:与更多开源工具(如Flink、Spark)深度集成

Logo

北京人形旗下天工造物具身智能开源社区,聚焦具身天工与慧思开物两大平台

更多推荐