RuoYi-Vue-fast数据库容灾方案:主从复制与故障转移
方案背景与价值
在企业级应用中,数据库故障可能导致业务中断、数据丢失等严重问题。RuoYi-Vue-fast作为基于SpringBoot和Vue的前后端分离权限管理系统,需要可靠的数据库容灾机制保障业务连续性。本文将详细介绍如何通过主从复制实现数据备份,结合故障转移机制构建高可用数据库架构。
主从复制实现指南
环境准备
- 安装MySQL数据库(推荐8.0+版本)
- 准备至少两台服务器(主库:192.168.1.100,从库:192.168.1.101)
- 确保服务器间网络互通,开放3306端口
主库配置
修改主库MySQL配置文件my.cnf:
[mysqld]
server-id=1
log_bin=mysql-bin
binlog_format=row
expire_logs_days=7
binlog_do_db=ry_vue # 仅同步ry_vue数据库
重启MySQL服务使配置生效:
systemctl restart mysqld
创建复制用户并授权:
CREATE USER 'repl'@'192.168.1.101' IDENTIFIED BY 'Replication@123';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.101';
FLUSH PRIVILEGES;
从库配置
修改从库MySQL配置文件my.cnf:
[mysqld]
server-id=2
relay_log=mysql-relay-bin
read_only=1 # 设置从库为只读模式
重启MySQL服务后,配置主从连接:
CHANGE MASTER TO
MASTER_HOST='192.168.1.100',
MASTER_USER='repl',
MASTER_PASSWORD='Replication@123',
MASTER_LOG_FILE='mysql-bin.000001', # 主库当前binlog文件
MASTER_LOG_POS=154; # 主库当前binlog位置
启动从库复制进程:
START SLAVE;
验证主从同步状态:
SHOW SLAVE STATUS\G
若Slave_IO_Running和Slave_SQL_Running均为Yes,则表示主从复制配置成功。
应用层适配改造
动态数据源配置
RuoYi-Vue-fast已内置动态数据源支持,通过修改framework/datasource/DynamicDataSource.java实现读写分离:
public class DynamicDataSource extends AbstractRoutingDataSource {
@Override
protected Object determineCurrentLookupKey() {
return DynamicDataSourceContextHolder.getDataSourceType();
}
}
数据源切换注解
使用framework/aspectj/lang/annotation/DataSource.java注解实现方法级数据源切换:
@Target({ElementType.METHOD, ElementType.TYPE})
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface DataSource {
String value() default DataSourceType.MASTER;
}
在Service层方法上添加注解实现读写分离:
@Service
public class SysUserServiceImpl implements ISysUserService {
@Override
@DataSource(DataSourceType.SLAVE)
public List<SysUser> selectUserList(SysUser user) {
return userMapper.selectUserList(user);
}
@Override
@DataSource(DataSourceType.MASTER)
public int insertUser(SysUser user) {
// 数据插入逻辑
}
}
故障转移机制实现
健康检查组件
通过定时任务监控数据库状态,实现类位于framework/task/RyTask.java:
@Component
public class RyTask {
@Autowired
private ISysJobService jobService;
@Scheduled(cron = "0/30 * * * * ?")
public void checkDbHealth() {
// 数据库健康检查逻辑
if (!isMasterAlive()) {
switchToSlave();
}
}
}
自动切换流程
- 主库故障检测
- 从库提升为主库
- 应用数据源切换
- 通知管理员
系统配置与验证
数据库脚本准备
初始化数据库使用sql/ry_20250522.sql和sql/quartz.sql脚本,主从环境需确保两个数据库都完成初始化。
应用配置修改
修改application.yml配置文件,添加多数据源配置:
spring:
datasource:
type: com.alibaba.druid.pool.DruidDataSource
driverClassName: com.mysql.cj.jdbc.Driver
master:
url: jdbc:mysql://192.168.1.100:3306/ry_vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: password
slave:
url: jdbc:mysql://192.168.1.101:3306/ry_vue?useUnicode=true&characterEncoding=utf8&zeroDateTimeBehavior=convertToNull&useSSL=true&serverTimezone=GMT%2B8
username: root
password: password
验证方法
- 正常情况下,写操作走主库,读操作走从库
- 手动停止主库MySQL服务,观察应用是否自动切换到从库
- 恢复主库后,检查数据同步情况和应用是否切回主库
最佳实践与注意事项
性能优化
- 合理设置从库数量,分担读压力
- 调整binlog格式,推荐使用ROW格式保证数据一致性
- 定期清理过期日志,避免磁盘空间不足
监控告警
结合RuoYi-Vue-fast的监控模块:
配置数据库监控告警任务,及时发现并处理异常。
灾备演练
定期进行故障演练,验证容灾方案有效性:
- 模拟主库宕机
- 验证故障转移时间
- 检查数据一致性
- 恢复主库并重新配置主从
总结与展望
通过主从复制与故障转移方案,RuoYi-Vue-fast实现了数据库层面的高可用,有效保障了系统稳定性。未来可进一步引入数据库集群、数据分片等技术,应对更大规模的业务需求。
完整的容灾方案实现还需结合具体业务场景进行调整,建议参考官方文档doc/若依环境使用手册.docx和系统配置文件src/main/java/com/ruoyi/framework/config/DruidConfig.java进行深入配置。
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考



