手动基于三台服务器搭建 MySQL+PHP8.x+Redis 负载均衡集群

一、架构设计

  1. 角色分配

    • 主节点(Server A):运行 Nginx 负载均衡器、MySQL 主库、Redis 主实例、PHP-FPM。

    • 次节点(Server B/C):运行 MySQL 从库、Redis 从实例、PHP-FPM,通过 Nginx 分发请求。

    • 共享存储(可选):用于存放 PHP 代码和静态文件(如 NFS 或云存储),确保多节点数据一致性。

  2. 网络拓扑

    • 主节点 Nginx 接收外部请求,按策略分发到次节点。

    • MySQL 主从复制实现数据同步,Redis 主从复制缓存同步。

    • PHP 会话(Session)存储于 Redis,确保多节点会话共享。


二、具体配置步骤

1. MySQL主从复制配置

  • 主节点(Server A)

    # /etc/mysql/my.cnf
    [mysqld]
    server-id = 1
    log-bin = mysql-bin
    binlog-format = ROW
    CREATE USER 'repl'@'%' IDENTIFIED BY 'password';
    GRANT REPLICATION SLAVE ON *.* TO 'repl'@'%';
    FLUSH PRIVILEGES;
    SHOW MASTER STATUS;  # 记录File和Position
  • 次节点(Server B/C)

    # /etc/mysql/my.cnf
    [mysqld]
    server-id = 2  # Server B为2,Server C为3
    relay-log = relay-bin
    CHANGE MASTER TO
      MASTER_HOST='Server_A_IP',
      MASTER_USER='repl',
      MASTER_PASSWORD='password',
      MASTER_LOG_FILE='mysql-bin.000001',
      MASTER_LOG_POS=1234;
    START SLAVE;
    SHOW SLAVE STATUS\G;  # 验证Slave_IO_Running和Slave_SQL_Running为Yes

    注意:从库建议设为read-only=1避免误写。


2. Redis主从复制配置

  • 主节点(Server A)

    # /etc/redis/redis.conf
    bind 0.0.0.0
    protected-mode no
    requirepass yourpassword
    systemctl restart redis
  • 次节点(Server B/C)

    # /etc/redis/redis.conf
    replicaof Server_A_IP 6379
    masterauth yourpassword
    systemctl restart redis

    验证:在主节点执行INFO replication查看从库连接状态。


3. PHP-FPM配置(所有节点)

# /etc/php/8.x/fpm/pool.d/ www.conf
pm = dynamic
pm.max_children = 50
pm.start_servers = 10
listen = /var/run/php/php8.x-fpm.sock

将会话存储至 Redis(php.ini):

session.save_handler = redis
session.save_path = "tcp://Server_A_IP:6379?auth=yourpassword"

重启 PHP-FPM:systemctl restart php8.x-fpm


4. Nginx负载均衡配置(主节点)

# /etc/nginx/nginx.conf
http {
    upstream backend {
        least_conn;  # 最少连接算法
        server Server_B_IP weight=2;  # 权重根据性能调整
        server Server_C_IP weight=1;
    }

    server {
        listen 80;
        location / {
            proxy_pass http://backend;
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
        }

        location ~ \.php$ {
            proxy_pass http://backend;
            fastcgi_pass unix:/var/run/php/php8.x-fpm.sock;
            include fastcgi_params;
        }
    }
}

关键优化

  • 启用keepalive减少连接开销。

  • 配置健康检查(Nginx Plus 或第三方模块)。


5. 安全与监控

  • 防火墙:开放端口(80、3306、6379、9000)并限制内网访问。

  • 监控工具

    • Prometheus + Grafana 监控服务器指标。

    • MySQL 监控:pt-heartbeat检测复制延迟。

    • Redis 监控:redis-cli --latency


三、故障处理与扩展

  1. MySQL 主从故障

    • 主库宕机时手动提升从库为主(STOP SLAVE; RESET MASTER;)。

    • 使用 MyCAT 实现自动故障转移(需额外配置)。

  2. Redis 高可用

    • 部署 Redis Sentinel 或 Cluster 模式替代主从。

  3. 横向扩展

    • 新增次节点时,只需同步 MySQL/Redis 配置并加入 Nginx upstream。


四、性能优化建议

  • MySQL

    • 主库启用binlog_group_commit_sync_delay减少磁盘 I/O。

    • 从库启用slave_parallel_workers加速复制。

  • Redis

    • 主节点开启 AOF 持久化(appendonly yes)。

    • 次节点配置replica-serve-stale-data yes避免缓存穿透。

  • Nginx

    • 启用 Gzip 压缩和静态文件缓存。


上面可以快速实现三台服务器的高可用负载均衡集群,适用于高并发场景。如需更自动化管理,可结合 Kubernetes 或 Docker Swarm 编排容器化服务。


手动基于三台服务器搭建 MySQL+PHP8.x+Redis 负载均衡集群
https://uniomo.com/archives/shou-dong-ji-yu-san-tai-fu-wu-qi-da-jian-mysql-php8.x-redis-fu-zai-jun-heng-ji-qun
作者
雨落秋垣
发布于
2025年12月11日
许可协议