提交
This commit is contained in:
1 parent
48109ff1e7
commit
4e34c7eb36
60 files changed
+9583
-139
No files matched your search
@@ -0,0 +1,978 @@
|
||||
# 生产环境双机部署方案
|
||||
|
||||
## 📋 方案概述
|
||||
|
||||
### 现状
|
||||
- **机器1**: 172.16.0.67(已完整部署)
|
||||
- **机器2**: 172.16.0.68(待部署)
|
||||
- **应用栈**: 移动端前端、Web前端、后端服务、Nginx、Redis、MySQL、MinIO
|
||||
|
||||
### 设计目标
|
||||
1. **高可用性**: 单机故障不影响服务可用性
|
||||
2. **负载均衡**: 合理分配两台机器的负载
|
||||
3. **数据一致性**: 确保数据同步和一致性
|
||||
4. **可扩展性**: 支持后续扩展和升级
|
||||
5. **运维便利**: 便于监控、维护和故障排查
|
||||
|
||||
---
|
||||
|
||||
## 🏗️ 架构设计方案
|
||||
|
||||
### 方案一:主备模式(推荐用于初期)
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ 用户请求 │
|
||||
└──────────────────────┬──────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────────────┐
|
||||
│ Nginx (67/68) │
|
||||
│ 负载均衡/主备 │
|
||||
└──────────┬───────────┘
|
||||
│
|
||||
┌──────────────┼──────────────┐
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
||||
│ 后端服务 │ │ 后端服务 │ │ 后端服务 │
|
||||
│ 67:8080 │ │ 67:8081 │ │ 68:8080 │
|
||||
└─────────────┘ └─────────────┘ └─────────────┘
|
||||
│ │ │
|
||||
└──────────────┼──────────────┘
|
||||
│
|
||||
┌──────────────┼──────────────┐
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
||||
│ MySQL │ │ Redis │ │ MinIO │
|
||||
│ 67(主) │ │ 67(主) │ │ 67(主) │
|
||||
│ 68(从) │ │ 68(从) │ │ 68(从) │
|
||||
└─────────────┘ └─────────────┘ └─────────────┘
|
||||
```
|
||||
|
||||
### 方案二:双活模式(推荐用于高负载场景)
|
||||
|
||||
```
|
||||
┌─────────────────────────────────────────────────────────┐
|
||||
│ 用户请求 │
|
||||
└──────────────────────┬──────────────────────────────────┘
|
||||
│
|
||||
▼
|
||||
┌──────────────────────┐
|
||||
│ Nginx (67/68) │
|
||||
│ 双机负载均衡 │
|
||||
└──────────┬───────────┘
|
||||
│
|
||||
┌──────────────┼──────────────┐
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
||||
│ 后端服务 │ │ 后端服务 │ │ 后端服务 │
|
||||
│ 67:8080 │ │ 67:8081 │ │ 68:8080 │
|
||||
└─────────────┘ └─────────────┘ └─────────────┘
|
||||
│ │ │
|
||||
└──────────────┼──────────────┘
|
||||
│
|
||||
┌──────────────┼──────────────┐
|
||||
│ │ │
|
||||
▼ ▼ ▼
|
||||
┌─────────────┐ ┌─────────────┐ ┌─────────────┐
|
||||
│ MySQL │ │ Redis │ │ MinIO │
|
||||
│ 67(主) │ │ 67(主) │ │ 67+68集群 │
|
||||
│ 68(从) │ │ 68(从) │ │ │
|
||||
└─────────────┘ └─────────────┘ └─────────────┘
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📊 资源分配方案
|
||||
|
||||
### 机器1 (172.16.0.67) - 主节点
|
||||
|
||||
| 服务 | 端口 | 说明 |
|
||||
|------|------|------|
|
||||
| **前端服务** | | |
|
||||
| Web前端 | 80 | Nginx静态资源 |
|
||||
| 移动端前端 | 80 | Nginx静态资源 |
|
||||
| **后端服务** | | |
|
||||
| 后端实例1 | 8080 | 主服务实例 |
|
||||
| 后端实例2 | 8081 | 备用实例(可选) |
|
||||
| **中间件** | | |
|
||||
| MySQL | 3306 | 主库 |
|
||||
| Redis | 6379 | 主节点 |
|
||||
| MinIO | 9000/9001 | 主节点 |
|
||||
| **负载均衡** | | |
|
||||
| Nginx | 80/443 | 主负载均衡器 |
|
||||
|
||||
### 机器2 (172.16.0.68) - 备节点/负载节点
|
||||
|
||||
| 服务 | 端口 | 说明 |
|
||||
|------|------|------|
|
||||
| **前端服务** | | |
|
||||
| Web前端 | 80 | Nginx静态资源(同步) |
|
||||
| 移动端前端 | 80 | Nginx静态资源(同步) |
|
||||
| **后端服务** | | |
|
||||
| 后端实例1 | 8080 | 负载均衡实例 |
|
||||
| 后端实例2 | 8081 | 负载均衡实例(可选) |
|
||||
| **中间件** | | |
|
||||
| MySQL | 3306 | 从库(主从复制) |
|
||||
| Redis | 6379 | 从节点(主从复制) |
|
||||
| MinIO | 9000/9001 | 从节点/集群节点 |
|
||||
| **负载均衡** | | |
|
||||
| Nginx | 80/443 | 备用负载均衡器 |
|
||||
|
||||
---
|
||||
|
||||
## 🔧 详细部署配置
|
||||
|
||||
### 1. MySQL主从复制配置
|
||||
|
||||
#### 1.1 主库配置(67)
|
||||
|
||||
```ini
|
||||
# /etc/mysql/my.cnf
|
||||
[mysqld]
|
||||
# 基础主从配置
|
||||
server-id = 1
|
||||
log-bin = mysql-bin
|
||||
binlog-format = ROW
|
||||
binlog-do-db = hzdyjs_xg
|
||||
expire_logs_days = 7
|
||||
max_binlog_size = 500M
|
||||
|
||||
# 性能优化配置(减少主从复制对主库性能影响)
|
||||
# 方案A:性能优先(推荐,性能影响约1-2%)
|
||||
sync_binlog = 0 # 由操作系统控制刷盘,性能最优
|
||||
binlog_cache_size = 2M # 增大binlog缓存
|
||||
max_binlog_cache_size = 512M
|
||||
|
||||
# 方案B:平衡方案(性能影响约2-3%)
|
||||
# sync_binlog = 100 # 每100个事务刷盘一次
|
||||
# binlog_cache_size = 2M
|
||||
|
||||
# 方案C:安全优先(性能影响约4-6%)
|
||||
# sync_binlog = 1 # 每次事务都刷盘,最安全但性能下降
|
||||
# binlog_cache_size = 1M
|
||||
```
|
||||
|
||||
> **💡 性能影响说明**:MySQL主从复制对主库性能影响通常为1-5%,具体取决于配置和负载。详细分析请参考:[MySQL主从复制性能影响分析.md](./MySQL主从复制性能影响分析.md)
|
||||
|
||||
#### 1.2 从库配置(68)
|
||||
|
||||
```ini
|
||||
# /etc/mysql/my.cnf
|
||||
[mysqld]
|
||||
server-id = 2
|
||||
relay-log = mysql-relay-bin
|
||||
read-only = 1
|
||||
replicate-do-db = hzdyjs_xg
|
||||
```
|
||||
|
||||
#### 1.3 从库数据初始化(重要!)
|
||||
|
||||
**⚠️ 关键步骤**:在配置主从复制之前,必须先初始化从库数据,确保从库有和主库一致的数据。
|
||||
|
||||
**方法一:使用自动化脚本(推荐)**
|
||||
|
||||
```bash
|
||||
# 步骤1:在主库(67)执行数据导出
|
||||
cd 部署脚本/
|
||||
chmod +x init-mysql-slave-data.sh
|
||||
./init-mysql-slave-data.sh
|
||||
|
||||
# 步骤2:在从库(68)执行数据导入
|
||||
# 脚本会自动从主库复制备份文件到从库
|
||||
./init-mysql-slave-data.sh
|
||||
```
|
||||
|
||||
**方法二:手动执行**
|
||||
|
||||
```bash
|
||||
# 步骤1:在主库(67)锁定表并导出数据
|
||||
mysql -u root -p -e "FLUSH TABLES WITH READ LOCK;"
|
||||
mysql -u root -p -e "SET GLOBAL read_only = ON;"
|
||||
mysqldump -u root -p \
|
||||
--single-transaction \
|
||||
--routines \
|
||||
--triggers \
|
||||
--events \
|
||||
--master-data=2 \
|
||||
hzdyjs_xg > /tmp/hzdyjs_xg_backup.sql
|
||||
mysql -u root -p -e "UNLOCK TABLES;"
|
||||
mysql -u root -p -e "SET GLOBAL read_only = OFF;"
|
||||
|
||||
# 记录主库binlog位置
|
||||
mysql -u root -p -e "SHOW MASTER STATUS;" > /tmp/master_status.txt
|
||||
|
||||
# 步骤2:复制备份文件到从库
|
||||
scp /tmp/hzdyjs_xg_backup.sql root@172.16.0.68:/tmp/
|
||||
scp /tmp/master_status.txt root@172.16.0.68:/tmp/
|
||||
|
||||
# 步骤3:在从库(68)导入数据
|
||||
mysql -u root -p -e "CREATE DATABASE IF NOT EXISTS hzdyjs_xg CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;"
|
||||
mysql -u root -p hzdyjs_xg < /tmp/hzdyjs_xg_backup.sql
|
||||
```
|
||||
|
||||
> **💡 重要提示**:
|
||||
> - 从库必须先有和主库一致的数据,才能配置主从复制
|
||||
> - 使用`--master-data=2`参数可以在备份文件中自动包含binlog位置信息
|
||||
> - 如果从库已有数据,需要先清空或重建数据库
|
||||
> - **⚠️ 系统数据库说明**:系统自带的数据库(`information_schema`、`mysql`、`performance_schema`、`sys`)**不需要**复制,原因如下:
|
||||
> - `information_schema`:MySQL自动管理的元数据,只读,每个实例独立
|
||||
> - `mysql`:系统数据库,包含用户和权限信息,但主从复制配置中已使用`binlog-do-db = hzdyjs_xg`,只复制业务数据库
|
||||
> - `performance_schema`:性能监控数据库,每个实例独立,不需要复制
|
||||
> - `sys`:基于performance_schema的视图,每个实例独立,不需要复制
|
||||
> - **结论**:只需要复制业务数据库`hzdyjs_xg`,系统数据库由MySQL自动管理,保持默认状态即可
|
||||
|
||||
#### 1.4 主从复制设置
|
||||
|
||||
```sql
|
||||
-- 在主库(67)执行
|
||||
CREATE USER 'repl'@'172.16.0.68' IDENTIFIED BY 'Repl@123456';
|
||||
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'172.16.0.68';
|
||||
FLUSH PRIVILEGES;
|
||||
SHOW MASTER STATUS;
|
||||
|
||||
-- 在从库(68)执行(使用主库的binlog位置)
|
||||
CHANGE MASTER TO
|
||||
MASTER_HOST='172.16.0.67',
|
||||
MASTER_USER='repl',
|
||||
MASTER_PASSWORD='Repl@123456',
|
||||
MASTER_LOG_FILE='mysql-bin.000001', -- 从 SHOW MASTER STATUS 获取
|
||||
MASTER_LOG_POS=154; -- 从 SHOW MASTER STATUS 获取
|
||||
START SLAVE;
|
||||
SHOW SLAVE STATUS\G;
|
||||
```
|
||||
|
||||
### 2. Redis主从复制配置
|
||||
|
||||
#### 2.1 主节点配置(67)
|
||||
|
||||
```conf
|
||||
# /etc/redis/redis.conf
|
||||
bind 0.0.0.0
|
||||
port 6379
|
||||
requirepass Hzdyjs@123456
|
||||
masterauth Hzdyjs@123456
|
||||
```
|
||||
|
||||
#### 2.2 从节点配置(68)
|
||||
|
||||
```conf
|
||||
# /etc/redis/redis.conf
|
||||
bind 0.0.0.0
|
||||
port 6379
|
||||
requirepass Hzdyjs@123456
|
||||
replicaof 172.16.0.67 6379
|
||||
masterauth Hzdyjs@123456
|
||||
```
|
||||
|
||||
#### 2.3 验证主从复制
|
||||
|
||||
```bash
|
||||
# 在主节点写入
|
||||
redis-cli -a Hzdyjs@123456 set test_key "test_value"
|
||||
|
||||
# 在从节点读取
|
||||
redis-cli -a Hzdyjs@123456 get test_key
|
||||
```
|
||||
|
||||
### 3. MinIO集群/主从配置
|
||||
|
||||
#### 方案A:MinIO集群模式(推荐)
|
||||
|
||||
```yaml
|
||||
# docker-compose-minio-cluster.yml
|
||||
version: '3.8'
|
||||
services:
|
||||
minio1:
|
||||
image: minio/minio:RELEASE.2025-04-22T22-12-26Z
|
||||
container_name: minio1
|
||||
command: server --address ":9000" --console-address ":9001" http://minio{1...2}/data
|
||||
environment:
|
||||
MINIO_ROOT_USER: ruoyi
|
||||
MINIO_ROOT_PASSWORD: ruoyi123
|
||||
volumes:
|
||||
- /docker/minio/data1:/data
|
||||
ports:
|
||||
- "9000:9000"
|
||||
- "9001:9001"
|
||||
networks:
|
||||
- minio-cluster
|
||||
|
||||
minio2:
|
||||
image: minio/minio:RELEASE.2025-04-22T22-12-26Z
|
||||
container_name: minio2
|
||||
command: server --address ":9000" --console-address ":9001" http://minio{1...2}/data
|
||||
environment:
|
||||
MINIO_ROOT_USER: ruoyi
|
||||
MINIO_ROOT_PASSWORD: ruoyi123
|
||||
volumes:
|
||||
- /docker/minio/data2:/data
|
||||
ports:
|
||||
- "9002:9000"
|
||||
- "9003:9001"
|
||||
networks:
|
||||
- minio-cluster
|
||||
|
||||
networks:
|
||||
minio-cluster:
|
||||
driver: bridge
|
||||
```
|
||||
|
||||
#### 方案B:MinIO主从同步(简单方案)
|
||||
|
||||
使用 `mc mirror` 命令定期同步:
|
||||
|
||||
```bash
|
||||
# 在68机器上配置定时同步
|
||||
mc alias set minio67 http://172.16.0.67:9000 ruoyi ruoyi123
|
||||
mc alias set minio68 http://172.16.0.68:9000 ruoyi ruoyi123
|
||||
|
||||
# 定时同步脚本
|
||||
#!/bin/bash
|
||||
mc mirror --watch minio67/ruoyi minio68/ruoyi
|
||||
```
|
||||
|
||||
### 4. Nginx负载均衡配置
|
||||
|
||||
#### 4.1 主负载均衡器(67)
|
||||
|
||||
```nginx
|
||||
# /etc/nginx/nginx.conf
|
||||
upstream backend_servers {
|
||||
# 机器67的后端实例
|
||||
server 127.0.0.1:8080 weight=2 max_fails=3 fail_timeout=30s;
|
||||
server 127.0.0.1:8081 weight=1 max_fails=3 fail_timeout=30s;
|
||||
# 机器68的后端实例
|
||||
server 172.16.0.68:8080 weight=2 max_fails=3 fail_timeout=30s;
|
||||
server 172.16.0.68:8081 weight=1 max_fails=3 fail_timeout=30s;
|
||||
|
||||
# 健康检查
|
||||
keepalive 32;
|
||||
}
|
||||
|
||||
server {
|
||||
listen 80;
|
||||
server_name your-domain.com;
|
||||
|
||||
# Web前端
|
||||
location / {
|
||||
root /root/hzdyjsweb9091/dist;
|
||||
try_files $uri $uri/ /index.html;
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
# 移动端前端
|
||||
location /mobile {
|
||||
alias /root/mobile/dist;
|
||||
try_files $uri $uri/ /mobile/index.html;
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
}
|
||||
|
||||
# API代理
|
||||
location /prod-api/ {
|
||||
proxy_pass http://backend_servers/;
|
||||
proxy_set_header Host $host;
|
||||
proxy_set_header X-Real-IP $remote_addr;
|
||||
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
|
||||
proxy_set_header X-Forwarded-Proto $scheme;
|
||||
|
||||
# 超时设置
|
||||
proxy_connect_timeout 30s;
|
||||
proxy_send_timeout 30s;
|
||||
proxy_read_timeout 30s;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 4.2 备用负载均衡器(68)
|
||||
|
||||
配置与67相同,作为备用。可通过Keepalived实现VIP自动切换。
|
||||
|
||||
### 5. Keepalived高可用配置(可选)
|
||||
|
||||
#### 5.1 安装Keepalived
|
||||
|
||||
```bash
|
||||
# CentOS/RHEL
|
||||
yum install -y keepalived
|
||||
|
||||
# Ubuntu/Debian
|
||||
apt-get install -y keepalived
|
||||
```
|
||||
|
||||
#### 5.2 主节点配置(67)
|
||||
|
||||
```conf
|
||||
# /etc/keepalived/keepalived.conf
|
||||
global_defs {
|
||||
router_id nginx_master
|
||||
}
|
||||
|
||||
vrrp_script chk_nginx {
|
||||
script "/etc/keepalived/check_nginx.sh"
|
||||
interval 2
|
||||
weight -2
|
||||
fall 3
|
||||
rise 2
|
||||
}
|
||||
|
||||
vrrp_instance VI_1 {
|
||||
state MASTER
|
||||
interface eth0
|
||||
virtual_router_id 51
|
||||
priority 100
|
||||
advert_int 1
|
||||
authentication {
|
||||
auth_type PASS
|
||||
auth_pass KeepAlive@123
|
||||
}
|
||||
virtual_ipaddress {
|
||||
172.16.0.100/24
|
||||
}
|
||||
track_script {
|
||||
chk_nginx
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 5.3 备节点配置(68)
|
||||
|
||||
```conf
|
||||
# /etc/keepalived/keepalived.conf
|
||||
global_defs {
|
||||
router_id nginx_backup
|
||||
}
|
||||
|
||||
vrrp_script chk_nginx {
|
||||
script "/etc/keepalived/check_nginx.sh"
|
||||
interval 2
|
||||
weight -2
|
||||
fall 3
|
||||
rise 2
|
||||
}
|
||||
|
||||
vrrp_instance VI_1 {
|
||||
state BACKUP
|
||||
interface eth0
|
||||
virtual_router_id 51
|
||||
priority 90
|
||||
advert_int 1
|
||||
authentication {
|
||||
auth_type PASS
|
||||
auth_pass KeepAlive@123
|
||||
}
|
||||
virtual_ipaddress {
|
||||
172.16.0.100/24
|
||||
}
|
||||
track_script {
|
||||
chk_nginx
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
#### 5.4 Nginx健康检查脚本
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# /etc/keepalived/check_nginx.sh
|
||||
if ! pgrep -x nginx > /dev/null; then
|
||||
systemctl start nginx
|
||||
sleep 2
|
||||
if ! pgrep -x nginx > /dev/null; then
|
||||
exit 1
|
||||
fi
|
||||
fi
|
||||
exit 0
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🚀 部署步骤
|
||||
|
||||
### 阶段一:机器2基础环境搭建
|
||||
|
||||
```bash
|
||||
# 1. 安装基础软件
|
||||
yum install -y nginx mysql redis docker docker-compose
|
||||
|
||||
# 2. 创建目录结构
|
||||
mkdir -p /root/hzdyjsweb9091/dist
|
||||
mkdir -p /root/mobile/dist
|
||||
mkdir -p /docker/{mysql,redis,minio}/{data,config,logs}
|
||||
|
||||
# 3. 配置防火墙
|
||||
firewall-cmd --permanent --add-port={80,443,8080,8081,3306,6379,9000,9001}/tcp
|
||||
firewall-cmd --reload
|
||||
```
|
||||
|
||||
### 阶段二:数据库主从配置
|
||||
|
||||
**⚠️ 重要**:必须先初始化从库数据,再配置主从复制!
|
||||
|
||||
```bash
|
||||
# 步骤1:从库数据初始化(在主库67执行)
|
||||
cd 部署脚本/
|
||||
chmod +x init-mysql-slave-data.sh
|
||||
./init-mysql-slave-data.sh
|
||||
|
||||
# 步骤2:从库数据导入(在从库68执行)
|
||||
./init-mysql-slave-data.sh
|
||||
|
||||
# 步骤3:配置主从复制(在主库67执行)
|
||||
chmod +x setup-mysql-replication.sh
|
||||
./setup-mysql-replication.sh
|
||||
|
||||
# 步骤4:配置从库复制(在从库68执行)
|
||||
./setup-mysql-replication.sh
|
||||
# 输入主库的 MASTER_LOG_FILE 和 MASTER_LOG_POS(从步骤1的输出获取)
|
||||
```
|
||||
|
||||
### 阶段三:Redis主从配置
|
||||
|
||||
```bash
|
||||
# 1. 在67机器导出Redis数据(如需要)
|
||||
redis-cli -a Hzdyjs@123456 --rdb /tmp/redis_backup.rdb
|
||||
|
||||
# 2. 在68机器配置Redis从节点(参考上述配置)
|
||||
```
|
||||
|
||||
### 阶段四:MinIO配置
|
||||
|
||||
```bash
|
||||
# 方案A:MinIO集群
|
||||
docker-compose -f docker-compose-minio-cluster.yml up -d
|
||||
|
||||
# 方案B:MinIO主从同步
|
||||
# 配置定时同步脚本
|
||||
```
|
||||
|
||||
### 阶段五:后端服务部署
|
||||
|
||||
```bash
|
||||
# 1. 复制JAR包到68机器
|
||||
scp ruoyi-admin.jar root@172.16.0.68:/root/
|
||||
|
||||
# 2. 修改配置文件
|
||||
# application-prod.yml 中修改数据库和Redis地址
|
||||
|
||||
# 3. 启动服务
|
||||
java -jar -Dspring.profiles.active=prod ruoyi-admin.jar --server.port=8080
|
||||
```
|
||||
|
||||
### 阶段六:前端部署
|
||||
|
||||
```bash
|
||||
# 1. 构建前端
|
||||
cd web && npm run build:prod
|
||||
cd ../mobile && npm run build:prod
|
||||
|
||||
# 2. 同步到68机器
|
||||
rsync -avz web/dist/ root@172.16.0.68:/root/hzdyjsweb9091/dist/
|
||||
rsync -avz mobile/dist/ root@172.16.0.68:/root/mobile/dist/
|
||||
```
|
||||
|
||||
### 阶段七:Nginx配置
|
||||
|
||||
```bash
|
||||
# 1. 复制Nginx配置到68机器
|
||||
scp nginx.conf root@172.16.0.68:/etc/nginx/nginx.conf
|
||||
|
||||
# 2. 测试配置
|
||||
nginx -t
|
||||
|
||||
# 3. 启动Nginx
|
||||
systemctl start nginx
|
||||
systemctl enable nginx
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## ⚡ 性能优化
|
||||
|
||||
### 1. MySQL主从复制性能优化
|
||||
|
||||
#### 1.1 性能影响分析
|
||||
|
||||
**核心结论**:MySQL主从复制对主库性能的影响通常很小,约在 **1-5%** 之间。
|
||||
|
||||
| 场景 | 性能影响 | 说明 |
|
||||
|------|---------|------|
|
||||
| 低负载场景 | 1-2% | 写入量小,影响可忽略 |
|
||||
| 中等负载场景 | 2-4% | 正常业务负载,影响轻微 |
|
||||
| 高负载场景 | 4-8% | 大量写入操作,影响稍明显 |
|
||||
|
||||
**详细分析文档**:📄 [MySQL主从复制性能影响分析.md](./MySQL主从复制性能影响分析.md)
|
||||
|
||||
#### 1.2 优化配置方案
|
||||
|
||||
**推荐配置(性能优先)**:
|
||||
|
||||
```ini
|
||||
# /etc/my.cnf 主库配置
|
||||
[mysqld]
|
||||
# 性能优化配置
|
||||
sync_binlog = 0 # 由操作系统控制刷盘,性能最优(性能影响约1-2%)
|
||||
binlog_cache_size = 2M # 增大binlog缓存
|
||||
max_binlog_cache_size = 512M
|
||||
max_binlog_size = 500M # 增大binlog文件大小
|
||||
```
|
||||
|
||||
**性能提升**:
|
||||
- 使用`sync_binlog=0`可提升约3-5%
|
||||
- 增大binlog缓存可减少磁盘I/O
|
||||
- 使用SSD存储binlog可提升50-80%
|
||||
|
||||
#### 1.3 性能监控
|
||||
|
||||
```sql
|
||||
-- 查看binlog写入性能
|
||||
SHOW STATUS LIKE 'Binlog_cache%';
|
||||
|
||||
-- 查看主从复制延迟
|
||||
SHOW SLAVE STATUS\G
|
||||
-- 关注:Seconds_Behind_Master(应 < 1秒)
|
||||
|
||||
-- 查看binlog文件大小
|
||||
SHOW BINARY LOGS;
|
||||
```
|
||||
|
||||
### 2. Redis主从复制性能优化
|
||||
|
||||
#### 2.1 性能影响分析
|
||||
|
||||
Redis主从复制对主节点性能影响极小(< 1%),因为:
|
||||
- Redis主从复制是异步的
|
||||
- 主节点只需要将命令发送给从节点
|
||||
- 网络传输开销很小
|
||||
|
||||
#### 2.2 优化配置
|
||||
|
||||
```conf
|
||||
# /etc/redis/redis.conf 主节点配置
|
||||
# 优化网络传输
|
||||
tcp-backlog = 511
|
||||
tcp-keepalive = 300
|
||||
|
||||
# 优化内存
|
||||
maxmemory-policy = allkeys-lru
|
||||
```
|
||||
|
||||
### 3. Nginx负载均衡性能优化
|
||||
|
||||
#### 3.1 连接池优化
|
||||
|
||||
```nginx
|
||||
# nginx.conf
|
||||
upstream backend_servers {
|
||||
# 使用keepalive连接池
|
||||
keepalive 32;
|
||||
keepalive_requests 100;
|
||||
keepalive_timeout 60s;
|
||||
|
||||
# 负载均衡算法
|
||||
least_conn; # 最少连接数(推荐)
|
||||
# ip_hash; # IP哈希(会话保持)
|
||||
# fair; # 响应时间(需要第三方模块)
|
||||
}
|
||||
```
|
||||
|
||||
#### 3.2 缓存优化
|
||||
|
||||
```nginx
|
||||
# 静态资源缓存
|
||||
location ~* \.(jpg|jpeg|png|gif|ico|css|js)$ {
|
||||
expires 1y;
|
||||
add_header Cache-Control "public, immutable";
|
||||
access_log off;
|
||||
}
|
||||
|
||||
# API响应缓存(可选)
|
||||
proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=api_cache:10m max_size=1g inactive=60m;
|
||||
```
|
||||
|
||||
### 4. 系统资源优化
|
||||
|
||||
#### 4.1 内核参数优化
|
||||
|
||||
```bash
|
||||
# /etc/sysctl.conf
|
||||
# 网络优化
|
||||
net.core.somaxconn = 65535
|
||||
net.ipv4.tcp_max_syn_backlog = 65535
|
||||
net.ipv4.tcp_tw_reuse = 1
|
||||
net.ipv4.tcp_fin_timeout = 30
|
||||
|
||||
# 内存优化
|
||||
vm.swappiness = 10
|
||||
vm.overcommit_memory = 1
|
||||
|
||||
# 应用配置
|
||||
sysctl -p
|
||||
```
|
||||
|
||||
#### 4.2 文件描述符优化
|
||||
|
||||
```bash
|
||||
# /etc/security/limits.conf
|
||||
* soft nofile 65535
|
||||
* hard nofile 65535
|
||||
```
|
||||
|
||||
### 5. 数据库查询优化
|
||||
|
||||
#### 5.1 读写分离
|
||||
|
||||
```yaml
|
||||
# application-prod.yml
|
||||
spring:
|
||||
datasource:
|
||||
dynamic:
|
||||
primary: master
|
||||
strict: false
|
||||
datasource:
|
||||
master:
|
||||
url: jdbc:mysql://172.16.0.67:3306/hzdyjs_xg
|
||||
# 写操作使用主库
|
||||
slave:
|
||||
url: jdbc:mysql://172.16.0.68:3306/hzdyjs_xg
|
||||
# 读操作使用从库
|
||||
```
|
||||
|
||||
**性能提升**:
|
||||
- 读操作分流到从库,减轻主库压力
|
||||
- 主库专注于写操作,性能提升约20-30%
|
||||
|
||||
#### 5.2 连接池优化
|
||||
|
||||
```yaml
|
||||
# application-prod.yml
|
||||
spring:
|
||||
datasource:
|
||||
druid:
|
||||
initial-size: 10
|
||||
min-idle: 10
|
||||
max-active: 50
|
||||
max-wait: 60000
|
||||
time-between-eviction-runs-millis: 60000
|
||||
min-evictable-idle-time-millis: 300000
|
||||
```
|
||||
|
||||
### 6. 性能测试和基准
|
||||
|
||||
#### 6.1 压力测试
|
||||
|
||||
```bash
|
||||
# 使用Apache Bench测试
|
||||
ab -n 10000 -c 100 http://your-domain.com/prod-api/
|
||||
|
||||
# 使用wrk测试
|
||||
wrk -t4 -c100 -d30s http://your-domain.com/prod-api/
|
||||
```
|
||||
|
||||
#### 6.2 性能基准
|
||||
|
||||
| 指标 | 目标值 | 说明 |
|
||||
|------|--------|------|
|
||||
| API响应时间 | < 200ms | 95%请求 |
|
||||
| 数据库查询时间 | < 50ms | 平均查询时间 |
|
||||
| 主从复制延迟 | < 1s | Seconds_Behind_Master |
|
||||
| CPU使用率 | < 70% | 正常负载 |
|
||||
| 内存使用率 | < 80% | 正常负载 |
|
||||
|
||||
---
|
||||
|
||||
## 📈 监控和运维
|
||||
|
||||
### 1. 健康检查脚本
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# health_check.sh
|
||||
|
||||
# 检查MySQL主从状态
|
||||
mysql -u root -p -e "SHOW SLAVE STATUS\G" | grep -i "slave_io_running\|slave_sql_running"
|
||||
|
||||
# 检查Redis主从状态
|
||||
redis-cli -a Hzdyjs@123456 INFO replication
|
||||
|
||||
# 检查后端服务
|
||||
curl -f http://127.0.0.1:8080/health || echo "Backend service down"
|
||||
|
||||
# 检查Nginx
|
||||
systemctl is-active nginx || echo "Nginx down"
|
||||
```
|
||||
|
||||
### 2. 日志收集
|
||||
|
||||
```bash
|
||||
# 统一日志目录
|
||||
/var/log/app/
|
||||
├── nginx/
|
||||
│ ├── access.log
|
||||
│ └── error.log
|
||||
├── backend/
|
||||
│ ├── ruoyi-admin-8080.log
|
||||
│ └── ruoyi-admin-8081.log
|
||||
└── mysql/
|
||||
├── error.log
|
||||
└── slow-query.log
|
||||
```
|
||||
|
||||
### 3. 监控指标
|
||||
|
||||
- **系统指标**: CPU、内存、磁盘、网络
|
||||
- **应用指标**: 请求量、响应时间、错误率
|
||||
- **数据库指标**: 连接数、慢查询、主从延迟
|
||||
- **Redis指标**: 内存使用、命中率、主从状态
|
||||
|
||||
---
|
||||
|
||||
## 🔄 故障转移方案
|
||||
|
||||
### 1. 自动故障检测
|
||||
|
||||
```bash
|
||||
#!/bin/bash
|
||||
# failover_check.sh
|
||||
|
||||
# 检查主节点健康状态
|
||||
if ! curl -f http://172.16.0.67:8080/health; then
|
||||
echo "主节点故障,切换到备节点"
|
||||
# 执行切换逻辑
|
||||
# 1. 更新DNS/负载均衡配置
|
||||
# 2. 提升从库为主库
|
||||
# 3. 启动备节点服务
|
||||
fi
|
||||
```
|
||||
|
||||
### 2. 手动故障转移流程
|
||||
|
||||
1. **检测故障**: 确认主节点不可用
|
||||
2. **停止主节点服务**: 防止数据冲突
|
||||
3. **提升从库**: MySQL从库提升为主库
|
||||
4. **切换Redis**: Redis从节点提升为主节点
|
||||
5. **更新配置**: 修改应用配置指向新主节点
|
||||
6. **启动服务**: 在备节点启动所有服务
|
||||
7. **验证功能**: 验证服务正常
|
||||
|
||||
---
|
||||
|
||||
## ⚠️ 注意事项
|
||||
|
||||
### 1. 数据一致性
|
||||
- MySQL主从复制可能存在延迟,关键操作建议在主库执行
|
||||
- Redis主从复制为异步,注意数据一致性
|
||||
- MinIO集群模式确保数据一致性,主从同步可能存在延迟
|
||||
|
||||
### 2. 网络配置
|
||||
- 确保两台机器网络互通
|
||||
- 配置防火墙规则允许必要端口
|
||||
- 建议使用内网IP通信,提高安全性
|
||||
|
||||
### 3. 资源规划
|
||||
- 根据实际负载调整实例数量
|
||||
- 监控资源使用情况,及时扩容
|
||||
- 预留足够的磁盘空间用于日志和备份
|
||||
|
||||
### 4. 安全配置
|
||||
- 修改默认密码
|
||||
- 配置SSL证书
|
||||
- 限制数据库和Redis的访问IP
|
||||
- 定期更新系统和软件
|
||||
|
||||
### 5. 备份策略
|
||||
- **数据库**: 每日全量备份 + 实时binlog备份
|
||||
- **文件存储**: MinIO定期同步/备份
|
||||
- **配置文件**: Git版本控制
|
||||
- **应用日志**: 定期归档和清理
|
||||
|
||||
---
|
||||
|
||||
## 📋 部署检查清单
|
||||
|
||||
### 部署前检查
|
||||
- [ ] 两台机器网络互通
|
||||
- [ ] 防火墙规则配置完成
|
||||
- [ ] 基础软件安装完成
|
||||
- [ ] 目录结构创建完成
|
||||
- [ ] 配置文件准备完成
|
||||
|
||||
### 部署后验证
|
||||
- [ ] MySQL主从复制正常
|
||||
- [ ] Redis主从复制正常
|
||||
- [ ] MinIO集群/同步正常
|
||||
- [ ] 后端服务启动正常
|
||||
- [ ] Nginx负载均衡正常
|
||||
- [ ] 前端访问正常
|
||||
- [ ] API接口测试通过
|
||||
- [ ] 健康检查脚本正常
|
||||
- [ ] 监控告警配置完成
|
||||
|
||||
---
|
||||
|
||||
## 🔧 常用运维命令
|
||||
|
||||
### MySQL主从管理
|
||||
|
||||
```bash
|
||||
# 查看主从状态
|
||||
mysql -u root -p -e "SHOW SLAVE STATUS\G"
|
||||
|
||||
# 停止从库复制
|
||||
mysql -u root -p -e "STOP SLAVE;"
|
||||
|
||||
# 启动从库复制
|
||||
mysql -u root -p -e "START SLAVE;"
|
||||
|
||||
# 重置从库
|
||||
mysql -u root -p -e "RESET SLAVE;"
|
||||
```
|
||||
|
||||
### Redis主从管理
|
||||
|
||||
```bash
|
||||
# 查看主从信息
|
||||
redis-cli -a Hzdyjs@123456 INFO replication
|
||||
|
||||
# 手动切换主从
|
||||
redis-cli -a Hzdyjs@123456 SLAVEOF NO ONE
|
||||
```
|
||||
|
||||
### 服务管理
|
||||
|
||||
```bash
|
||||
# 查看后端服务状态
|
||||
ps aux | grep ruoyi-admin
|
||||
|
||||
# 重启后端服务
|
||||
systemctl restart ruoyi-admin
|
||||
|
||||
# 查看Nginx状态
|
||||
systemctl status nginx
|
||||
|
||||
# 重载Nginx配置
|
||||
nginx -s reload
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📞 技术支持
|
||||
|
||||
如遇到部署问题,请检查:
|
||||
1. 系统日志和应用日志
|
||||
2. 网络连通性
|
||||
3. 防火墙和安全组设置
|
||||
4. 数据库连接状态
|
||||
5. 资源使用情况(CPU、内存、磁盘)
|
||||
|
||||
---
|
||||
|
||||
**📝 文档版本**: v1.0
|
||||
**🔄 最后更新**: 2025-01-27
|
||||
**👨💻 维护人员**: 开发团队
|
||||
|
||||
Reference in new issue
Block a user