【Spring Boot】主从数据库 - 初探

文章目录

  • 一、何时需要开启从数据库
    • 主要开启场景
    • 配置建议
    • 其他考虑因素
    • 最佳实践
  • 二、Spring Boot中使用Druid开启从库的表同步问题
    • 主从同步机制
    • 可能出现的问题
    • 解决方案
      • 1. 初始设置主从同步
      • 2. 确保表结构一致
      • 3. Spring Boot中的容错配置
    • 最佳实践

一、何时需要开启从数据库

开启从数据库(读写分离)通常基于以下几个方面的考虑:

主要开启场景

  1. 高读取负载场景

    • 当您的应用读取操作(QPS)远高于写入操作时(如80%读+20%写)
    • 典型场景:内容管理系统、电商商品展示页、新闻网站等
  2. 性能瓶颈出现时

    • 主库CPU/IO负载持续较高(超过70%)
    • 查询响应时间明显变长,影响用户体验
  3. 高可用性需求

    • 需要灾备方案,当主库故障时可以快速切换到从库
    • 业务对系统可用性要求高(如金融、医疗系统)
  4. 报表与分析需求

    • 需要运行大量分析查询而不影响线上交易
    • 大数据量统计影响主库性能时

配置建议

在您的配置中,当需要开启从库时:

slave:
  enabled: true  # 改为true开启
  url: jdbc:mysql://slave-host:3306/ry?useUnicode=true&characterEncoding=utf8
  username: slave_user
  password: slave_password

其他考虑因素

  1. 数据一致性容忍度

    • 从库数据可能有短暂延迟(通常几秒)
    • 对实时性要求极高的业务(如支付确认)仍需走主库
  2. 成本考量

    • 增加从库意味着额外的服务器和维护成本
    • 需要评估ROI(投入产出比)
  3. 架构复杂度

    • 需要处理主从同步延迟问题
    • 某些ORM框架可能需要特殊配置支持读写分离

最佳实践

  1. 初期可以先监控主库性能,确有需要再开启
  2. 从库配置应与主库保持相近的硬件规格
  3. 重要业务操作(如订单创建)应强制走主库
  4. 定期检查主从同步状态和延迟

只有当业务发展到一定规模,单数据库实例无法满足性能需求时,才需要考虑开启从库实现读写分离。

二、Spring Boot中使用Druid开启从库的表同步问题

在Spring Boot中配置Druid数据源开启从库时,从库不会自动创建表结构或同步数据,这完全取决于MySQL主从复制配置。

主从同步机制

  1. Druid只负责数据源路由

    • Druid的读写分离功能只是将读操作路由到从库
    • 它本身不参与数据库表结构的创建或数据同步
  2. MySQL主从复制要求

    • 从库必须已经配置为主库的slave
    • 主从库的表结构必须预先一致
    • 数据同步由MySQL的binlog复制机制完成

可能出现的问题

如果从库缺少表结构:

  1. 读操作会直接报错

    Table 'xxx.table_name' doesn't exist
    
  2. 但不会影响主库写入

    • 写入操作仍然会成功执行在主库
    • 只是后续从库读取时会失败

解决方案

1. 初始设置主从同步

-- 在主库执行(获取主库状态)
SHOW MASTER STATUS;
-- 记录File和Position值

-- 在从库执行
CHANGE MASTER TO
MASTER_HOST='主库IP',
MASTER_USER='repl_user',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='上面记录的File',
MASTER_LOG_POS=上面记录的Position;

START SLAVE;

2. 确保表结构一致

  • 手动在主库导出结构:
    mysqldump -h主库 -u用户 -p --no-data 数据库 > schema.sql
    
  • 在从库导入:
    mysql -h从库 -u用户 -p 数据库 < schema.sql
    

3. Spring Boot中的容错配置

可以在应用层添加降级逻辑:

@Repository
public class MyRepository {
    @Autowired
    @Qualifier("slaveDataSource") 
    private DataSource slaveDataSource;
    
    @Autowired
    private DataSource masterDataSource;

    public List<Data> getData() {
        try {
            // 先尝试从库
            return jdbcTemplate(slaveDataSource).query(...);
        } catch (BadSqlGrammarException e) {
            // 从库无表时回退到主库
            return jdbcTemplate(masterDataSource).query(...);
        }
    }
}

最佳实践

  1. 部署前确保主从库结构一致

  2. 监控复制状态

    SHOW SLAVE STATUS\G
    
  3. 考虑使用数据库迁移工具

    • Flyway或Liquibase管理表结构变更
    • 确保它们只在主库执行
  4. Druid配置建议

spring:
  datasource:
    druid:
      slave:
        enabled: true
        # 建议配置从库失败时自动回退到主库
        connection-properties: 
          failOverReadOnly: false
          secondsBeforeRetryMaster: 30

总结:Druid不会自动创建从库表结构,必须预先设置好MySQL主从复制并确保表结构一致,否则会报错。

你可能感兴趣的:(日常工作总结,spring,boot,数据库,后端,主从数据库)