979 lines
25 KiB
Markdown
979 lines
25 KiB
Markdown
# 生产环境双机部署方案
|
||
|
||
## 📋 方案概述
|
||
|
||
### 现状
|
||
- **机器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
|
||
**👨💻 维护人员**: 开发团队
|
||
|