高可用 WordPress 集群架构设计与实战

单台 WordPress 服务器 QPS 超过 500 就开始吃力,日访问量百万级怎么办?本教程介绍完整的高可用 WordPress 集群架构,支持水平扩展、自动故障转移、负载均衡,轻松承载千万级流量。

一、架构设计

传统单点架构:

用户 → 单台服务器(Nginx+PHP+MySQL)

高可用集群架构:

                    → 负载均衡器 1(主)
用户 → DNS/LB → 负载均衡器 2(备) → Web 服务器 1
                              ↓     → Web 服务器 2
                              ↓     → Web 服务器 N
                              → 数据库集群(主从复制)
                              → Redis 集群(会话缓存)
                              → NFS/对象存储(共享文件)

二、核心组件选型

1. 负载均衡器

  • Nginx + Keepalived(推荐,简单可靠)
  • HAProxy(功能强大)
  • LVS(性能最强,配置复杂)
  • 云服务商 LB(阿里云 SLB/腾讯云 CLB)

2. 数据库

  • MySQL 主从复制 + MHA(经典方案)
  • MySQL Group Replication(官方高可用)
  • Galera Cluster(多主集群)
  • 云数据库 RDS(省事)

3. 会话共享

  • Redis Cluster(推荐)
  • Memcached(老牌选择)
  • 数据库(不推荐,性能差)

4. 文件共享

  • NFS(简单,单点故障)
  • GlusterFS(分布式,复杂)
  • 对象存储(阿里云 OSS/腾讯云 COS,推荐)

三、部署实施

环境规划:

LB01: 192.168.1.10(Nginx+Keepalived,VIP: 192.168.1.100)
LB02: 192.168.1.11(Nginx+Keepalived,备)
Web01: 192.168.1.20(WordPress+Nginx+PHP)
Web02: 192.168.1.21(WordPress+Nginx+PHP)
DB01: 192.168.1.30(MySQL 主)
DB02: 192.168.1.31(MySQL 从)
Redis: 192.168.1.40(Redis Cluster)

四、配置 Keepalived 高可用

# 在 LB01 和 LB02 上安装
apt install keepalived -y

# LB01 配置(MASTER)
cat > /etc/keepalived/keepalived.conf << 'EOF'
variable "ROLE" {
    value = "MASTER"  # LB02 设置为 BACKUP
}

vrrp_script chk_nginx {
    script "killall -0 nginx"
    interval 2
    fall 3
    rise 1
}

vrrp_instance VI_1 {
    state MASTER  # LB02 为 BACKUP
    interface eth0
    virtual_router_id 51
    priority 100  # LB02 设置为 99
    advert_int 1
    
    authentication {
        auth_type PASS
        auth_pass your_password
    }
    
    virtual_ipaddress {
        192.168.1.100  # VIP
    }
    
    track_script {
        chk_nginx
    }
    
    notify_master "/etc/keepalived/master.sh"
    notify_backup "/etc/keepalived/backup.sh"
}
EOF

systemctl enable keepalived
systemctl start keepalived

五、Nginx 负载均衡配置

cat > /etc/nginx/conf.d/upstream.conf << 'EOF'
upstream wordpress_cluster {
    least_conn;  # 最少连接数算法
    
    server 192.168.1.20:80 weight=1 max_fails=3 fail_timeout=30s;
    server 192.168.1.21:80 weight=1 max_fails=3 fail_timeout=30s;
    
    # 会话保持(Cookie sticky)
    # hash $cookie_WP_SESSION consistent;
    
    keepalive 32;
}

server {
    listen 80;
    server_name yourdomain.com;
    
    location / {
        proxy_pass http://wordpress_cluster;
        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 5s;
        proxy_send_timeout 60s;
        proxy_read_timeout 60s;
    }
}
EOF

nginx -t
systemctl reload nginx

六、WordPress 集群配置

步骤 1:配置数据库主从复制

# 在主库 DB01 上
[mysqld]
server-id = 1
log-bin = mysql-bin
binlog_format = ROW

