Sharding JDBC分库分表怎么配置

发布时间:2021-12-22 11:44:49 作者:iii
来源:亿速云 阅读:376
# Sharding JDBC分库分表怎么配置

## 目录
1. [什么是Sharding JDBC](#什么是sharding-jdbc)
2. [核心概念解析](#核心概念解析)
3. [环境准备](#环境准备)
4. [基础配置详解](#基础配置详解)
5. [分库分表策略](#分库分表策略)
6. [分布式主键配置](#分布式主键配置)
7. [读写分离集成](#读写分离集成)
8. [事务管理](#事务管理)
9. [Spring Boot集成](#spring-boot集成)
10. [性能调优建议](#性能调优建议)
11. [常见问题排查](#常见问题排查)
12. [最佳实践](#最佳实践)

---

## 什么是Sharding JDBC
ShardingSphere-JDBC是Apache ShardingSphere的子项目,定位为轻量级Java框架,提供:
- 透明的JDBC增强服务
- 数据库水平分片(分库分表)
- 读写分离
- 分布式事务
- 数据脱敏等能力

与MyCat等中间件不同,它采用无中心化架构,直接嵌入应用,无需额外部署代理服务。

---

## 核心概念解析
### 逻辑表与真实表
```yaml
# 逻辑订单表t_order对应多个物理表
t_order: 
  actual-data-nodes: ds$->{0..1}.t_order_$->{0..1}

分片键(Sharding Key)

选择原则: 1. 高基数(区分度高) 2. 业务查询频繁字段 3. 避免数据倾斜

分片算法

类型 实现类 适用场景
精确分片 PreciseShardingAlgorithm =, IN查询
范围分片 RangeShardingAlgorithm BETWEEN, >, <
复合分片 ComplexKeysShardingAlgorithm 多条件组合

环境准备

依赖配置

<dependency>
    <groupId>org.apache.shardingsphere</groupId>
    <artifactId>shardingsphere-jdbc-core</artifactId>
    <version>5.3.2</version>
</dependency>

数据库准备

-- 创建分库
CREATE DATABASE ds0;
CREATE DATABASE ds1;

-- 每个库中创建分表
CREATE TABLE t_order_0 (order_id BIGINT, user_id INT, ...);
CREATE TABLE t_order_1 (order_id BIGINT, user_id INT, ...);

基础配置详解

YAML配置模板

spring:
  shardingsphere:
    datasource:
      names: ds0,ds1
      ds0:
        type: com.zaxxer.hikari.HikariDataSource
        driver-class-name: com.mysql.jdbc.Driver
        jdbc-url: jdbc:mysql://localhost:3306/ds0
        username: root
        password: 
      ds1:
        # ...类似配置...
    
    rules:
      sharding:
        tables:
          t_order:
            actual-data-nodes: ds$->{0..1}.t_order_$->{0..1}
            database-strategy:
              standard:
                sharding-column: user_id
                precise-algorithm-class: com.example.UserIdHashModAlgorithm
            table-strategy:
              inline:
                sharding-column: order_id
                algorithm-expression: t_order_$->{order_id % 2}

分库分表策略

标准分片策略

public class UserIdHashModAlgorithm implements PreciseShardingAlgorithm<Integer> {
    @Override
    public String doSharding(Collection<String> availableTargetNames, PreciseShardingValue<Integer> shardingValue) {
        int mod = shardingValue.getValue() % availableTargetNames.size();
        return "ds" + mod;
    }
}

行表达式策略

table-strategy:
  inline:
    sharding-column: order_id
    algorithm-expression: t_order_$->{order_id % 4}

强制路由Hint

HintManager.getInstance().setDatabaseShardingValue(1);

分布式主键配置

内置生成器

rules:
  sharding:
    key-generators:
      snowflake:
        type: SNOWFLAKE
        props:
          worker-id: 123

自定义生成器

public class MyKeyGenerator implements KeyGenerateAlgorithm {
    @Override
    public Comparable<?> generateKey() {
        return UUID.randomUUID().toString().replace("-","");
    }
}

读写分离集成

rules:
  replica-query:
    data-sources:
      pr_ds:
        primary-data-source-name: ds_master
        replica-data-source-names: ds_slave0,ds_slave1
        load-balancer-name: round_robin
    load-balancers:
      round_robin:
        type: ROUND_ROBIN

事务管理

本地事务

@Transactional // 默认支持
public void processOrder() {
    // 跨库操作
}

XA事务

props:
  xa-transaction-manager-type: Atomikos

Spring Boot集成

自动配置类

@Configuration
@EnableShardingSphereConfiguration
public class ShardingConfig {
    
    @Bean
    public KeyGenerateAlgorithm keyGenerator() {
        return new SnowflakeKeyGenerateAlgorithm();
    }
}

动态数据源切换

@DS("ds1") // 结合dynamic-datasource-spring-boot-starter
public List<Order> findOrders() {
    return orderMapper.selectList();
}

性能调优建议

  1. 连接池配置

    ds0:
     hikari:
       maximum-pool-size: 20
       connection-timeout: 30000
    
  2. 批量操作优化

    // 使用rewriteBatchedStatements
    jdbc-url: jdbc:mysql://localhost:3306/ds0?rewriteBatchedStatements=true
    
  3. SQL提示

    /* SHARDINGSPHERE_HINT: useMaster=true */ SELECT * FROM t_order
    

常见问题排查

问题1:分片键未在SQL中指定

现象:全库路由警告日志
解决:确保WHERE条件包含分片键或使用Hint强制路由

问题2:跨库JOIN性能差

方案: 1. 使用绑定表配置

   binding-tables: t_order,t_order_item
  1. 考虑冗余字段

最佳实践

  1. 分片数量规划:建议单表数据量控制在500万-1000万
  2. 灰度发布方案
    • 先分库不分表
    • 逐步迁移历史数据
  3. 监控集成
    
    <dependency>
       <groupId>org.apache.shardingsphere</groupId>
       <artifactId>shardingsphere-agent</artifactId>
    </dependency>
    

注:本文档基于ShardingSphere 5.x版本,实际配置时请参考官方文档。 “`

(实际字数约4500字,完整5650字版本需要扩展各章节的详细案例和性能测试数据)

推荐阅读:
  1. Sharding JDBC中分库分表的操作
  2. Sharding JDBC如何分库分表?看完你就会了

免责声明:本站发布的内容(图片、视频和文字)以原创、转载和分享为主,文章观点不代表本网站立场,如果涉及侵权请联系站长邮箱:is@yisu.com进行举报,并提供相关证据,一经查实,将立刻删除涉嫌侵权内容。

sharding jdbc

上一篇:如何绘制Excel中的箱线图

下一篇:如何绘制UML状态机图

相关阅读

您好,登录后才能下订单哦!

密码登录
登录注册
其他方式登录
点击 登录注册 即表示同意《亿速云用户服务条款》