SpringBoot整合ShardingSphere 5.3.2实现MySQL读写分离实战指南

在分布式系统架构中,数据库读写分离是提升系统性能的常见方案。本文将手把手带你用SpringBoot 2.7.10集成ShardingSphere 5.3.2和Druid连接池,通过YAML配置文件实现MySQL读写分离。不同于网上大多数教程,我们特别关注5.3.x版本带来的配置变化和实际踩坑经验。

1. 环境准备与依赖配置

首先确保你的开发环境满足以下要求:

  • JDK 1.8+
  • SpringBoot 2.7.10
  • MySQL 5.7+/8.0
  • Maven 3.6+

在pom.xml中添加关键依赖:

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core</artifactId>
    <version>5.3.2</version>
</dependency>
<dependency>
    <groupId>com.alibaba</groupId>
    <artifactId>druid</artifactId>
    <version>1.2.18</version>
</dependency>
<dependency>
    <groupId>org.yaml</groupId>
    <artifactId>snakeyaml</artifactId>
    <version>1.33</version>
</dependency>

特别注意

  • 不要使用druid-spring-boot-starter
  • 必须覆盖默认的snakeyaml版本
  • 避免在application.yml中配置spring.datasource相关属性

2. 主从数据源配置

在resources目录下创建sharding-config.yaml文件,配置主从数据源:

dataSources:
  master:
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://主库IP:3306/数据库名?useSSL=false&serverTimezone=UTC
    username: root
    password: 主库密码
    initialSize: 5
    maxActive: 20
    minIdle: 5
    
  slave1:
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://从库IP1:3306/数据库名?useSSL=false&serverTimezone=UTC
    username: root
    password: 从库密码
    initialSize: 5
    maxActive: 15
    minIdle: 5
    
  slave2:
    dataSourceClassName: com.alibaba.druid.pool.DruidDataSource
    driverClassName: com.mysql.cj.jdbc.Driver
    url: jdbc:mysql://从库IP2:3306/数据库名?useSSL=false&serverTimezone=UTC
    username: root
    password: 从库密码
    initialSize: 5
    maxActive: 15
    minIdle: 5

关键参数说明

参数 说明 推荐值
initialSize 初始连接数 5-10
maxActive 最大连接数 根据QPS调整
minIdle 最小空闲连接 与initialSize一致
maxWait 获取连接超时时间 60000ms

3. 读写分离规则配置

在同一个sharding-config.yaml文件中继续添加读写分离规则:

rules:
- !READWRITE_SPLITTING
  dataSources:
    rw_ds:
      staticStrategy:
        writeDataSourceName: master
        readDataSourceNames: 
          - slave1
          - slave2
      loadBalancerName: round_robin
  loadBalancers:
    round_robin:
      type: ROUND_ROBIN

5.3.x版本重要变化

  • 配置项命名全部采用驼峰式(如staticStrategy)
  • 不再支持starter自动配置
  • 负载均衡算法配置更加清晰

4. SpringBoot主配置

在application.yml中添加ShardingSphere驱动配置:

spring:
  datasource:
    driver-class-name: org.apache.shardingsphere.driver.ShardingSphereDriver
    url: jdbc:shardingsphere:classpath:sharding-config.yaml
  main:
    allow-bean-definition-overriding: true

调试建议 : 开启SQL日志输出有助于排查问题:

props:
  sql-show: true

5. 常见问题解决方案

5.1 数据源初始化失败

现象 :启动时报 dataSource init error 解决方案

  1. 检查Druid连接参数是否正确
  2. 确保网络连通性
  3. 验证数据库账号权限

5.2 配置项解析错误

现象 Unable to find property 'static_strategy' 原因 :5.3.x版本必须使用驼峰命名 正确写法

staticStrategy:  # 不是static_strategy
  writeDataSourceName: master

5.3 多数据源冲突

现象 :HikariDataSource被自动加载 解决方案

  1. 确保没有引入spring-boot-starter-jdbc
  2. 检查是否误用了@DataSource注解

6. 高级配置技巧

6.1 事务管理

对于写操作,建议添加@Transactional注解:

@Service
public class OrderService {
    
    @Transactional
    public void createOrder(Order order) {
        // 写操作会自动路由到主库
        orderMapper.insert(order);
    }
}

6.2 强制读主库

某些需要强一致性的场景可以强制读主库:

@GetMapping("/detail")
public Order getOrderDetail(Long orderId) {
    try (HintManager hintManager = HintManager.getInstance()) {
        hintManager.setWriteRouteOnly();
        return orderMapper.selectById(orderId);
    }
}

6.3 多从库负载均衡策略

除了默认的轮询(ROUND_ROBIN),还支持:

策略类型 描述 适用场景
RANDOM 随机选择 简单均衡
WEIGHT 权重分配 异构从库
TRANSACTION 事务内固定 业务关联查询

配置示例:

loadBalancers:
  custom_weight:
    type: WEIGHT
    props:
      slave1: 2
      slave2: 1

7. 性能优化建议

  1. 连接池配置

    • 主库连接数应大于从库
    • 根据实际QPS调整maxActive
  2. 监控配置

# Druid监控页
spring:
  datasource:
    druid:
      stat-view-servlet:
        enabled: true
        url-pattern: /druid/*
  1. 慢SQL阈值
dataSources:
  master:
    # ...
    connectionProperties: druid.stat.slowSqlMillis=500

实际项目中,我们通过这套配置方案将查询性能提升了3倍,同时保证了写操作的一致性。特别是在促销活动期间,读写分离架构有效分担了数据库压力。

更多推荐