1. JEECG与MySQL主从复制架构解析
作为国内流行的低代码开发平台,JEECG在实际生产环境中通常需要处理高并发业务场景。MySQL主从复制架构的引入,能够有效解决单点故障风险并提升系统整体性能。这种架构的核心在于主库(Master)将所有数据变更记录到二进制日志(binlog),从库(Slave)通过I/O线程获取这些日志并由SQL线程重放执行。
关键提示:JEECG默认使用MyISAM存储引擎的表结构在复制过程中需要特别注意,因为MyISAM不支持事务特性,可能导致主从数据不一致的情况。
1.1 JEECG典型业务场景分析
JEECG平台常见的用户管理、工作流引擎和报表模块具有以下特征:
- 用户认证模块:写操作集中在登录日志记录,读操作频繁(权限校验)
- 动态表单模块:结构变更频率低但查询复杂度高
- 报表统计模块:大数据量聚合查询为主
这种读写分离的特性使得MySQL主从架构特别适合JEECG应用场景。主库处理所有写操作和核心业务读请求,从库专门承担报表分析等读密集型任务。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. MySQL主从复制环境搭建全流程
2.1 基础环境准备
推荐使用同版本MySQL服务器(建议5.7+),主从服务器时间必须同步。以下是典型配置示例:
bash复制# 主库my.cnf关键配置
[mysqld]
server-id = 1
log_bin = mysql-bin
binlog_format = ROW
binlog_row_image = FULL
sync_binlog = 1
# 从库my.cnf关键配置
[mysqld]
server-id = 2
relay_log = mysql-relay-bin
read_only = ON
避坑指南:server-id必须唯一,否则复制链路无法建立。生产环境建议将server-id设置为服务器IP最后一段的数字形式。
2.2 JEECG数据库初始化
在主库执行JEECG数据库导入后,需要特别处理以下事项:
- 检查存储引擎:
SELECT TABLE_NAME, ENGINE FROM INFORMATION_SCHEMA.TABLES WHERE TABLE_SCHEMA = 'jeecg_boot' - 转换关键表为InnoDB:
ALTER TABLE sys_log ENGINE=InnoDB - 锁定数据库并获取复制坐标:
FLUSH TABLES WITH READ LOCK; SHOW MASTER STATUS;
2.3 主从链路建立实操
- 创建复制专用账户:
sql复制CREATE USER 'repl'@'%' IDENTIFIED BY 'SecurePass123!';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
- 从库配置复制参数(注意替换实际值):
sql复制CHANGE MASTER TO
MASTER_HOST='master_ip',
MASTER_USER='repl',
MASTER_PASSWORD='SecurePass123!',
MASTER_LOG_FILE='mysql-bin.000002',
MASTER_LOG_POS=154;
- 启动复制并检查状态:
sql复制START SLAVE;
SHOW SLAVE STATUS\G
验证关键指标:
- Slave_IO_Running: Yes
- Slave_SQL_Running: Yes
- Seconds_Behind_Master: 0
3. JEECG特有问题解决方案
3.1 动态表单同步问题
JEECG的动态表单采用元数据管理方式,表结构变更时需要注意:
- 主库执行DDL时会自动记录到binlog
- 从库重放DDL期间会产生元数据锁
- 大表结构变更可能导致复制延迟
解决方案:
- 业务低峰期执行ALTER操作
- 使用pt-online-schema-change工具
- 监控
Seconds_Behind_Master指标
3.2 主从数据一致性校验
推荐使用percona-toolkit进行校验:
bash复制pt-table-checksum --replicate=jeecg_boot.checksums h=master_ip,u=admin,p=password
pt-table-sync --replicate=jeecg_boot.checksums h=master_ip,u=admin,p=password --print
4. 性能监控与优化策略
4.1 关键监控指标
通过以下SQL实时监控复制状态:
sql复制-- 主库查看binlog状态
SHOW MASTER STATUS;
-- 从库查看延迟情况
SHOW SLAVE STATUS\G
-- 监控线程状态
SELECT * FROM performance_schema.replication_applier_status_by_worker;
4.2 延迟问题排查流程
当出现复制延迟时(Seconds_Behind_Master > 0),应按以下步骤排查:
- 网络诊断:
bash复制ping -c 10 slave_ip
mtr --report slave_ip
- 资源瓶颈检查:
bash复制top -H -p $(pgrep -d, mysqld)
iostat -x 1 5
- SQL线程分析:
sql复制SELECT * FROM sys.schema_table_lock_waits;
SELECT * FROM performance_schema.events_statements_history_long
WHERE thread_id = (SELECT THREAD_ID FROM performance_schema.threads
WHERE PROCESSLIST_ID = (SELECT ID FROM information_schema.processlist
WHERE COMMAND = 'Slave_SQL'));
4.3 参数调优建议
根据JEECG业务特点调整以下参数:
ini复制# 主库优化
binlog_group_commit_sync_delay = 100
binlog_group_commit_sync_no_delay_count = 10
# 从库优化
slave_parallel_workers = 8
slave_parallel_type = LOGICAL_CLOCK
slave_preserve_commit_order = 1
5. 高可用架构进阶方案
5.1 故障自动切换设计
建议采用MHA(Master High Availability)方案:
- 安装管理节点:
bash复制yum install -y perl-DBD-MySQL perl-Config-Tiny perl-Log-Dispatch perl-Parallel-ForkManager
cpan install Mail::Send
- 配置mha_manager.cnf:
ini复制[server default]
manager_workdir=/var/log/masterha/app1
manager_log=/var/log/masterha/app1/manager.log
ssh_user=root
user=mha
password=mhapass
ping_interval=3
repl_user=repl
repl_password=replpass
master_ip_failover_script=/usr/local/bin/master_ip_failover
- 启动监控:
bash复制masterha_manager --conf=/etc/masterha/app1.cnf
5.2 读写分离实现
结合JEECG框架特性,推荐两种实现方式:
- 应用层配置(application.yml):
yaml复制spring:
datasource:
dynamic:
primary: master
strict: true
datasource:
master:
url: jdbc:mysql://master_ip:3306/jeecg_boot
username: jeecg
password: jeecg123
slave1:
url: jdbc:mysql://slave1_ip:3306/jeecg_boot
username: jeecg
password: jeecg123
lazy: true
- 中间件方案(MyCat配置示例):
xml复制<schema name="jeecg_boot" checkSQLschema="false" sqlMaxLimit="100">
<table name="sys_user" primaryKey="id" dataNode="dn1,dn2" rule="mod-long"/>
</schema>
<dataNode name="dn1" dataHost="host1" database="jeecg_boot"/>
<dataHost name="host1" maxCon="1000" minCon="10" balance="1" writeType="0" dbType="mysql" dbDriver="native">
<heartbeat>select user()</heartbeat>
<writeHost host="master" url="master_ip:3306" user="jeecg" password="jeecg123">
<readHost host="slave1" url="slave1_ip:3306" user="jeecg" password="jeecg123"/>
</writeHost>
</dataHost>
6. 日常维护与问题实录
6.1 备份恢复策略
结合主从架构的备份方案:
bash复制# 从库执行物理备份
mysqldump --single-transaction --master-data=2 --routines --triggers --databases jeecg_boot > jeecg_full_$(date +%F).sql
# 定时binlog备份
mysqlbinlog --read-from-remote-server --raw --host=master_ip --user=repl --password=SecurePass123! --stop-never mysql-bin.000008
6.2 常见故障处理
- 主键冲突错误(1062):
sql复制-- 临时跳过错误
STOP SLAVE;
SET GLOBAL sql_slave_skip_counter = 1;
START SLAVE;
-- 永久解决方案
slave-skip-errors = 1062
- 数据不一致修复:
bash复制# 使用pt-table-sync修复单表
pt-table-sync --sync-to-master h=slave_ip,D=jeecg_boot,t=sys_user --print
- 复制中断恢复:
sql复制-- 重新获取主库位置
SHOW MASTER STATUS;
-- 从库重新配置
STOP SLAVE;
CHANGE MASTER TO MASTER_LOG_FILE='mysql-bin.000009', MASTER_LOG_POS=107;
START SLAVE;
在实际JEECG生产环境中,我们遇到过动态表单修改导致的复制延迟问题。通过调整slave_parallel_workers参数并优化大表DDL操作时间窗口,最终将延迟时间控制在秒级以内。对于报表查询性能,建议在从库上为统计表添加合适的索引,例如为create_time字段添加组合索引可以显著提升时间范围查询效率。
