采用高可用集群方案实现搭建好的网站稳定运行
浏览次数:86作者:千旭网络
网站建设行业
网站建设好后,部署在云服务器上,网站的稳定运行直接关第到网站在搜索引挚排名中的表现,如果服务器中途崩溃,流量会被搜索引挚处罚,最严重的结果就是网站流量给清零,这可不是站长们想要的结果,下面就详细说明通过Nginx 负载均衡 + 双机热备方案实现网站稳定运行:
方案架构图
【一、核心组件】
1. 负载均衡层
├── 阿里云 SLB (推荐)
│ ├── 公网 IP + 固定带宽
│ ├── 健康检查: 每 5 秒检测一次
│ ├── 失败阈值: 连续 3 次失败则剔除
│ └── 恢复检测: 连续 3 次成功则恢复
│
└── 自建 Nginx (备选)
├── 独立服务器/轻量服务器
└── nginx upstream 健康检查模块
2. 应用服务器层 (双节点)
├── 服务器 A (主) - 阿里云 ECS
│ ├── CPU: 4核
│ ├── 内存: 8GB
│ ├── 系统盘: 40GB
│ ├── 数据盘: 100GB
│ └── Tomcat 9 + Cms
│
└── 服务器 B (备) - 阿里云 ECS (相同配置)
└── 实时同步状态
3. 数据库层
├── 阿里云 RDS MySQL (主备版)
│ ├── 自动主从同步
│ ├── 自动故障切换
│ └── 数据一致性保证
│
└── 或自建数据库主从复制
├── 服务器 A: MySQL 主库
└── 服务器 B: MySQL 从库
4. 文件存储层
├── 阿里云 NAS (推荐)
│ ├── 双节点同时挂载
│ ├── 自动同步
│ └── 高可用保证
│
└── 或自建文件同步
├── rsync + inotify 实时同步
└── /opt/tomcat11/webapps/ROOT/
【二、工作原理】
1. 正常状态
┌────────────┐
│ SLB 接收请求 │
│ ↓ │
│ 健康检查 A: ✓ 正常 │
│ 健康检查 B: ✓ 正常 │
│ ↓ │
│ 按权重分发 (A: 100%, B: 0%) │
│ ↓ │
│ 所有流量 → 服务器 A │
└─────────────┘
2. A 故障切换
┌────────────┐
│ 服务器 A 崩溃 │
│ ↓ │
│ SLB 健康检查失败 (15秒内) │
│ ↓ │
│ 自动剔除 A │
│ ↓ │
│ 所有流量 → 服务器 B │
│ ↓ │
│ 用户无感知 (切换时间 < 1秒) │
└──────────────┘
3. A 恢复上线
┌────────────┐
│ 修复服务器 A │
│ ↓ │
│ 启动 Tomcat │
│ ↓ │
│ SLB 健康检查成功 │
│ ↓ │
│ 自动加入集群 │
│ ↓ │
│ 流量逐步切回 A │
└────────────┘
【三、详细配置步骤】
步骤1: 准备两台服务器
# 服务器 A (主)
- 区域: 华南1 (广州)
- IP: 47.xxx.xxx.101
- 安装: Tomcat 9 + Cms
- 状态: 当前运行中
# 服务器 B (备)
- 区域: 华南1 (广州) - 必须同区域!
- IP: 47.xxx.xxx.102
- 安装: 与 A 完全相同的环境
- 状态: 待部署
# 服务器 B 快速部署方法:
1. 购买与 A 相同配置的 ECS
2. 使用 A 的系统盘创建镜像
3. 用镜像创建 B (最快,配置完全一致)
4. 修改 B 的配置文件 (IP、hostname)
步骤2: 配置数据库 (选择其一)
【方案 A: 阿里云 RDS (推荐)】
1. 购买 RDS MySQL 主备版
- 规格: 2核4GB 起步
- 存储: 100GB
- 自动主从同步、自动故障切换
2. 迁移数据库
```bash
# 在服务器 A 导出
mysqldump -h127.0.0.1 -ucms -p cms > cms.sql
# 导入到 RDS
mysql -hRDS地址 -ucms -p cms < cms.sql
```
3. 修改两台服务器配置
```bash
# 服务器 A 和 B 都修改
vim /opt/tomcat11/webapps/ROOT/WEB-INF/config/cms.properties
# 修改数据库地址为 RDS 内网地址
db.pool.default.jdbcUrl=jdbc:mysql://rm-xxxxx.mysql.rds.aliyuncs.com:3306/cms
```
【方案 B: 自建数据库主从】
1. 服务器 A 配置为主库
```bash
vim /etc/my.cnf
[mysqld]
server-id=1
log-bin=mysql-bin
binlog-do-db=cms
```
2. 服务器 B 配置为从库
```bash
vim /etc/my.cnf
[mysqld]
server-id=2
relay-log=mysql-relay-bin
read_only=1
```
3. 配置主从复制
```sql
-- 在主库 A 执行
CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
FLUSH PRIVILEGES;
SHOW MASTER STATUS; -- 记录 File 和 Position
-- 在从库 B 执行
CHANGE MASTER TO
MASTER_HOST='47.xxx.xxx.101',
MASTER_USER='repl',
MASTER_PASSWORD='password',
MASTER_LOG_FILE='mysql-bin.000001',
MASTER_LOG_POS=154;
START SLAVE;
SHOW SLAVE STATUS\G -- 确认同步正常
```
步骤3: 配置文件同步 (选择其一)
【方案 A: 阿里云 NAS (推荐)】
1. 购买 NAS 文件系统
- 类型: 通用型 NAS
- 协议: NFS
2. 在两台服务器挂载
```bash
# 安装 NFS 客户端
yum install -y nfs-utils
# 挂载 NAS
mount -t nfs -o vers=3 file-system-id.region.nas.aliyuncs.com:/ /mnt/nas
# 开机自动挂载
echo "file-system-id.region.nas.aliyuncs.com:/ /mnt/nas nfs vers=3,defaults 0 0" >> /etc/fstab
```
3. 迁移 Cms 文件
```bash
# 停止 Tomcat
/opt/tomcat11/bin/shutdown.sh
# 复制到 NAS
cp -r /opt/tomcat11/webapps/ROOT /mnt/nas/cms
# 创建软链接
rm -rf /opt/tomcat11/webapps/ROOT
ln -s /mnt/nas/cms /opt/tomcat11/webapps/ROOT
# 启动 Tomcat
/opt/tomcat11/bin/startup.sh
```
【方案 B: rsync 实时同步】
1. 在服务器 B 安装 rsync
```bash
yum install -y rsync inotify-tools
```
2. 创建同步脚本 (在服务器 A)
```bash
vim /opt/sync.sh
```
```bash
#!/bin/bash
# 实时同步到服务器 B
SRC="/opt/tomcat11/webapps/ROOT/"
DEST="root@47.xxx.xxx.102:/opt/tomcat11/webapps/ROOT/"
# 排除不需要同步的目录
EXCLUDE="--exclude=work --exclude=logs --exclude=temp"
# 初始全量同步
rsync -avz $EXCLUDE $SRC $DEST
# 监控文件变化并实时同步
inotifywait -mrq --timefmt '%Y-%m-%d %H:%M:%S' --format '%T %w%f %e' \
-e modify,create,delete,attrib $SRC | while read date time file event
do
rsync -avz $EXCLUDE $SRC $DEST
echo "$date $time $file $event 已同步"
done
```
3. 配置 SSH 免密登录
```bash
ssh-keygen -t rsa
ssh-copy-id root@47.xxx.xxx.102
```
4. 启动同步服务
```bash
chmod +x /opt/sync.sh
nohup /opt/sync.sh > /var/log/sync.log 2>&1 &
```
步骤4: 配置阿里云 SLB (推荐方案)
1. 创建 SLB 实例
```
- 进入阿里云控制台
- 产品: 传统型负载均衡 CLB
- 网络类型: 公网
- 规格: 性能保障型 (slb.s2.small)
- 价格: ¥200-300/月
```
2. 添加监听器
```
监听协议: HTTPS/443
└── SSL 证书: 选择已有证书
└── 后端协议: HTTP/8080
健康检查:
├── 检查方法: HEAD
├── 检查路径: /
├── 检查间隔: 5秒
├── 响应超时: 3秒
├── 健康阈值: 3次
└── 不健康阈值: 3次
会话保持: 开启 (Cookie, 超时1800秒)
```
3. 添加后端服务器
```
服务器 A:
├── IP: 47.xxx.xxx.101
├── 端口: 8080
└── 权重: 100
服务器 B:
├── IP: 47.xxx.xxx.102
├── 端口: 8080
└── 权重: 0 (备用,平时不接收流量)
```
4. 修改域名解析
```
将域名 A 记录指向 SLB 公网 IP
www.wangzhanjianshe9.com.cn → SLB IP
```
5. 测试故障切换
```bash
# 在服务器 A 停止 Tomcat
/opt/tomcat11/bin/shutdown.sh
# 观察 SLB 日志
# 应该在 15 秒内自动切换到服务器 B
# 访问网站,应该正常
curl https://www.wangzhanjianshe9.com.cn
```
步骤5: 配置自建 Nginx (备选方案)
如果不用 SLB,可以自建 Nginx 负载均衡
1. 准备 Nginx 服务器 (轻量服务器即可)
```bash
yum install -y nginx
```
2. 配置 Nginx
```bash
vim /etc/nginx/nginx.conf
```
```nginx
upstream cms_backend {
# 服务器 A (主)
server 47.xxx.xxx.101:8080 weight=100 max_fails=3 fail_timeout=30s;
# 服务器 B (备)
server 47.xxx.xxx.102:8080 weight=0 max_fails=3 fail_timeout=30s backup;
# 健康检查 (需要 nginx-plus 或第三方模块)
# 免费方案: 使用 max_fails 被动检查
}
server {
listen 80;
listen 443 ssl http2;
server_name www.wangzhanjianshe9.com.cn;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
location / {
proxy_pass http://cms_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;
}
# 健康检查端点 (可选)
location /health {
access_log off;
return 200 "OK";
}
}
```
3. 启动 Nginx
```bash
nginx -t
systemctl start nginx
systemctl enable nginx
```
4. 主动健康检查脚本 (弥补 Nginx 被动检查的不足)
```bash
vim /opt/nginx_health_check.sh
```
```bash
#!/bin/bash
# Nginx 主动健康检查
BACKEND_A="http://47.xxx.xxx.101:8080/"
BACKEND_B="http://47.xxx.xxx.102:8080/"
NGINX_CONF="/etc/nginx/nginx.conf"
while true; do
# 检查 A 是否正常
if curl -sf -m 5 "$BACKEND_A" > /dev/null; then
# A 正常,确保权重为 100
sed -i 's/weight=0 /weight=100 /' $NGINX_CONF
sed -i 's/weight=100 backup/weight=0 backup/' $NGINX_CONF
nginx -s reload
else
# A 异常,切换到 B
sed -i 's/weight=100 /weight=0 /' $NGINX_CONF
sed -i 's/weight=0 backup/weight=100 backup/' $NGINX_CONF
nginx -s reload
# 发送报警 (可选)
echo "服务器 A 故障,已切换到 B" | mail -s "告警" admin@example.com
fi
sleep 10
done
```
```bash
chmod +x /opt/nginx_health_check.sh
nohup /opt/nginx_health_check.sh > /var/log/health_check.log 2>&1 &
```
【四、成本分析】
【方案 A: 阿里云全托管 (推荐)】
【方案 B: 自建混合 (省钱)】
【方案 C: 最小化 (仅双机)】
【五、优缺点对比】
【方案 A: 阿里云全托管】
✅ 优点:
- 自动故障切换 (< 1秒)
- 自动数据库主从同步
- 自动文件同步
- 无需手动维护
- 稳定性最高 (99.95% SLA)
❌ 缺点:
- 成本较高
【方案 B: 自建混合】
✅ 优点:
- 成本适中
- 灵活可控
- 性能足够
❌ 缺点:
- 需要配置和维护
- 数据库主从需要监控
- 文件同步可能延迟
【方案 C: 最小化】
✅ 优点:
- 成本最低
- 实现基本高可用
❌ 缺点:
- Nginx 单点故障风险
- 需要较多手动配置
- 文件同步不稳定
【六、运维管理】
1. 日常监控
```bash
# 检查集群状态
curl https://www.wangzhanjianshe9.com.cn
# 查看 SLB 日志 (阿里云控制台)
# 查看后端服务器健康状态
# 检查数据库同步
mysql -e "SHOW SLAVE STATUS\G"
# 检查文件同步
tail -f /var/log/sync.log
```
2. 故障演练
```bash
# 模拟服务器 A 故障
ssh 47.xxx.xxx.101 "/opt/tomcat11/bin/shutdown.sh"
# 观察切换时间和用户体验
# 应该在 15 秒内完成切换
# 恢复服务器 A
ssh 47.xxx.xxx.101 "/opt/tomcat11/bin/startup.sh"
```
3. 告警配置
```
阿里云监控:
├── CPU > 80%
├── 内存 > 80%
├── 磁盘 > 80%
├── Tomcat 进程消失
└── 健康检查失败
告警方式:
├── 短信
├── 电话
└── 邮件
```
4. 备份策略
```bash
# 数据库自动备份 (RDS 自带)
# 每天自动备份,保留 7 天
# 文件手动备份
tar -czf cms_backup_$(date +%Y%m%d).tar.gz \
/opt/tomcat11/webapps/ROOT/
# 上传到 OSS
ossutil cp cms_backup_*.tar.gz oss://backup-bucket/
```
【七、注意事项】
⚠️ 1. Session 共享问题
Cms 后台登录 session 需要共享
解决方案:
- 方案 A: 使用 Redis 共享 session
- 方案 B: SLB 开启会话保持 (推荐)
- 方案 C: 后台单独域名,不负载均衡
⚠️ 2. 缓存同步问题
Cms 内部缓存可能不一致
解决方案:
- 发布内容后,清除两台服务器的缓存
- 或使用集中式缓存 (Redis)
⚠️ 3. 定时任务问题
两台服务器可能重复执行定时任务
解决方案:
- 只在主服务器启用定时任务
- 或使用分布式任务调度
⚠️ 4. IP 白名单问题
如果 Cms 有 IP 限制,需要添加两台服务器 IP
⚠️ 5. 带宽成本
双机会增加数据库同步、文件同步的带宽消耗
建议使用内网同步
⚠️ 6. 安全组配置
确保两台服务器之间网络互通:
- 服务器 A 安全组允许 B 的 IP
- 服务器 B 安全组允许 A 的 IP
- 端口: 3306(MySQL), 8080(Tomcat), 22(SSH)
【八、升级建议】
阶段 1: 基础高可用 (当前)
└── 双机热备 + 手动切换
成本: ¥600/月
阶段 2: 自动切换
└── 双机热备 + Nginx 自动切换
成本: ¥750/月
阶段 3: 数据库托管
└── 双机热备 + 自动切换 + RDS
成本: ¥1,350/月
阶段 4: 全托管 (推荐)
└── 双机热备 + SLB + RDS + NAS
成本: ¥1,585/月
稳定性: ⭐⭐⭐⭐⭐
【九、快速部署检查清单】
□ 1. 服务器准备
□ 购买服务器 B
□ 使用镜像克隆服务器 A
□ 修改 B 的主机名和配置
□ 2. 数据库配置
□ 购买 RDS 或配置主从
□ 迁移数据库
□ 修改连接字符串
□ 3. 文件同步
□ 购买 NAS 或配置 rsync
□ 测试文件同步
□ 4. 负载均衡
□ 购买 SLB 或配置 Nginx
□ 配置健康检查
□ 添加后端服务器
□ 5. DNS 配置
□ 修改域名解析到 SLB
□ 测试访问
□ 6. 测试验证
□ 正常访问测试
□ 故障切换测试
□ 恢复测试
□ 后台登录测试
□ 7. 监控告警
□ 配置阿里云监控
□ 设置告警规则
□ 测试告警通知
【十、技术支持】
阿里云文档:
- SLB: https://help.aliyun.com/product/27537.html
- RDS: https://help.aliyun.com/product/26090.html
- NAS: https://help.aliyun.com/product/27516.html
常见问题:
Q: 切换会影响用户吗?
A: 用户无感知,最多 1-2 个请求失败后自动重试
Q: 服务器 B 平时闲置浪费吗?
A: 可以将 B 用于测试环境,或处理低优先级任务
Q: 成本能再降低吗?
A: 可以购买包年服务器,优惠约 30%
Q: 必须同区域吗?
A: SLB 必须同区域,跨区域延迟大且成本高
【最后更新】2026-04-01
【方案版本】v1.0
【适用场景】Cms 生产环境高可用部署