25 KiB
25 KiB
生产环境双机部署方案
📋 方案概述
现状
- 机器1: 172.16.0.67(已完整部署)
- 机器2: 172.16.0.68(待部署)
- 应用栈: 移动端前端、Web前端、后端服务、Nginx、Redis、MySQL、MinIO
设计目标
- 高可用性: 单机故障不影响服务可用性
- 负载均衡: 合理分配两台机器的负载
- 数据一致性: 确保数据同步和一致性
- 可扩展性: 支持后续扩展和升级
- 运维便利: 便于监控、维护和故障排查
🏗️ 架构设计方案
方案一:主备模式(推荐用于初期)
┌─────────────────────────────────────────────────────────┐
│ 用户请求 │
└──────────────────────┬──────────────────────────────────┘
│
▼
┌──────────────────────┐
│ 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)
# /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
1.2 从库配置(68)
# /etc/mysql/my.cnf
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
read-only = 1
replicate-do-db = hzdyjs_xg
1.3 从库数据初始化(重要!)
⚠️ 关键步骤:在配置主从复制之前,必须先初始化从库数据,确保从库有和主库一致的数据。
方法一:使用自动化脚本(推荐)
# 步骤1:在主库(67)执行数据导出
cd 部署脚本/
chmod +x init-mysql-slave-data.sh
./init-mysql-slave-data.sh
# 步骤2:在从库(68)执行数据导入
# 脚本会自动从主库复制备份文件到从库
./init-mysql-slave-data.sh
方法二:手动执行
# 步骤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 主从复制设置
-- 在主库(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)
# /etc/redis/redis.conf
bind 0.0.0.0
port 6379
requirepass Hzdyjs@123456
masterauth Hzdyjs@123456
2.2 从节点配置(68)
# /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 验证主从复制
# 在主节点写入
redis-cli -a Hzdyjs@123456 set test_key "test_value"
# 在从节点读取
redis-cli -a Hzdyjs@123456 get test_key
3. MinIO集群/主从配置
方案A:MinIO集群模式(推荐)
# 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 命令定期同步:
# 在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)
# /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
# CentOS/RHEL
yum install -y keepalived
# Ubuntu/Debian
apt-get install -y keepalived
5.2 主节点配置(67)
# /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)
# /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健康检查脚本
#!/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基础环境搭建
# 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
阶段二:数据库主从配置
⚠️ 重要:必须先初始化从库数据,再配置主从复制!
# 步骤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主从配置
# 1. 在67机器导出Redis数据(如需要)
redis-cli -a Hzdyjs@123456 --rdb /tmp/redis_backup.rdb
# 2. 在68机器配置Redis从节点(参考上述配置)
阶段四:MinIO配置
# 方案A:MinIO集群
docker-compose -f docker-compose-minio-cluster.yml up -d
# 方案B:MinIO主从同步
# 配置定时同步脚本
阶段五:后端服务部署
# 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
阶段六:前端部署
# 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配置
# 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
1.2 优化配置方案
推荐配置(性能优先):
# /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 性能监控
-- 查看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 优化配置
# /etc/redis/redis.conf 主节点配置
# 优化网络传输
tcp-backlog = 511
tcp-keepalive = 300
# 优化内存
maxmemory-policy = allkeys-lru
3. Nginx负载均衡性能优化
3.1 连接池优化
# nginx.conf
upstream backend_servers {
# 使用keepalive连接池
keepalive 32;
keepalive_requests 100;
keepalive_timeout 60s;
# 负载均衡算法
least_conn; # 最少连接数(推荐)
# ip_hash; # IP哈希(会话保持)
# fair; # 响应时间(需要第三方模块)
}
3.2 缓存优化
# 静态资源缓存
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 内核参数优化
# /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 文件描述符优化
# /etc/security/limits.conf
* soft nofile 65535
* hard nofile 65535
5. 数据库查询优化
5.1 读写分离
# 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 连接池优化
# 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 压力测试
# 使用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. 健康检查脚本
#!/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. 日志收集
# 统一日志目录
/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. 自动故障检测
#!/bin/bash
# failover_check.sh
# 检查主节点健康状态
if ! curl -f http://172.16.0.67:8080/health; then
echo "主节点故障,切换到备节点"
# 执行切换逻辑
# 1. 更新DNS/负载均衡配置
# 2. 提升从库为主库
# 3. 启动备节点服务
fi
2. 手动故障转移流程
- 检测故障: 确认主节点不可用
- 停止主节点服务: 防止数据冲突
- 提升从库: MySQL从库提升为主库
- 切换Redis: Redis从节点提升为主节点
- 更新配置: 修改应用配置指向新主节点
- 启动服务: 在备节点启动所有服务
- 验证功能: 验证服务正常
⚠️ 注意事项
1. 数据一致性
- MySQL主从复制可能存在延迟,关键操作建议在主库执行
- Redis主从复制为异步,注意数据一致性
- MinIO集群模式确保数据一致性,主从同步可能存在延迟
2. 网络配置
- 确保两台机器网络互通
- 配置防火墙规则允许必要端口
- 建议使用内网IP通信,提高安全性
3. 资源规划
- 根据实际负载调整实例数量
- 监控资源使用情况,及时扩容
- 预留足够的磁盘空间用于日志和备份
4. 安全配置
- 修改默认密码
- 配置SSL证书
- 限制数据库和Redis的访问IP
- 定期更新系统和软件
5. 备份策略
- 数据库: 每日全量备份 + 实时binlog备份
- 文件存储: MinIO定期同步/备份
- 配置文件: Git版本控制
- 应用日志: 定期归档和清理
📋 部署检查清单
部署前检查
- 两台机器网络互通
- 防火墙规则配置完成
- 基础软件安装完成
- 目录结构创建完成
- 配置文件准备完成
部署后验证
- MySQL主从复制正常
- Redis主从复制正常
- MinIO集群/同步正常
- 后端服务启动正常
- Nginx负载均衡正常
- 前端访问正常
- API接口测试通过
- 健康检查脚本正常
- 监控告警配置完成
🔧 常用运维命令
MySQL主从管理
# 查看主从状态
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主从管理
# 查看主从信息
redis-cli -a Hzdyjs@123456 INFO replication
# 手动切换主从
redis-cli -a Hzdyjs@123456 SLAVEOF NO ONE
服务管理
# 查看后端服务状态
ps aux | grep ruoyi-admin
# 重启后端服务
systemctl restart ruoyi-admin
# 查看Nginx状态
systemctl status nginx
# 重载Nginx配置
nginx -s reload
📞 技术支持
如遇到部署问题,请检查:
- 系统日志和应用日志
- 网络连通性
- 防火墙和安全组设置
- 数据库连接状态
- 资源使用情况(CPU、内存、磁盘)
📝 文档版本: v1.0
🔄 最后更新: 2025-01-27
👨💻 维护人员: 开发团队