1. 项目概述
中州养老系统是一款专为养老机构设计的数字化管理平台,采用前后端分离架构,包含管理后台和家属端两个子系统。作为运维工程师,我们需要将这套系统部署到生产环境中,确保其稳定运行。整个部署过程涉及3台服务器节点、5类核心服务(数据库、缓存、后端、前端、AI模型)以及2个第三方云服务(阿里云OSS、百度千帆)的集成。
这个项目最让我印象深刻的是其完整的养老业务闭环——从老人入住登记、日常护理到家属互动,每个环节都实现了数字化管理。特别是在AI能力整合方面,系统不仅接入了大模型分析体检报告,还部署了本地化智能客服,这在同类养老系统中属于比较前沿的设计。
2. 部署架构设计
2.1 节点规划方案
经过与开发团队的多次讨论,我们最终确定了三节点部署方案:
-
节点1(数据服务节点)
- MySQL 8.0:存储所有业务数据
- Redis 7.0:缓存热点数据、会话信息
- 配置要求:4核CPU/8GB内存/100GB SSD
-
节点2(应用服务节点)
- Java后端服务(Spring Boot)
- JDK 11运行环境
- 配置要求:4核CPU/8GB内存/50GB SSD
-
节点3(接入层节点)
- Nginx 1.20:反向代理和静态资源服务
- 前端Vue项目
- 配置要求:2核CPU/4GB内存/50GB SSD
实际部署时发现,初期Redis内存占用经常超过2GB,后来我们将节点1升级到了16GB内存。建议类似项目预留30%以上的资源余量。
2.2 第三方服务集成
系统需要对接两个关键云服务:
-
阿里云OSS
- 用于存储老人档案、体检报告等文件
- 开通步骤:创建Bucket → 设置公共读权限 → 生成AccessKey
-
百度千帆大模型
- 提供体检报告智能分析能力
- 需要申请API Key并开通ERNIE-Bot服务
3. 基础环境准备
3.1 服务器初始化
我们在阿里云申请了三台ECS实例,规格选择如下:
bash复制# 查看实例规格
cat /proc/cpuinfo | grep "model name"
free -h
df -h
主机命名规范采用"节点角色+机构域名"的形式:
bash复制# 设置主机名
hostnamectl set-hostname node1.itcast.cn
hostnamectl set-hostname node2.itcast.cn
hostnamectl set-hostname node3.itcast.cn
# 生效需要重新登录
su
3.2 安全组配置
在阿里云控制台为三台服务器配置安全组规则:
| 端口 | 协议 | 源IP | 用途 |
|---|---|---|---|
| 22 | TCP | 运维IP | SSH管理 |
| 3306 | TCP | 内网IP | MySQL |
| 6379 | TCP | 内网IP | Redis |
| 8080 | TCP | 内网IP | 后端服务 |
| 80 | TCP | 0.0.0.0/0 | Web访问 |
4. 数据库服务部署
4.1 MySQL安装与配置
选择MySQL 8.0社区版,安装过程需要注意:
- 禁用默认的密码强度验证插件
- 设置合适的字符集(utf8mb4)
- 配置合理的缓冲区大小
bash复制# 安装步骤示例
wget https://dev.mysql.com/get/mysql80-community-release-el7-6.noarch.rpm
rpm -ivh mysql80-community-release-el7-6.noarch.rpm
yum install mysql-community-server -y
# 关键配置项
[mysqld]
character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci
innodb_buffer_pool_size=2G
max_connections=200
4.2 数据导入操作
将开发提供的SQL文件导入到新建的数据库中:
bash复制mysql -uroot -pAa123456. < ry-zzyl.sql
验证导入结果:
bash复制mysql -uroot -pAa123456. -e 'use ry-zzyl; show tables;'
常见问题处理:
- 如果导入报错"ERROR 2006 (HY000)",可能是SQL文件过大,需要调整max_allowed_packet参数
- 字符集不匹配会导致中文乱码,需确保建表语句指定了utf8mb4
5. Redis服务部署
5.1 安装与基础配置
选择Redis 7.0稳定版,主要配置点:
bash复制# 关键配置项
bind 0.0.0.0
protected-mode no
daemonize yes
requirepass "Redis@123"
maxmemory 2gb
maxmemory-policy allkeys-lru
5.2 性能优化建议
- 根据业务特点设置合适的淘汰策略(本项目选择allkeys-lru)
- 对于高频访问的数据,可以启用持久化:
bash复制appendonly yes appendfsync everysec - 监控内存使用情况,避免OOM:
bash复制
redis-cli info memory
6. 后端服务部署
6.1 Java环境配置
安装JDK 11并设置环境变量:
bash复制# 下载OpenJDK
wget https://download.java.net/openjdk/jdk11/ri/openjdk-11+28_linux-x64_bin.tar.gz
# 设置环境变量
echo 'export JAVA_HOME=/usr/local/jdk-11' >> /etc/profile
echo 'export PATH=$JAVA_HOME/bin:$PATH' >> /etc/profile
source /etc/profile
6.2 服务启动与管理
使用screen工具实现后台运行:
bash复制# 安装screen
yum install epel-release -y
yum install screen -y
# 创建持久会话
screen -S zzyl-backend
java -jar zzyl-admin.jar
# 退出会话(按Ctrl+A然后按D)
日常运维命令:
- 查看会话:
screen -ls - 恢复会话:
screen -r zzyl-backend - 结束会话:在会话中按Ctrl+D
7. 前端服务部署
7.1 Nginx安装与配置
编译安装Nginx 1.20,启用gzip压缩和静态缓存:
bash复制./configure --prefix=/usr/local/nginx \
--with-http_ssl_module \
--with-http_gzip_static_module \
--with-http_realip_module
关键配置项:
nginx复制server {
listen 80;
server_name localhost;
# 静态资源
location / {
root /var/www/dist;
index index.html;
try_files $uri $uri/ /index.html;
}
# API反向代理
location /prod-api/ {
proxy_pass http://node2:8080/zzyl-admin/;
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
}
}
7.2 前端优化技巧
- 启用Brotli压缩(比gzip效率更高)
- 配置长期缓存策略:
nginx复制location ~* \.(js|css|png|jpg|jpeg|gif|ico)$ { expires 1y; add_header Cache-Control "public"; } - 限制上传文件大小:
nginx复制client_max_body_size 60m; client_body_buffer_size 512k;
8. 智能客服系统部署
8.1 GPU环境准备
验证显卡驱动安装:
bash复制nvidia-smi
安装CUDA工具包:
bash复制wget https://developer.download.nvidia.com/compute/cuda/12.6.3/local_installers/cuda_12.6.3_560.35.05_linux.run
sh cuda_12.6.3_560.35.05_linux.run
8.2 ChatGLM-6B部署
使用conda创建Python虚拟环境:
bash复制conda create -n chatglm python=3.10
conda activate chatglm
下载模型权重:
bash复制huggingface-cli download --resume-download THUDM/chatglm-6b-int4 --local-dir THUDM/chatglm-6b-int4
启动API服务:
bash复制cd ChatGLM-6B
python api.py
性能优化建议:
- 使用vLLM加速推理
- 启用量化(4bit或8bit)
- 限制最大token数避免OOM
9. 系统集成与测试
9.1 配置整合
后端服务需要配置三个关键参数:
- 数据库连接信息(node1)
- Redis连接信息(node1)
- 云服务AccessKey(OSS和千帆)
配置文件示例:
properties复制spring.datasource.url=jdbc:mysql://node1:3306/ry-zzyl
spring.redis.host=node1
aliyun.oss.endpoint=oss-cn-hangzhou.aliyuncs.com
baidu.qianfan.api-key=your_api_key
9.2 全链路验证
测试流程:
- 前端访问 → Nginx(node3)
- API请求 → 后端服务(node2)
- 数据存取 → MySQL/Redis(node1)
- 文件上传 → 阿里云OSS
- 体检分析 → 百度千帆API
- 智能客服 → ChatGLM-6B(独立GPU服务器)
10. 运维监控方案
10.1 基础监控项
-
服务器层面
- CPU/Memory/Disk使用率
- 网络流量
- 进程存活状态
-
服务层面
- MySQL:连接数、慢查询
- Redis:内存使用、命中率
- Java:堆内存、GC情况
- Nginx:请求量、错误率
10.2 告警策略配置
使用Prometheus+Alertmanager实现:
yaml复制groups:
- name: host-alert
rules:
- alert: HighCPUUsage
expr: 100 - (avg by(instance)(irate(node_cpu_seconds_total{mode="idle"}[5m])) * 100) > 80
for: 5m
labels:
severity: warning
annotations:
summary: "High CPU usage on {{ $labels.instance }}"
description: "CPU usage is {{ $value }}%"
11. 备份与灾备方案
11.1 数据备份策略
-
MySQL备份
bash复制# 每日全量备份 mysqldump -uroot -pAa123456. --single-transaction --routines --triggers ry-zzyl > /backup/mysql/ry-zzyl_$(date +%F).sql # 备份保留策略 find /backup/mysql/ -type f -mtime +7 -delete -
Redis备份
bash复制# 定时执行BGSAVE echo "BGSAVE" | redis-cli -a Redis@123 -
OSS重要文件
- 启用版本控制
- 配置跨区域复制
11.2 容灾演练方案
- 定期模拟节点故障(如关闭node1)
- 验证服务降级能力
- 测试备份恢复流程
12. 性能优化实践
12.1 数据库优化
- 添加合适的索引
sql复制ALTER TABLE elderly_info ADD INDEX idx_name_room (name, room_number); - 优化慢查询
sql复制EXPLAIN SELECT * FROM service_records WHERE create_time > '2024-01-01';
12.2 JVM调优
后端服务启动参数调整:
bash复制java -jar -Xms2g -Xmx2g -XX:+UseG1GC -XX:MaxGCPauseMillis=200 zzyl-admin.jar
12.3 前端加载优化
- 启用HTTP/2
- 实现资源预加载
- 使用CDN加速静态资源
13. 安全加固措施
13.1 基础安全配置
- 禁用root远程登录
- 配置SSH密钥认证
- 定期更新系统补丁
13.2 服务层安全
-
MySQL:
sql复制ALTER USER 'root'@'localhost' IDENTIFIED BY 'NewStrongPassword!'; REVOKE ALL PRIVILEGES ON *.* FROM 'root'@'%'; -
Redis:
bash复制# 禁用危险命令 rename-command FLUSHALL "" rename-command CONFIG "" -
Nginx:
nginx复制# 隐藏版本信息 server_tokens off;
14. 日常运维操作
14.1 服务启停流程
标准化操作步骤:
-
后端服务
bash复制# 启动 screen -S backend -d -m java -jar zzyl-admin.jar # 停止 screen -X -S backend quit -
数据库服务
bash复制
systemctl start mysqld systemctl stop mysqld
14.2 日志分析技巧
关键日志路径:
- Nginx访问日志:
/var/log/nginx/access.log - Java应用日志:
/opt/zzyl/backend/logs/application.log - MySQL慢查询日志:
/var/log/mysql/mysql-slow.log
常用分析命令:
bash复制# 统计HTTP状态码
awk '{print $9}' access.log | sort | uniq -c
# 查找接口响应时间TOP10
awk '{print $7,$NF}' access.log | sort -k2 -nr | head -10
15. 扩展与升级方案
15.1 水平扩展策略
当系统负载增加时,可以考虑:
-
数据库扩展
- 主从复制
- 分库分表
-
应用层扩展
- 后端服务多实例部署
- 使用Nginx负载均衡
-
缓存层扩展
- Redis集群
- 本地缓存+分布式缓存多级架构
15.2 版本升级流程
- 测试环境验证
- 备份生产环境
- 分批次灰度发布
- 监控关键指标
- 回滚预案准备
16. 项目部署心得
在实际部署过程中,有几个关键点特别值得注意:
-
资源配置评估:初期我们低估了Redis的内存需求,导致频繁触发内存淘汰。后来通过分析业务数据特点,调整了淘汰策略并扩容了内存。
-
网络拓扑规划:三台服务器之间的内网通信延迟对系统性能影响很大。我们通过将服务器部署在同一个可用区,并使用内网专线连接,将平均延迟从3ms降低到了0.5ms。
-
第三方服务隔离:百度千帆API的调用频率限制曾导致服务不可用。我们通过引入本地缓存和请求队列,有效缓解了这个问题。
-
监控全覆盖:初期只监控了服务器基础指标,后来补充了业务指标监控(如每日新增老人数、服务记录数等),能更及时发现业务异常。
对于类似项目的部署,我的建议是:
- 预留至少30%的资源余量
- 详细记录每个配置项的修改原因
- 建立完整的部署文档和回滚方案
- 在测试环境充分模拟生产环境配置