Spring Boot 和 MySQL 主从配置指南

在现代的应用系统中,使用主从数据库可以有效地提高应用的可用性与性能。接下来,我们将详细讲解如何在 Spring Boot 中与 MySQL 配置主从关系。整个过程分为几个步骤,下面我们用表格进行展示。

流程步骤

步骤 描述
1 准备 MySQL 主从环境
2 配置 MySQL 主从参数
3 在 Spring Boot 项目中添加依赖
4 配置数据源
5 编写 DAO 层代码
6 测试主从读写分离功能

接下来我们逐步深入每一个步骤。

1. 准备 MySQL 主从环境

首先,你需要两台 MySQL 实例,一台作为主库,另一台作为从库。确保它们都能正常访问,并已启动,并且有相同的版本。

2. 配置 MySQL 主从参数

在主库的配置文件(一般是 my.cnf)中,添加以下内容:

[mysqld]
server-id=1  # 主库的server-id, 必须唯一
log-bin=mysql-bin  # 启用二进制日志

在从库的配置文件(同样是 my.cnf)中,添加以下内容:

[mysqld]
server-id=2  # 从库的server-id, 必须唯一
relay-log=mysql-relay-bin  # 启用中继日志

然后重启 MySQL 服务,并在主库中执行如下命令以记录主库状态:

SHOW MASTER STATUS;

记下输出的 FilePosition 值,这将在从库上配置时使用。

在从库中,执行以下命令以实现数据复制:

CHANGE MASTER TO 
  MASTER_HOST='主库IP',
  MASTER_USER='复制用户', 
  MASTER_PASSWORD='复制用户密码',
  MASTER_LOG_FILE='记录的File',
  MASTER_LOG_POS=记录的Position;

最后,启动复制进程:

START SLAVE;

3. 在 Spring Boot 项目中添加依赖

pom.xml 中添加以下依赖:

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-data-jpa</artifactId>
</dependency>
<dependency>
    <groupId>mysql:mysql-connector-java</groupId>
    <artifactId>mysql-connector-java</artifactId>
    <scope>runtime</scope>
</dependency>

4. 配置数据源

application.yml 中配置主从数据源:

spring:
  datasource:
    # 主库的配置
    primary:
      url: jdbc:mysql://主库IP:3306/数据库名
      username: 主库用户名
      password: 主库密码
      driver-class-name: com.mysql.cj.jdbc.Driver

    # 从库的配置
    replica:
      url: jdbc:mysql://从库IP:3306/数据库名
      username: 从库用户名
      password: 从库密码
      driver-class-name: com.mysql.cj.jdbc.Driver

# 配置动态数据源
dynamic-datasource:
  primary: primary # 指定主库为初始数据源

接下来,在代码中配置数据源。

5. 编写 DAO 层代码

使用 @Primary 注解标记主库的 DataSource,在 DAO 中加入读写分离的逻辑:

@Configuration
public class DataSourceConfig {

    @Primary
    @Bean(name = "primaryDataSource")
    @ConfigurationProperties("spring.datasource.primary")
    public DataSource primaryDataSource() {
        return DataSourceBuilder.create().build();
    }

    @Bean(name = "replicaDataSource")
    @ConfigurationProperties("spring.datasource.replica")
    public DataSource replicaDataSource() {
        return DataSourceBuilder.create().build();
    }
}

这是将主库和从库的数据源注册到 Spring 上下文中的代码。

6. 测试主从读写分离功能

在你的服务层中,可以创建一个简单的 API 进行测试。比如:

@Service
public class UserService {

    @Autowired
    private UserRepository userRepository;

    public User getUserById(Long id) {
        return userRepository.findById(id); // 从从库读取数据
    }

    @Transactional
    public User createUser(User user) {
        return userRepository.save(user); // 在主库写入数据
    }
}

测试结果

在 Postman 或其他工具中,你可以分别测试读取和写入 API,确保数据能够在主库写入后在从库中读取到。

甘特图

下面是实施项目的甘特图:

gantt
    title MySQL 主从配置实施时间表
    dateFormat  YYYY-MM-DD
    section 准备阶段
    准备 MySQL 实例           :a1, 2023-10-01, 2d
    section 配置阶段
    配置 MySQL 主库参数      :a2, after a1, 1d
    配置 MySQL 从库参数      :a3, after a2, 1d
    section 开发阶段
    添加 Spring Boot 依赖    :a4, after a3, 1d
    编写配置和DAO代码        :a5, after a4, 2d
    section 测试阶段
    测试主从读写分离功能    :a6, after a5, 1d

旅行图

下面是整个过程的旅行图:

journey
    title MySQL 主从配置过程
    section 准备阶段
      准备 MySQL 主从环境         : 5: 二号用户
    section 配置阶段
      配置 MySQL 主从参数       : 4: 一号用户
    section 开发阶段
      添加 Spring Boot 依赖     : 5: 二号用户
      编写 DAO 层代码           : 4: 一号用户
    section 测试阶段
      测试功能                   : 5: 二号用户

结语

通过以上六个步骤,你就能够成功配置 Spring Boot 与 MySQL 主从数据库的读写分离。这种架构在提高数据读写性能和系统稳定性方面有着显著的优势。希望以上内容能够帮助你顺利完成任务,享受开发过程中的乐趣!如果你在实现过程中有任何问题,请不要犹豫,随时提问。