Skip to main content

网络拓扑图

本文档展示 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 的实际部署需求,以下是推荐的生产环境架构:

🏭 标准生产环境架构

🔌 网络端口和协议说明

连接协议端口说明
用户 → CDNHTTPS443用户通过域名 HTTPS 访问
CDN → WAFHTTPS443CDN 回源到 WAF
WAF → 负载均衡器HTTPS443WAF 转发到负载均衡器
负载均衡器 → NginxHTTPS443负载均衡到 Nginx 服务器
Nginx → 应用服务器HTTP48080反向代理到应用服务
应用服务器 → MySQLTCP3306数据库连接
应用服务器 → RedisTCP6379缓存和消息队列连接
MySQL 主库 → 从库TCP3306主从复制
管理员 → VPNUDP1194VPN 连接
VPN → 堡垒机SSH22通过堡垒机管理
堡垒机 → 各服务器SSH22服务器管理和维护
监控系统 → 各服务器HTTP9100Prometheus 监控指标收集
日志系统 → 各服务器TCP5044Logstash 日志收集
应用服务器 → SMTPTCP25邮件发送服务
应用服务器 → SMSHTTPS443短信发送服务

🖥️ 服务器配置详情

服务器类型数量规格建议主要组件功能说明
负载均衡器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 证书部署完成

软件和配置

  • 操作系统和组件版本确认
  • 数据库安装和配置
  • 缓存服务配置
  • 应用配置文件检查
  • 环境变量设置正确

安全配置

  • 用户权限和密码策略
  • 数据传输加密配置
  • 访问控制列表配置
  • 日志审计配置
  • 备份加密配置

部署后验证

功能验证

  • 用户注册和登录功能
  • 问卷创建和发布功能
  • 数据收集和统计功能
  • 文件上传和下载功能
  • 邮件和短信发送功能

性能验证

  • 响应时间符合要求
  • 并发用户数测试
  • 数据库性能测试
  • 缓存命中率测试
  • 负载均衡效果验证

监控验证

  • 监控指标正常收集
  • 告警规则触发测试
  • 日志收集和分析
  • 备份任务正常执行
  • 健康检查接口正常

🎯 最佳实践建议

高可用设计

  1. 无单点故障:每个组件都有冗余
  2. 故障自动切换:使用健康检查和自动故障转移
  3. 数据一致性:主从复制和事务管理
  4. 服务降级:关键服务异常时的降级策略

性能优化

  1. 缓存策略:多级缓存和缓存预热
  2. 数据库优化:索引优化和查询优化
  3. CDN 加速:静态资源 CDN 分发
  4. 负载均衡:合理的负载均衡策略

安全加固

  1. 访问控制:最小权限原则
  2. 数据加密:传输和存储加密
  3. 定期审计:访问日志和操作审计
  4. 漏洞扫描:定期安全扫描和修补

运维自动化

  1. 配置管理:使用 Ansible 或 Puppet
  2. 持续集成:CI/CD 流水线
  3. 监控自动化:自动化监控和告警
  4. 备份自动化:定期备份和恢复测试

📞 技术支持

如果您在部署过程中遇到问题,可以通过以下方式获得技术支持:

  • 📧 邮箱支持support@surveyking.com
  • 💬 在线客服:访问官网在线客服
  • 📞 电话支持:400-XXX-XXXX
  • 📚 技术文档:详细的部署和配置文档

💡 提示:本文档提供了完整的网络拓扑图和配置示例,建议根据实际环境进行调整和优化。定期更新架构图,确保与实际部署保持一致。