# 创建复制用户
CREATE USER 'repl'@'192.168.1.%' IDENTIFIED BY 'password';
GRANT REPLICATION SLAVE ON *.* TO 'repl'@'192.168.1.%';

# 在从库 DB02 上
[mysqld]
server-id = 2
read_only = 1

# 配置复制
CHANGE MASTER TO
    MASTER_HOST='192.168.1.30',
    MASTER_USER='repl',
    MASTER_PASSWORD='password',
    MASTER_LOG_FILE='mysql-bin.000001',
    MASTER_LOG_POS=1234;

START SLAVE;

步骤 2:配置 WordPress 使用 Redis 会话

# 安装 Redis 对象缓存插件
wp plugin install redis-cache --activate

# 配置 wp-config.php
define('WP_REDIS_HOST', '192.168.1.40');
define('WP_REDIS_PORT', 6379);
define('WP_REDIS_DATABASE', 0);
define('WP_REDIS_PASSWORD', 'your_redis_password');
define('WP_REDIS_PREFIX', 'yourdomain');

# 启用会话存储到 Redis
ini_set('session.save_handler', 'redis');
ini_set('session.save_path', 'tcp://192.168.1.40:6379?database=1');

步骤 3:配置文件共享

# 方案 A:使用 NFS
# Web01, Web02 挂载共享目录
mount -t nfs 192.168.1.50:/exports/wp-uploads /var/www/html/wp-content/uploads

# 方案 B:使用对象存储(推荐)
# 安装 WP Offload Media 插件
# 配置阿里云 OSS/腾讯云 COS 密钥
# 自动上传媒体文件到云端

七、数据库读写分离

# 使用 HyperDB 插件实现读写分离

# db.php 配置
$wpdb->add_callback('write', function($query){
    return 'db_cluster_write';
});

$wpdb->add_callback('read', function($query){
    return 'db_cluster_read';
});

# 配置数据库服务器
$db_servers = array(
    'write' => array(
        array('host' => '192.168.1.30', 'port' => 3306),  # 主库
    ),
    'read' => array(
        array('host' => '192.168.1.31', 'port' => 3306),  # 从库 1
        array('host' => '192.168.1.32', 'port' => 3306),  # 从库 2
    ),
);

八、监控和告警

# 安装 Prometheus Exporter
# Nginx VTS module
# MySQL Exporter
# Redis Exporter

# 配置告警规则
- alert: WebServerDown
  expr: up{job="nginx"} == 0
  for: 1m
  
- alert: DatabaseReplicationLag
  expr: mysql_slave_seconds_behind_master > 60
  for: 5m
  
- alert: LoadBalancerFailover
  expr: keepalived_state == "BACKUP"
  for: 1m

九、性能测试

# 使用 Apache Bench 测试
ab -n 10000 -c 100 https://yourdomain.com/

# 使用 wrk 测试
wrk -t12 -c400 -d30s https://yourdomain.com/

# 目标指标
# - 单 Web 服务器:QPS 1000+
# - 集群(3 台):QPS 3000+
# - 响应时间:P99 < 200ms
# - 错误率:< 0.1%

十、我踩过的坑

坑 1:会话不同步

用户在一台服务器登录,下次请求到另一台服务器发现未登录。解决:使用 Redis 统一存储会话。

坑 2:上传文件丢失

图片上传到 Web01,下次访问路由由 Web02 处理,发现图片不存在。解决:使用 NFS 或对象存储共享文件。

坑 3:���据库死锁

高并发下数据库出现死锁。解决:优化 SQL 查询,使用 Redis 缓存热点数据,数据库连接池配置合理。

坑 4:缓存穿透

大量请求同时访问不存在的数据,缓存未命中直接打到数据库。解决:布隆过滤器,缓存空值。

总结

高可用 WordPress 集群架构虽然复杂,但带来的收益是巨大的:

  • ✅ 承载千万级日访问量
  • ✅ 自动故障转移,服务不中断
  • ✅ 水平扩展,按需增加服务器
  • ✅ 读写分离,数据库性能提升
  • ✅ 会话共享,用户体验一致

对于大中型网站,这套架构是必选方案。

来源:https://mjj.728.hk/


已发布

分类

来自

标签: