mycat 分库分表 + Springboot

MyCat分库分表在Spring Boot项目中的实现

MyCat是一个开源的分布式数据库中间件,可以解决数据库分库分表的问题。下面我将介绍如何在Spring Boot项目中实现MyCat分库分表。

实现步骤

1. 环境准备

首先需要安装和配置MyCat服务器:

  1. 下载MyCat:从官方网站或GitHub下载MyCat
  2. 配置schema.xml:定义逻辑库、逻辑表、数据节点和数据源
  3. 配置rule.xml:定义分片规则
  4. 配置server.xml:配置系统参数和用户权限
  5. 启动MyCat服务

2. Spring Boot项目配置

添加依赖

<dependencies>
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-data-jpa</artifactId>
    </dependency>
    <dependency>
        <groupId>mysql</groupId>
        <artifactId>mysql-connector-java</artifactId>
        <scope>runtime</scope>
    </dependency>
    <!-- 或其他数据库驱动 -->
</dependencies>

配置数据源

# application.properties
spring.datasource.url=jdbc:mysql://mycat-server-host:8066/your_logical_db
spring.datasource.username=mycat_username
spring.datasource.password=mycat_password
spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driver

# JPA配置
spring.jpa.hibernate.ddl-auto=update
spring.jpa.show-sql=true

3. 实体类映射

@Entity
@Table(name = "user_table") // MyCat中的逻辑表名
public class User {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    
    private String name;
    
    @Column(name = "create_time")
    private Date createTime;
    
    // 分片字段,通常需要在MyCat配置中指定
    private Integer shardKey;
    
    // getters and setters
}

4. Repository接口

public interface UserRepository extends JpaRepository<User, Long> {
    // 可以根据分片字段查询
    List<User> findByShardKey(Integer shardKey);
}

5. MyCat配置示例

schema.xml 配置

<?xml version="1.0"?>
<!DOCTYPE mycat:schema SYSTEM "schema.dtd">
<mycat:schema xmlns:mycat="http://io.mycat/">

    <schema name="your_logical_db" checkSQLschema="false" sqlMaxLimit="100">
        <table name="user_table" dataNode="dn1,dn2" rule="mod-shard" />
    </schema>

    <dataNode name="dn1" dataHost="host1" database="db1" />
    <dataNode name="dn2" dataHost="host1" database="db2" />

    <dataHost name="host1" maxCon="1000" minCon="10" balance="0"
              writeType="0" dbType="mysql" dbDriver="native" switchType="1"  slaveThreshold="100">
        <heartbeat>select user()</heartbeat>
        <writeHost host="hostM1" url="real-mysql-host:3306" user="root" password="real-password"/>
    </dataHost>
</mycat:schema>

rule.xml 配置

<tableRule name="mod-shard">
    <rule>
        <columns>shard_key</columns>
        <algorithm>mod-long</algorithm>
    </rule>
</tableRule>

<function name="mod-long" class="io.mycat.route.function.PartitionByMod">
    <property name="count">2</property> <!-- 节点数量 -->
</function>

6. 业务层实现

@Service
public class UserService {
    @Autowired
    private UserRepository userRepository;
    
    public User createUser(User user) {
        // 设置分片键,确保数据路由到正确的分片
        user.setShardKey(calculateShardKey(user));
        return userRepository.save(user);
    }
    
    public User getUser(Long id, Integer shardKey) {
        // 如果需要根据分片键查询,需要先知道数据在哪个分片
        // 或者通过MyCat的全局查询功能
        return userRepository.findById(id).orElse(null);
    }
    
    private Integer calculateShardKey(User user) {
        // 根据业务规则计算分片键
        // 例如:对用户ID取模,或者根据地域、时间等
        return (int)(user.getId() % 2);
    }
}

注意事项

  1. 分片键选择:选择合适的分片键非常重要,应该选择分布均匀且常用的查询条件作为分片键
  2. 全局序列:如果需要分布式ID,可以使用MyCat的全局序列功能
  3. 跨分片查询:尽量避免跨分片查询,这类查询性能较差
  4. 事务处理:MyCat对分布式事务的支持有限,需要谨慎设计业务逻辑
  5. 数据迁移:已有的单表数据需要迁移到分片环境时,需要使用数据迁移工具

高级功能

  1. 读写分离:可以在dataHost中配置多个readHost实现读写分离
  2. 分片算法:MyCat支持多种分片算法,如范围分片、哈希分片、日期分片等
  3. ER表:对于有关联关系的表,可以使用ER分片确保关联数据在同一分片上
  4. 全局表:对于数据量小且更新不频繁的表,可以设置为全局表,在所有节点上冗余存储

通过以上步骤,你可以在Spring Boot项目中实现MyCat分库分表功能,提升数据库的扩展性和性能。

posted @ 2025-09-07 09:40  ukyo--碳水化合物  阅读(20)  评论(0)    收藏  举报