网络拓扑图
本文档展示 SurveyKing Pro 问卷调研系统的网络架构和组件部署拓扑图,帮助理解系统的网络结构和数据流向。
🏗️ 系统架构概览
SurveyKing Pro 采用单体模块化架构,支持多种部署方式:
🎯 核心特性
- ✅ 单体模块化:便于部署和维护,支持水平扩展
- ✅ 无状态应用:状态存储在 Redis,支持负载均衡
- ✅ 多部署模式:单机部署、集群部署、容器化部署
- ✅ 高可用设计:支持 Nginx 负载均衡,MySQL 主从复制
- ✅ 安全可靠:HTTPS 加密,防火墙保护,数据备份
🔧 技术栈
- 前端代理: Nginx
- 应用服务: Spring Boot 3.x
- 数据库: MySQL 8.0
- 缓存/消息队列: Redis
- 文件存储: 支持本地存储、S3 协议存储
- 容器化: Docker、Kubernetes
🎨 部署架构图
基于 SurveyKing Pro 的技术特点,提供以下三种主要的部署架构:
🏠 单机部署架构
适用于小规模用户、开发测试环境或初期部署。
🏢 集群部署架构
适用于生产环境,支持高可用和负载均衡。
🐳 容器化部署架构
适用于云原生环境,支持 Docker 和 Kubernetes。
🎯 架构对比分析
部署方式对比
特性 | 单机部署 | 集群部署 | 容器化部署 |
---|---|---|---|
复杂度 | 简单 | 中等 | 复杂 |
成本 | 低 | 中等 | 高 |
可用性 | 一般 | 高 | 很高 |
扩展性 | 有限 | 良好 | 优秀 |
维护难度 | 低 | 中等 | 高 |
适用场景 | 小规模、测试 | 生产环境 | 大规模、云原生 |
资源配置建议
单机部署
- CPU: 4 核心以上
- 内存: 8GB 以上
- 存储: 100GB 以上 SSD
- 网络: 10Mbps 以上
集群部署
- Nginx 服务器: 2 核心、4GB 内存
- 应用服务器: 4 核心、8GB 内存(每台)
- 数据库服务器: 8 核心、16GB 内存
- 存储: 500GB 以上 SSD
容器化部署
- Kubernetes 节点: 8 核心、16GB 内存(每个节点)
- 存储: 分布式存储,1TB 以上
- 网络: 高速网络,支持容器网络
🎯 生产环境推荐架构
基于 SurveyKing Pro 的实际部署需求,以下是推荐的生产环境架构:
🏭 标准生产环境架构
🔌 网络端口和协议说明
连接 | 协议 | 端口 | 说明 |
---|---|---|---|
用户 → CDN | HTTPS | 443 | 用户通过域名 HTTPS 访问 |
CDN → WAF | HTTPS | 443 | CDN 回源到 WAF |
WAF → 负载均衡器 | HTTPS | 443 | WAF 转发到负载均衡器 |
负载均衡器 → Nginx | HTTPS | 443 | 负载均衡到 Nginx 服务器 |
Nginx → 应用服务器 | HTTP | 48080 | 反向代理到应用服务 |
应用服务器 → MySQL | TCP | 3306 | 数据库连接 |
应用服务器 → Redis | TCP | 6379 | 缓存和消息队列连接 |
MySQL 主库 → 从库 | TCP | 3306 | 主从复制 |
管理员 → VPN | UDP | 1194 | VPN 连接 |
VPN → 堡垒机 | SSH | 22 | 通过堡垒机管理 |
堡垒机 → 各服务器 | SSH | 22 | 服务器管理和维护 |
监控系统 → 各服务器 | HTTP | 9100 | Prometheus 监控指标收集 |
日志系统 → 各服务器 | TCP | 5044 | Logstash 日志收集 |
应用服务器 → SMTP | TCP | 25 | 邮件发送服务 |
应用服务器 → SMS | HTTPS | 443 | 短信发送服务 |
🖥️ 服务器配置详情
服务器类型 | 数量 | 规格建议 | 主要组件 | 功能说明 |
---|---|---|---|---|
负载均衡器 | 2 台 | 4 核心、8GB 内存 | SLB/F5/HAProxy | 四层负载均衡,高可用 |
Nginx 服务器 | 2 台 | 4 核心、8GB 内存 | Nginx | 七层负载均衡、静态文件服务 |
应用服务器 | 4 台 | 8 核心、16GB 内存 | Spring Boot 应用 | 业务逻辑处理、API 服务 |
MySQL 主库 | 1 台 | 16 核心、32GB 内存 | MySQL 8.0 | 数据存储,主写 |
MySQL 从库 | 2 台 | 16 核心、32GB 内存 | MySQL 8.0 | 数据读取,主从复制备份 |
Redis 集群 | 3 台 | 8 核心、16GB 内存 | Redis | 缓存、 会话存储、消息队列 |
文件存储 | 1 台 | 4 核心、8GB 内存 | NFS/S3 协议存储 | 静态文件存储、文件上传 |
监控服务器 | 1 台 | 4 核心、8GB 内存 | Prometheus/Grafana | 系统监控、指标收集和展示 |
日志服务器 | 1 台 | 8 核心、16GB 内存 | ELK Stack | 日志收集、分析和检索 |
堡垒机 | 1 台 | 2 核心、4GB 内存 | SSH 代理 | 安全访问控制、操作审计 |
🏆 架构特点
✅ 高可用性:多层冗余设计,单点故障时系统仍可提供服务
✅ 负载均衡:四层+七层负载均衡,请求分发到可用服务器
✅ 安全防护:WAF、VPN、堡垒机多层安全防护
✅ 数据安全:MySQL 主从复制,定期备份,Redis 集群
✅ 扩展性强:支持水平扩展,容器化部署
✅ 可观测性:完整的监控和日志系统
✅ 管理便利:统一的 VPN 和堡垒机管理入口
🔧 关键配置示例
Nginx 负载均衡配置
# 上游服务器配置
upstream surveyking_backend {
# 应用服务器集群
server app1.internal:48080 weight=1 max_fails=3 fail_timeout=10s;
server app2.internal:48080 weight=1 max_fails=3 fail_timeout=10s;
server app3.internal:48080 weight=1 max_fails=3 fail_timeout=10s;
server app4.internal:48080 weight=1 max_fails=3 fail_timeout=10s;
# 健康检查
keepalive 32;
keepalive_requests 1000;
keepalive_timeout 60s;
}
# 主服务器配置
server {
listen 443 ssl http2;
server_name surveyking.example.com;
# SSL 配置
ssl_certificate /etc/ssl/certs/surveyking.crt;
ssl_certificate_key /etc/ssl/private/surveyking.key;
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE;
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# 安全头
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
add_header X-Frame-Options DENY always;
add_header X-Content-Type-Options nosniff always;
add_header X-XSS-Protection "1; mode=block" always;
# 限速配置
limit_conn_zone $binary_remote_addr zone=conn_limit_per_ip:10m;
limit_req_zone $binary_remote_addr zone=req_limit_per_ip:10m rate=10r/s;
# API 代理
location /api/ {
limit_conn conn_limit_per_ip 20;
limit_req zone=req_limit_per_ip burst=20 nodelay;
proxy_pass http://surveyking_backend;
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;
proxy_buffering on;
proxy_buffer_size 4k;
proxy_buffers 8 4k;
}
# 静态文件服务
location / {
root /var/www/html;
try_files $uri $uri/ /index.html;
expires 30d;
add_header Cache-Control "public, no-transform";
}
# 文件上传
location /upload/ {
client_max_body_size 100M;
proxy_pass http://surveyking_backend;
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;
}
# 健康检查
location /health {
access_log off;
return 200 "healthy\n";
add_header Content-Type text/plain;
}
}
# HTTP 重定向到 HTTPS
server {
listen 80;
server_name surveyking.example.com;
return 301 https://$server_name$request_uri;
}
HAProxy 负载均衡配置
# /etc/haproxy/haproxy.cfg
global
daemon
maxconn 4096
user haproxy
group haproxy
log stdout local0
ssl-default-bind-ciphers ECDHE-RSA-AES128-GCM-SHA256:HIGH:!aNULL:!MD5:!RC4:!DHE
ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11
defaults
mode http
timeout connect 5000ms
timeout client 50000ms
timeout server 50000ms
option httplog
option dontlognull
option redispatch
retries 3
frontend surveyking_frontend
bind *:443 ssl crt /etc/ssl/certs/surveyking.pem
bind *:80
redirect scheme https if !{ ssl_fc }
# 限流
stick-table type ip size 100k expire 30s store http_req_rate(10s)
http-request track-sc0 src
http-request reject if { sc_http_req_rate(0) gt 20 }
default_backend surveyking_backend
backend surveyking_backend
balance roundrobin
option httpchk GET /health
http-check expect status 200
server nginx1 nginx1.internal:443 check ssl verify none
server nginx2 nginx2.internal:443 check ssl verify none backup
防火墙规则配置
#!/bin/bash
# 防火墙配置脚本
# 清除现有规则
iptables -F
iptables -X
iptables -t nat -F
iptables -t nat -X
# 默认策略
iptables -P INPUT DROP
iptables -P FORWARD DROP
iptables -P OUTPUT ACCEPT
# 允许本地回环
iptables -A INPUT -i lo -j ACCEPT
# 允许已建立的连接
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# 允许外部访问的端口
iptables -A INPUT -p tcp --dport 80 -j ACCEPT # HTTP
iptables -A INPUT -p tcp --dport 443 -j ACCEPT # HTTPS
iptables -A INPUT -p udp --dport 1194 -j ACCEPT # VPN
# 内网通信规则
INTERNAL_NETWORK="10.0.0.0/8"
iptables -A INPUT -s $INTERNAL_NETWORK -p tcp --dport 48080 -j ACCEPT # 应用服务
iptables -A INPUT -s $INTERNAL_NETWORK -p tcp --dport 3306 -j ACCEPT # MySQL
iptables -A INPUT -s $INTERNAL_NETWORK -p tcp --dport 6379 -j ACCEPT # Redis
iptables -A INPUT -s $INTERNAL_NETWORK -p tcp --dport 9100 -j ACCEPT # 监控
iptables -A INPUT -s $INTERNAL_NETWORK -p tcp --dport 5044 -j ACCEPT # 日志
# 管理访问(仅允许堡垒机)
BASTION_IP="10.0.1.100"
iptables -A INPUT -s $BASTION_IP -p tcp --dport 22 -j ACCEPT
# 防 DDoS
iptables -A INPUT -p tcp --dport 80 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -m limit --limit 25/minute --limit-burst 100 -j ACCEPT
# 保存规则
iptables-save > /etc/iptables/rules.v4
MySQL 主从复制配置
-- 主库配置 (my.cnf)
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog-format = ROW
sync_binlog = 1
innodb_flush_log_at_trx_commit = 1
-- 创建复制用户
CREATE USER 'replication'@'%' IDENTIFIED BY 'strong_password';
GRANT REPLICATION SLAVE ON *.* TO 'replication'@'%';
FLUSH PRIVILEGES;
-- 从库配置 (my.cnf)
[mysqld]
server-id = 2
relay-log = mysql-relay-bin
read-only = 1
-- 配置主从关系
CHANGE MASTER TO
MASTER_HOST='mysql-master.internal',
MASTER_USER='replication',
MASTER_PASSWORD='strong_password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=0;
START SLAVE;
Redis 集群配置
# redis.conf
port 6379
cluster-enabled yes
cluster-config-file nodes.conf
cluster-node-timeout 5000
appendonly yes
appendfsync everysec
# 创建集群
redis-cli --cluster create \
redis1.internal:6379 \
redis2.internal:6379 \
redis3.internal:6379 \
--cluster-replicas 0
数据库备份脚本
#!/bin/bash
# MySQL 全量备份脚本
# 配置变量
BACKUP_DIR="/var/backups/mysql"
MYSQL_USER="backup_user"
MYSQL_PASSWORD="backup_password"
DATE=$(date +%Y%m%d_%H%M%S)
RETENTION_DAYS=7
# 创建备份目录
mkdir -p $BACKUP_DIR
# 全量备份
mysqldump -u$MYSQL_USER -p$MYSQL_PASSWORD \
--single-transaction \
--routines \
--triggers \
--all-databases \
--master-data=2 \
--flush-logs \
--delete-master-logs \
| gzip > $BACKUP_DIR/full_backup_$DATE.sql.gz
# 增量备份二进制日志
mysql -u$MYSQL_USER -p$MYSQL_PASSWORD -e "FLUSH LOGS;"
find /var/lib/mysql -name "mysql-bin.*" -mtime -1 -exec cp {} $BACKUP_DIR/ \;
# 清理旧备份
find $BACKUP_DIR -name "full_backup_*.sql.gz" -mtime +$RETENTION_DAYS -delete
find $BACKUP_DIR -name "mysql-bin.*" -mtime +$RETENTION_DAYS -delete
# 备份完成通知
echo "MySQL backup completed at $(date)" | mail -s "MySQL Backup Report" admin@example.com
监控配置示例
# prometheus.yml
global:
scrape_interval: 15s
evaluation_interval: 15s
scrape_configs:
- job_name: 'surveyking-app'
static_configs:
- targets:
[
'app1.internal:48080',
'app2.internal:48080',
'app3.internal:48080',
'app4.internal:48080',
]
metrics_path: /actuator/prometheus
scrape_interval: 10s
- job_name: 'nginx'
static_configs:
- targets: ['nginx1.internal:9113', 'nginx2.internal:9113']
scrape_interval: 10s
- job_name: 'mysql'
static_configs:
- targets: ['mysql-master.internal:9104']
scrape_interval: 10s
- job_name: 'redis'
static_configs:
- targets:
[
'redis1.internal:9121',
'redis2.internal:9121',
'redis3.internal:9121',
]
scrape_interval: 10s
- job_name: 'node'
static_configs:
- targets:
[
'app1.internal:9100',
'app2.internal:9100',
'nginx1.internal:9100',
'mysql-master.internal:9100',
]
scrape_interval: 10s
📊 监控和维护建议
监控指标
应用层监控
- 响应时间和吞吐量
- 错误率和异常统计
- JVM 内存和 GC 情况
- 数据库连接池使用率
- Redis 连接和命中率
基础设施监控
- CPU、内存、磁盘使用率
- 网络带宽和延迟
- 数据库性能指标
- 缓存命中率
- 文件系统使用情况
业务指标监控
- 问卷创建和发布数量
- 用户访问和提交统计
- 系统在线用户数
- 数据导出频次
- 短信和邮件发送量
告警策略
# 告警规则示例
groups:
- name: surveyking-alerts
rules:
- alert: HighErrorRate
expr: rate(http_requests_total{status=~"5.."}[5m]) > 0.1
for: 5m
labels:
severity: critical
annotations:
summary: '应用错误率过高'
description: '错误率超过 10%,持续 5 分钟'
- alert: HighResponseTime
expr: histogram_quantile(0.95, rate(http_request_duration_seconds_bucket[5m])) > 1
for: 5m
labels:
severity: warning
annotations:
summary: '响应时间过长'
description: '95% 响应时间超过 1 秒'
- alert: DatabaseConnectionHigh
expr: mysql_global_status_threads_connected / mysql_global_variables_max_connections > 0.8
for: 5m
labels:
severity: warning
annotations:
summary: '数据库连接数过高'
description: '数据库连接数超过 80%'
- alert: RedisMemoryHigh
expr: redis_memory_used_bytes / redis_memory_max_bytes > 0.9
for: 5m
labels:
severity: critical
annotations:
summary: 'Redis 内存使用过高'
description: 'Redis 内存使用超过 90%'
- alert: DiskSpaceHigh
expr: (node_filesystem_avail_bytes / node_filesystem_size_bytes) < 0.1
for: 5m
labels:
severity: critical
annotations:
summary: '磁盘空间不足'
description: '磁盘可用空间低于 10%'
维护计划
日常维护
- 检查系统日志和错误信息
- 监控系统性能指标
- 检查备份任务完成情况
- 验证监控告警功能
- 检查 SSL 证书有效期
周期性维护
- 数据库性能优化和索引维护
- 清理过期日志和临时文件
- 更新系统补丁和安全更新
- 检查和更新防火墙规则
- 备份数据恢复测试
应急响应
- 建立故障响应流程
- 制定回滚和恢复计划
- 定期进行故障演练
- 维护联系人清单
- 准备应急处理手册
🔧 部署检查清单
部署前检查
硬件和网络
- 服务器规格满 足要求
- 网络带宽和延迟测试
- 负载均衡器配置完成
- 防火墙规则配置正确
- SSL 证书部署完成
软件和配置
- 操作系统和组件版本确认
- 数据库安装和配置
- 缓存服务配置
- 应用配置文件检查
- 环境变量设置正确
安全配置
- 用户权限和密码策略
- 数据传输加密配置
- 访问控制列表配置
- 日志审计配置
- 备份加密配置