温馨提示×

Linux LNMP如何实现高可用架构

小樊
36
2025-12-08 03:11:39
栏目: 智能运维

架构总览与分层设计

  • 入口层:使用Nginx/HAProxy做反向代理与负载均衡,对外暴露VIP或域名;在入口前可叠加LVS+Keepalived实现四层高可用与跨节点漂移。
  • Web层:多台 Nginx + PHP-FPM 实例组成集群,横向扩展,统一由上游负载均衡分发。
  • 数据层:MySQL 采用主从复制实现读写分离与故障切换;对一致性要求更高可考虑 Group Replication/Galera Cluster;自动故障转移可用 MHA/Orchestrator
  • 文件层:用户上传与静态资源使用 GlusterFS/Ceph 等共享存储或对象存储;静态资源接入 CDN 降低源站压力。
  • 监控与告警:部署 Prometheus + Grafana,辅以 Zabbix/Nagios;日志集中与可视化用于快速排障。
  • 自动化与备份:用 Ansible 做配置与发布;定期全量与增量备份,确保可快速恢复。

入口与负载均衡高可用

  • Nginx 作为七层负载均衡示例:定义 upstream 池、设置策略与健康检查、开启连接复用,并在异常时自动故障转移。
  • 关键要点:
    • 负载均衡策略可选:轮询、加权轮询、最少连接、IP 哈希 等。
    • 故障转移与健康检查:使用 max_fails/fail_timeout、主动探测与“切换/恢复”阈值;必要时采用 backup 节点。
    • 连接复用:配置 keepalive 减少握手开销。
    • 重试策略:开启 proxy_next_upstream 控制失败重试与超时。
  • 示例配置片段:
    • Nginx 负载均衡与故障转移
      http {
        upstream backend {
          server 10.0.1.11:80 max_fails=3 fail_timeout=30s;
          server 10.0.1.12:80 max_fails=3 fail_timeout=30s;
          server 10.0.1.13:80 backup;
          keepalive 32;
        }
      
        server {
          listen 80;
          location / {
            proxy_pass http://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_next_upstream on;
            proxy_next_upstream_tries 3;
            proxy_next_upstream_timeout 5s;
          }
        }
      }
      
    • 如需四层与更稳的 VIP 漂移,可在前端部署 LVS+Keepalived;或在两台入口 Nginx 上用 Keepalived 提供 VRRP VIP,主备自动切换。

数据库高可用与读写分离

  • 主从复制(入门与通用):
    • 主库开启 server-idlog_bin,创建复制账号并授予 REPLICATION SLAVE;从库设置 server-id/relay_log,通过 CHANGE MASTER TO …; START SLAVE; 建立复制;用 SHOW SLAVE STATUS\G 检查同步状态。
  • 读写分离与中间件:应用侧或中间件(如 MyCAT)将写发往主库、读发往从库,提升吞吐与可用性。
  • 更高可用与自动故障转移:对一致性与可用性要求更高时,采用 MySQL Group Replication/Galera Cluster;自动切换可用 MHA/Orchestrator
  • 示例要点(主从):
    • 主库配置
      [mysqld]
      server-id=1
      log-bin=mysql-bin
      binlog_format=ROW
      
    • 从库配置与建立复制
      [mysqld]
      server-id=2
      relay-log=mysql-relay-bin
      
      CHANGE MASTER TO
        MASTER_HOST='master_ip',
        MASTER_USER='repl',
        MASTER_PASSWORD='pwd',
        MASTER_LOG_FILE='mysql-bin.000001',
        MASTER_LOG_POS=154;
      START SLAVE;
      
    • 读写分离可结合中间件或应用路由策略落地。

Web 层与共享存储

  • PHP-FPM 多实例与横向扩展:
    • 多台 Web 节点各自运行 PHP-FPM,Nginx 通过 unix socket 或 TCP 转发 .php 请求;按并发调优 pm.max_children/start_servers/min_spare_servers/max_spare_servers
    • 示例(Nginx + PHP-FPM,Unix Socket):
      location ~ \.php$ {
        include fastcgi_params;
        fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
        fastcgi_pass unix:/run/php/php7.4-fpm.sock;
      }
      
  • 会话与一致性:无状态优先;如需会话保持可用 IP 哈希 或外置 Redis 集中会话。
  • 文件与静态资源:
    • 用户上传目录与静态资源使用 GlusterFS/Ceph 等共享存储,避免单点;
    • 静态资源接入 CDN,源站开启 HTTPS 与缓存策略。

监控、自动化与演练

  • 监控与告警:
    • 系统与应用指标用 Prometheus 采集、Grafana 可视化;可用性、延迟、错误率与复制延迟设阈值告警;
    • 也可用 Zabbix/Nagios 做主机与服务级监控。
  • 自动化与配置管理:
    • Ansible 批量部署 Nginx/PHP-FPM/MySQL、推送配置与证书,降低人为失误;
  • 备份与恢复:
    • 定期全量/增量备份(如 mysqldump 或物理备份),定期校验与演练恢复流程;
  • 安全与测试:
    • 全链路 TLS、最小权限、防火墙与 WAF;
    • 定期故障演练(停库、断网、宕机、节点剔除)验证切换时效与数据一致性。

0