活动公告

系统通知
06-22 18:10
系统通知
06-14 00:00
系统通知
通知:本站资源由网友上传分享,如有违规等问题请到版务模块进行投诉,资源失效请在帖子内回复要求补档,会尽快处理!
10-23 09:31

CentOS服务器负载均衡配置全指南 提升网站性能与可靠性的关键步骤 从基础设置到高级优化 实现高可用服务架构

SunJu_FaceMall

3万

主题

3148

科技点

3万

积分

执行版主

碾压王

积分
32876

塔罗立华奏

执行版主 发表于 2025-9-9 00:50:16 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

x
1. 负载均衡概述

负载均衡是现代网络架构中不可或缺的组件,它能够将传入的网络流量分配到多个服务器上,从而优化资源使用、最大化吞吐量、最小化响应时间,并避免任何单一资源过载。在CentOS服务器环境中配置负载均衡,可以显著提升网站性能与可靠性,是实现高可用服务架构的关键步骤。

1.1 负载均衡的基本原理

负载均衡的基本原理是将客户端请求分发到后端的多个服务器上,使得没有任何单一服务器承受过多的请求。这种分发可以基于多种算法,如轮询、最少连接、IP哈希等。通过这种方式,负载均衡器可以确保所有服务器资源得到充分利用,同时提供冗余,防止单点故障。

1.2 负载均衡的主要优势

• 提高性能:通过分散请求负载,避免服务器过载,确保快速响应
• 增强可靠性:当某台服务器故障时,负载均衡器可以将流量重定向到其他健康的服务器
• 可扩展性:可以轻松添加或移除服务器以适应流量变化
• 维护便利:可以在不中断服务的情况下对服务器进行维护或升级

1.3 常见的负载均衡解决方案

在CentOS环境中,有多种负载均衡解决方案可供选择:

• Nginx:高性能的Web服务器和反向代理,支持负载均衡
• HAProxy:专注于负载均衡和高可用性的开源软件
• LVS (Linux Virtual Server):内核级的负载均衡解决方案
• Keepalived:主要用于高可用性,常与LVS配合使用
• Pacemaker/Corosync:功能丰富的高可用集群管理器

2. 准备工作

在开始配置负载均衡之前,需要进行一些准备工作,确保环境满足要求。

2.1 系统要求

• 至少两台CentOS服务器(一台作为负载均衡器,其他作为后端服务器)
• 所有服务器配置固定IP地址
• 确保所有服务器可以相互通信
• 具有sudo权限的用户账户

2.2 网络拓扑规划

规划网络拓扑是配置负载均衡的重要步骤。基本的负载均衡架构通常包括:

• 负载均衡器(前端):接收客户端请求并分发到后端服务器
• 后端服务器:实际处理请求的服务器
• 共享存储(可选):如果需要会话持久性或共享数据

2.3 安装必要的软件

在负载均衡器和后端服务器上安装必要的软件:
  1. # 更新系统
  2. sudo yum update -y
  3. # 安装EPEL仓库(如果使用HAProxy或Keepalived)
  4. sudo yum install epel-release -y
  5. # 安装Nginx(如果选择Nginx作为负载均衡器)
  6. sudo yum install nginx -y
  7. # 安装HAProxy(如果选择HAProxy作为负载均衡器)
  8. sudo yum install haproxy -y
  9. # 安装Keepalived(如果需要高可用性)
  10. sudo yum install keepalived -y
复制代码

3. 基础负载均衡配置

3.1 使用Nginx配置负载均衡

Nginx是一个流行的Web服务器和反向代理,也可以作为高效的负载均衡器使用。

编辑Nginx配置文件/etc/nginx/nginx.conf:
  1. user nginx;
  2. worker_processes auto;
  3. error_log /var/log/nginx/error.log;
  4. pid /run/nginx.pid;
  5. events {
  6.     worker_connections 1024;
  7. }
  8. http {
  9.     log_format  main  '$remote_addr - $remote_user [$time_local] "$request" '
  10.                       '$status $body_bytes_sent "$http_referer" '
  11.                       '"$http_user_agent" "$http_x_forwarded_for"';
  12.     access_log  /var/log/nginx/access.log  main;
  13.     sendfile            on;
  14.     tcp_nopush          on;
  15.     tcp_nodelay         on;
  16.     keepalive_timeout   65;
  17.     types_hash_max_size 2048;
  18.     include             /etc/nginx/mime.types;
  19.     default_type        application/octet-stream;
  20.     # 定义后端服务器组
  21.     upstream backend {
  22.         server backend1.example.com weight=5;
  23.         server backend2.example.com;
  24.         server backend3.example.com;
  25.     }
  26.     server {
  27.         listen 80;
  28.         server_name loadbalancer.example.com;
  29.         location / {
  30.             proxy_pass http://backend;
  31.             proxy_set_header Host $host;
  32.             proxy_set_header X-Real-IP $remote_addr;
  33.             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  34.         }
  35.     }
  36. }
复制代码

在这个配置中:

• upstream块定义了后端服务器组
• server指令指定了后端服务器的地址
• weight参数用于控制负载分配的权重
• proxy_pass指令将请求转发到后端服务器组

Nginx支持多种负载均衡方法:

轮询(默认):每个请求按时间顺序逐一分配到不同的后端服务器
  1. upstream backend {
  2.     server backend1.example.com;
  3.     server backend2.example.com;
  4.     server backend3.example.com;
  5. }
复制代码

最少连接:请求被分配到当前连接数最少的服务器
  1. upstream backend {
  2.     least_conn;
  3.     server backend1.example.com;
  4.     server backend2.example.com;
  5.     server backend3.example.com;
  6. }
复制代码

IP哈希:基于客户端IP地址的哈希结果分配请求,确保来自同一客户端的请求始终转发到同一服务器
  1. upstream backend {
  2.     ip_hash;
  3.     server backend1.example.com;
  4.     server backend2.example.com;
  5.     server backend3.example.com;
  6. }
复制代码

加权轮询:根据服务器权重分配请求
  1. upstream backend {
  2.     server backend1.example.com weight=5;
  3.     server backend2.example.com weight=3;
  4.     server backend3.example.com weight=2;
  5. }
复制代码

Nginx可以通过被动健康检查监控后端服务器的状态:
  1. upstream backend {
  2.     server backend1.example.com max_fails=3 fail_timeout=30s;
  3.     server backend2.example.com max_fails=3 fail_timeout=30s;
  4.     server backend3.example.com max_fails=3 fail_timeout=30s;
  5. }
复制代码

在这个配置中:

• max_fails:设置在fail_timeout时间内允许的最大失败次数
• fail_timeout:服务器被标记为不可用的时间
  1. # 检查Nginx配置文件语法
  2. sudo nginx -t
  3. # 启动Nginx服务
  4. sudo systemctl start nginx
  5. # 设置Nginx开机自启
  6. sudo systemctl enable nginx
  7. # 查看Nginx状态
  8. sudo systemctl status nginx
复制代码

3.2 使用HAProxy配置负载均衡

HAProxy是另一个流行的开源负载均衡器,特别适合高可用性环境。

编辑HAProxy配置文件/etc/haproxy/haproxy.cfg:
  1. # 全局设置
  2. global
  3.     log         127.0.0.1 local2
  4.     chroot      /var/lib/haproxy
  5.     pidfile     /var/run/haproxy.pid
  6.     maxconn     4000
  7.     user        haproxy
  8.     group       haproxy
  9.     daemon
  10.     # 启用统计页面
  11.     stats socket /var/lib/haproxy/stats
  12. # 默认设置
  13. defaults
  14.     mode                    http
  15.     log                     global
  16.     option                  httplog
  17.     option                  dontlognull
  18.     option http-server-close
  19.     option forwardfor       except 127.0.0.0/8
  20.     option                  redispatch
  21.     retries                 3
  22.     timeout http-request    10s
  23.     timeout queue           1m
  24.     timeout connect         10s
  25.     timeout client          1m
  26.     timeout server          1m
  27.     timeout http-keep-alive 10s
  28.     timeout check           10s
  29.     maxconn                 3000
  30. # 前端配置,接收客户端请求
  31. frontend main
  32.     bind *:80
  33.     acl url_static       path_beg       -i /static /images /javascript /stylesheets
  34.     acl url_static       path_end       -i .jpg .gif .png .css .js
  35.     use_backend static          if url_static
  36.     default_backend             app
  37. # 静态文件后端
  38. backend static
  39.     balance     roundrobin
  40.     server      static1 192.168.1.10:80 check
  41.     server      static2 192.168.1.11:80 check
  42. # 应用后端
  43. backend app
  44.     balance     roundrobin
  45.     server      app1 192.168.1.20:80 check
  46.     server      app2 192.168.1.21:80 check
  47.     server      app3 192.168.1.22:80 check
  48. # 统计页面配置
  49. listen stats
  50.     bind *:8080
  51.     stats enable
  52.     stats uri /stats
  53.     stats refresh 30s
  54.     stats auth admin:password
  55.     stats hide-version
复制代码

在这个配置中:

• frontend部分定义了HAProxy监听的客户端连接
• backend部分定义了后端服务器组
• balance指令指定了负载均衡算法
• check参数启用对后端服务器的健康检查
• listen stats部分配置了统计页面,可以监控HAProxy状态

HAProxy支持多种负载均衡算法:

roundrobin:简单的轮询算法,每个服务器按顺序接收请求
  1. backend app
  2.     balance roundrobin
  3.     server app1 192.168.1.20:80
  4.     server app2 192.168.1.21:80
  5.     server app3 192.168.1.22:80
复制代码

leastconn:将新连接分配到当前连接数最少的服务器
  1. backend app
  2.     balance leastconn
  3.     server app1 192.168.1.20:80
  4.     server app2 192.168.1.21:80
  5.     server app3 192.168.1.22:80
复制代码

source:基于客户端源IP的哈希,确保来自同一客户端的请求始终发送到同一服务器
  1. backend app
  2.     balance source
  3.     server app1 192.168.1.20:80
  4.     server app2 192.168.1.21:80
  5.     server app3 192.168.1.22:80
复制代码

uri:基于请求URI的哈希
  1. backend app
  2.     balance uri
  3.     server app1 192.168.1.20:80
  4.     server app2 192.168.1.21:80
  5.     server app3 192.168.1.22:80
复制代码

HAProxy提供灵活的健康检查配置:
  1. backend app
  2.     balance roundrobin
  3.    
  4.     # 基本健康检查
  5.     server app1 192.168.1.20:80 check
  6.    
  7.     # 自定义健康检查间隔和超时
  8.     server app2 192.168.1.21:80 check inter 10s rise 2 fall 3
  9.    
  10.     # 自定义健康检查URI
  11.     server app3 192.168.1.22:80 check port 8080
  12.    
  13.     # 高级健康检查
  14.     option httpchk GET /health
  15.     http-check expect status 200
复制代码

在这个配置中:

• check:启用基本健康检查
• inter:设置健康检查间隔
• rise:服务器被认为健康的连续成功检查次数
• fall:服务器被认为不健康的连续失败检查次数
• option httpchk:自定义HTTP健康检查方法
• http-check expect:定义健康检查的期望响应
  1. # 检查HAProxy配置文件语法
  2. sudo haproxy -c -f /etc/haproxy/haproxy.cfg
  3. # 启动HAProxy服务
  4. sudo systemctl start haproxy
  5. # 设置HAProxy开机自启
  6. sudo systemctl enable haproxy
  7. # 查看HAProxy状态
  8. sudo systemctl status haproxy
复制代码

3.3 使用LVS配置负载均衡

Linux Virtual Server (LVS) 是一个内核级的负载均衡解决方案,提供高性能的服务器负载均衡。
  1. # 安装ipvsadm工具
  2. sudo yum install ipvsadm -y
  3. # 加载必要的内核模块
  4. sudo modprobe ip_vs
复制代码

LVS Director是接收客户端请求并将其转发到后端服务器的负载均衡器。
  1. # 创建虚拟服务
  2. sudo ipvsadm -A -t 192.168.1.100:80 -s rr
  3. # 添加真实服务器
  4. sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.20:80 -g
  5. sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.21:80 -g
  6. sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.22:80 -g
  7. # 保存配置
  8. sudo ipvsadm-save > /etc/sysconfig/ipvsadm
复制代码

在这个配置中:

• -A:添加虚拟服务
• -t:指定TCP虚拟服务
• -s:指定调度算法(rr表示轮询)
• -a:添加真实服务器到虚拟服务
• -r:指定真实服务器
• -g:使用直接路由(DR)模式

LVS支持多种调度算法:

轮询调度(rr):按顺序将请求分配给每个真实服务器
  1. sudo ipvsadm -A -t 192.168.1.100:80 -s rr
复制代码

加权轮询(wrr):根据服务器权重分配请求
  1. sudo ipvsadm -A -t 192.168.1.100:80 -s wrr
  2. sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.20:80 -g -w 3
  3. sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.21:80 -g -w 2
  4. sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.22:80 -g -w 1
复制代码

最少连接(lc):将新请求分配到当前连接数最少的服务器
  1. sudo ipvsadm -A -t 192.168.1.100:80 -s lc
复制代码

加权最少连接(wlc):考虑服务器权重的最少连接调度
  1. sudo ipvsadm -A -t 192.168.1.100:80 -s wlc
复制代码

基于位置的调度(lblc):将来自同一客户端IP的请求分配到同一服务器
  1. sudo ipvsadm -A -t 192.168.1.100:80 -s lblc
复制代码

LVS支持三种工作模式:

直接路由(DR):性能最高,但要求Director和Real Server在同一网络段
  1. sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.20:80 -g
复制代码

NAT模式:Director修改请求和响应数据包的目标和源地址
  1. sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.20:80 -m
复制代码

隧道模式:通过IP隧道将请求转发到Real Server
  1. sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.20:80 -i
复制代码

在LVS的DR模式下,需要在Real Server上进行一些配置:
  1. # 在Real Server上配置虚拟IP
  2. sudo ip addr add 192.168.1.100/32 dev lo
  3. # 禁用ARP响应
  4. echo "1" | sudo tee /proc/sys/net/ipv4/conf/all/arp_ignore
  5. echo "2" | sudo tee /proc/sys/net/ipv4/conf/all/arp_announce
  6. echo "1" | sudo tee /proc/sys/net/ipv4/conf/lo/arp_ignore
  7. echo "2" | sudo tee /proc/sys/net/ipv4/conf/lo/arp_announce
复制代码
  1. # 启动ipvsadm服务
  2. sudo systemctl start ipvsadm
  3. # 设置ipvsadm开机自启
  4. sudo systemctl enable ipvsadm
  5. # 查看LVS状态
  6. sudo ipvsadm -L -n
  7. # 清除LVS配置
  8. sudo ipvsadm -C
复制代码

4. 高级负载均衡策略

4.1 会话持久性

会话持久性确保来自同一用户的请求始终被发送到同一服务器,这对于需要维护用户状态的应用程序非常重要。

Nginx提供了几种实现会话持久性的方法:

IP哈希方法:
  1. upstream backend {
  2.     ip_hash;
  3.     server backend1.example.com;
  4.     server backend2.example.com;
  5.     server backend3.example.com;
  6. }
复制代码

Cookie方法:
  1. upstream backend {
  2.     server backend1.example.com;
  3.     server backend2.example.com;
  4.     server backend3.example.com;
  5.    
  6.     sticky cookie srv_id expires=1h domain=.example.com path=/;
  7. }
复制代码

基于路由的方法:
  1. upstream backend {
  2.     server backend1.example.com route=a;
  3.     server backend2.example.com route=b;
  4.     server backend3.example.com route=c;
  5.    
  6.     sticky route $route_cookie $route_uri;
  7. }
复制代码

HAProxy也提供了多种会话持久性方法:

基于源IP的持久性:
  1. backend app
  2.     balance source
  3.     server app1 192.168.1.20:80
  4.     server app2 192.168.1.21:80
  5.     server app3 192.168.1.22:80
复制代码

基于Cookie的持久性:
  1. backend app
  2.     balance roundrobin
  3.     cookie SERVERID insert indirect nocache
  4.     server app1 192.168.1.20:80 cookie app1
  5.     server app2 192.168.1.21:80 cookie app2
  6.     server app3 192.168.1.22:80 cookie app3
复制代码

基于应用程序的持久性:
  1. backend app
  2.     balance roundrobin
  3.     appsession JSESSIONID len 64 timeout 3h request-learn
  4.     server app1 192.168.1.20:80
  5.     server app2 192.168.1.21:80
  6.     server app3 192.168.1.22:80
复制代码

LVS提供了持久性服务模板来实现会话持久性:
  1. # 创建持久性服务模板
  2. sudo ipvsadm -A -t 192.168.1.100:80 -s rr -p 300
  3. # 添加真实服务器
  4. sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.20:80 -g
  5. sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.21:80 -g
  6. sudo ipvsadm -a -t 192.168.1.100:80 -r 192.168.1.22:80 -g
复制代码

在这个配置中,-p 300设置持久性超时时间为300秒。

4.2 SSL/TLS终止

SSL/TLS终止是在负载均衡器上解密HTTPS流量,然后将未加密的HTTP流量转发到后端服务器。这可以减轻后端服务器的加密/解密负担。
  1. http {
  2.     # SSL配置
  3.     ssl_certificate /etc/nginx/ssl/example.com.crt;
  4.     ssl_certificate_key /etc/nginx/ssl/example.com.key;
  5.     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  6.     ssl_ciphers HIGH:!aNULL:!MD5;
  7.     ssl_prefer_server_ciphers on;
  8.     upstream backend {
  9.         server backend1.example.com;
  10.         server backend2.example.com;
  11.         server backend3.example.com;
  12.     }
  13.     server {
  14.         listen 80;
  15.         server_name example.com;
  16.         return 301 https://$host$request_uri;
  17.     }
  18.     server {
  19.         listen 443 ssl;
  20.         server_name example.com;
  21.         location / {
  22.             proxy_pass http://backend;
  23.             proxy_set_header Host $host;
  24.             proxy_set_header X-Real-IP $remote_addr;
  25.             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  26.             proxy_set_header X-Forwarded-Proto $scheme;
  27.         }
  28.     }
  29. }
复制代码
  1. frontend main
  2.     bind *:80
  3.     bind *:443 ssl crt /etc/ssl/certs/example.com.pem
  4.    
  5.     # 重定向HTTP到HTTPS
  6.     redirect scheme https if !{ ssl_fc }
  7.    
  8.     default_backend app
  9. backend app
  10.     balance roundrobin
  11.     server app1 192.168.1.20:80 check
  12.     server app2 192.168.1.21:80 check
  13.     server app3 192.168.1.22:80 check
复制代码

如果你没有SSL证书,可以使用Let’s Encrypt免费获取:
  1. # 安装Certbot
  2. sudo yum install certbot -y
  3. # 获取证书
  4. sudo certbot certonly --standalone -d example.com -d www.example.com
  5. # 配置证书路径
  6. # Nginx:
  7. ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
  8. ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
  9. # HAProxy:
  10. # 需要将证书和私钥合并为一个PEM文件
  11. cat /etc/letsencrypt/live/example.com/fullchain.pem /etc/letsencrypt/live/example.com/privkey.pem > /etc/ssl/certs/example.com.pem
复制代码

4.3 内容缓存

内容缓存可以显著提高网站性能,减少后端服务器的负载。
  1. http {
  2.     # 设置缓存路径和参数
  3.     proxy_cache_path /var/cache/nginx levels=1:2 keys_zone=my_cache:10m max_size=10g inactive=60m use_temp_path=off;
  4.     server {
  5.         listen 80;
  6.         server_name example.com;
  7.         # 启用缓存
  8.         proxy_cache my_cache;
  9.         proxy_cache_valid 200 302 10m;
  10.         proxy_cache_valid 404 1m;
  11.         proxy_cache_key "$scheme$request_method$host$request_uri";
  12.         
  13.         # 添加缓存状态头
  14.         add_header X-Proxy-Cache $upstream_cache_status;
  15.         location / {
  16.             proxy_pass http://backend;
  17.             proxy_set_header Host $host;
  18.             proxy_set_header X-Real-IP $remote_addr;
  19.             proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
  20.         }
  21.     }
  22. }
复制代码

HAProxy本身不提供内容缓存功能,但可以与Varnish等缓存服务器配合使用:
  1. frontend main
  2.     bind *:80
  3.     default_backend varnish
  4. backend varnish
  5.     balance roundrobin
  6.     server varnish1 192.168.1.30:80 check
  7.     server varnish2 192.168.1.31:80 check
  8. backend app
  9.     balance roundrobin
  10.     server app1 192.168.1.20:80 check
  11.     server app2 192.168.1.21:80 check
  12.     server app3 192.168.1.22:80 check
复制代码

4.4 请求限制和速率控制

请求限制和速率控制可以防止滥用和DDoS攻击,保护后端服务器。
  1. http {
  2.     # 定义限制区域
  3.     limit_req_zone $binary_remote_addr zone=login:10m rate=10r/m;
  4.     limit_req_zone $binary_remote_addr zone=api:10m rate=100r/s;
  5.     server {
  6.         listen 80;
  7.         server_name example.com;
  8.         location /login/ {
  9.             # 应用限制
  10.             limit_req zone=login burst=20 nodelay;
  11.             proxy_pass http://backend;
  12.         }
  13.         location /api/ {
  14.             # 应用限制
  15.             limit_req zone=api burst=200 nodelay;
  16.             proxy_pass http://backend;
  17.         }
  18.     }
  19. }
复制代码
  1. frontend main
  2.     bind *:80
  3.    
  4.     # 创建ACL
  5.     acl path_login path_beg /login/
  6.     acl path_api path_beg /api/
  7.    
  8.     # 应用限制
  9.     http-request track-sc0 src
  10.     http-request deny if path_login { sc0_inc_gpc0 > 10 }
  11.     http-request deny if path_api { sc0_inc_gpc0 > 100 }
  12.    
  13.     default_backend app
复制代码

4.5 自定义负载均衡算法

在某些情况下,可能需要实现自定义的负载均衡算法,以满足特定的业务需求。

Nginx允许通过第三方模块或Lua脚本实现自定义负载均衡算法:
  1. http {
  2.     # 加载Lua模块
  3.     lua_package_path "/etc/nginx/lua/?.lua;;";
  4.     upstream backend {
  5.         server backend1.example.com;
  6.         server backend2.example.com;
  7.         server backend3.example.com;
  8.         
  9.         # 使用Lua脚本实现自定义负载均衡
  10.         balancer_by_lua_block {
  11.             local balancer = require "ngx.balancer"
  12.             
  13.             -- 自定义负载均衡逻辑
  14.             local servers = {"backend1.example.com", "backend2.example.com", "backend3.example.com"}
  15.             local selected_server = servers[math.random(1, #servers)]
  16.             
  17.             -- 设置选中的服务器
  18.             local ok, err = balancer.set_current_peer(selected_server)
  19.             if not ok then
  20.                 ngx.log(ngx.ERR, "failed to set the current peer: ", err)
  21.                 return ngx.exit(500)
  22.             end
  23.         }
  24.     }
  25. }
复制代码

HAProxy可以通过Lua脚本实现自定义负载均衡算法:
  1. global
  2.     lua-load /etc/haproxy/custom_balancer.lua
  3. backend app
  4.     balance lua
  5.     lua-load balance
  6.     server app1 192.168.1.20:80
  7.     server app2 192.168.1.21:80
  8.     server app3 192.168.1.22:80
复制代码

对应的Lua脚本custom_balancer.lua:
  1. -- custom_balancer.lua
  2. core.register_service("balance", "tcp", function(applet)
  3.     -- 获取后端服务器列表
  4.     local servers = {"app1", "app2", "app3"}
  5.    
  6.     -- 自定义负载均衡逻辑
  7.     local selected_server = servers[math.random(1, #servers)]
  8.    
  9.     -- 返回选中的服务器
  10.     applet:set_var("server", selected_server)
  11. end)
复制代码

5. 高可用性配置

高可用性是负载均衡架构的重要组成部分,确保即使负载均衡器本身出现故障,服务也不会中断。

5.1 使用Keepalived实现负载均衡器高可用

Keepalived是一个简单而强大的高可用性解决方案,通常与LVS或Nginx/HAProxy配合使用。
  1. # 安装Keepalived
  2. sudo yum install keepalived -y
  3. # 启动Keepalived服务
  4. sudo systemctl start keepalived
  5. # 设置Keepalived开机自启
  6. sudo systemctl enable keepalived
复制代码

编辑/etc/keepalived/keepalived.conf:
  1. ! Configuration File for keepalived
  2. global_defs {
  3.    notification_email {
  4.      admin@example.com
  5.    }
  6.    notification_email_from lb@example.com
  7.    smtp_server localhost
  8.    smtp_connect_timeout 30
  9.    router_id LB_PRIMARY
  10. }
  11. vrrp_script chk_nginx {
  12.     script "killall -0 nginx"
  13.     interval 2
  14.     weight -20
  15. }
  16. vrrp_instance VI_1 {
  17.     state MASTER
  18.     interface eth0
  19.     virtual_router_id 51
  20.     priority 100
  21.     advert_int 1
  22.     authentication {
  23.         auth_type PASS
  24.         auth_pass 1111
  25.     }
  26.     virtual_ipaddress {
  27.         192.168.1.100
  28.     }
  29.     track_script {
  30.         chk_nginx
  31.     }
  32.     notify_master "/etc/keepalived/scripts/master.sh"
  33.     notify_backup "/etc/keepalived/scripts/backup.sh"
  34.     notify_fault "/etc/keepalived/scripts/fault.sh"
  35. }
复制代码

在备用负载均衡器上编辑/etc/keepalived/keepalived.conf:
  1. ! Configuration File for keepalived
  2. global_defs {
  3.    notification_email {
  4.      admin@example.com
  5.    }
  6.    notification_email_from lb@example.com
  7.    smtp_server localhost
  8.    smtp_connect_timeout 30
  9.    router_id LB_BACKUP
  10. }
  11. vrrp_script chk_nginx {
  12.     script "killall -0 nginx"
  13.     interval 2
  14.     weight -20
  15. }
  16. vrrp_instance VI_1 {
  17.     state BACKUP
  18.     interface eth0
  19.     virtual_router_id 51
  20.     priority 90
  21.     advert_int 1
  22.     authentication {
  23.         auth_type PASS
  24.         auth_pass 1111
  25.     }
  26.     virtual_ipaddress {
  27.         192.168.1.100
  28.     }
  29.     track_script {
  30.         chk_nginx
  31.     }
  32.     notify_master "/etc/keepalived/scripts/master.sh"
  33.     notify_backup "/etc/keepalived/scripts/backup.sh"
  34.     notify_fault "/etc/keepalived/scripts/fault.sh"
  35. }
复制代码

创建通知脚本目录和文件:
  1. sudo mkdir -p /etc/keepalived/scripts
  2. # 创建master.sh
  3. sudo tee /etc/keepalived/scripts/master.sh > /dev/null <<EOF
  4. #!/bin/bash
  5. echo "Keepalived is now MASTER" | logger -t keepalived
  6. EOF
  7. # 创建backup.sh
  8. sudo tee /etc/keepalived/scripts/backup.sh > /dev/null <<EOF
  9. #!/bin/bash
  10. echo "Keepalived is now BACKUP" | logger -t keepalived
  11. EOF
  12. # 创建fault.sh
  13. sudo tee /etc/keepalived/scripts/fault.sh > /dev/null <<EOF
  14. #!/bin/bash
  15. echo "Keepalived is in FAULT state" | logger -t keepalived
  16. EOF
  17. # 设置脚本可执行权限
  18. sudo chmod +x /etc/keepalived/scripts/*.sh
复制代码
  1. # 启动Keepalived服务
  2. sudo systemctl start keepalived
  3. # 设置Keepalived开机自启
  4. sudo systemctl enable keepalived
  5. # 查看Keepalived状态
  6. sudo systemctl status keepalived
  7. # 查看虚拟IP
  8. ip addr show
复制代码

5.2 使用Pacemaker和Corosync实现高可用集群

Pacemaker和Corosync是一个功能强大的高可用集群管理解决方案,适合复杂的负载均衡环境。
  1. # 安装Pacemaker和Corosync
  2. sudo yum install pacemaker corosync fence-agents-all -y
  3. # 启动Pacemaker服务
  4. sudo systemctl start pacemaker
  5. # 设置Pacemaker开机自启
  6. sudo systemctl enable pacemaker
复制代码

编辑/etc/corosync/corosync.conf:
  1. totem {
  2.     version: 2
  3.     cluster_name: ha_cluster
  4.     transport: udpu
  5.     interface {
  6.         ringnumber: 0
  7.         bindnetaddr: 192.168.1.0
  8.         mcastport: 5405
  9.     }
  10. }
  11. nodelist {
  12.     node {
  13.         ring0_addr: 192.168.1.10
  14.         name: node1
  15.         nodeid: 1
  16.     }
  17.     node {
  18.         ring0_addr: 192.168.1.11
  19.         name: node2
  20.         nodeid: 2
  21.     }
  22. }
  23. quorum {
  24.     provider: corosync_votequorum
  25.     two_node: 1
  26. }
  27. logging {
  28.     to_logfile: yes
  29.     logfile: /var/log/cluster/corosync.log
  30.     to_syslog: yes
  31. }
复制代码
  1. # 启动Corosync服务
  2. sudo systemctl start corosync
  3. # 设置Corosync开机自启
  4. sudo systemctl enable corosync
  5. # 查看Corosync状态
  6. sudo corosync-cfgtool -s
  7. sudo corosync-cmapctl | grep members
复制代码

使用crm工具配置Pacemaker:
  1. # 禁用STONITH(在测试环境中)
  2. sudo crm configure property stonith-enabled=false
  3. # 配置虚拟IP资源
  4. sudo crm configure primitive vip ocf:heartbeat:IPaddr2 \
  5.     params ip=192.168.1.100 cidr_netmask=24 \
  6.     op monitor interval=30s
  7. # 配置Nginx资源
  8. sudo crm configure primitive nginx lsb:nginx \
  9.     op monitor interval=30s
  10. # 配置资源组
  11. sudo crm configure group lb-group vip nginx
  12. # 配置资源约束
  13. sudo crm configure colocation lb-group-with-vip inf: lb-group vip
  14. sudo crm configure order lb-group-after-vip mandatory: vip lb-group
  15. # 查看配置
  16. sudo crm configure show
复制代码
  1. # 查看集群状态
  2. sudo crm status
  3. # 查看资源状态
  4. sudo crm resource status
  5. # 停止资源
  6. sudo crm resource stop nginx
  7. # 启动资源
  8. sudo crm resource start nginx
  9. # 迁移资源到特定节点
  10. sudo crm resource migrate nginx node1
  11. # 清除资源迁移约束
  12. sudo crm resource unmigrate nginx
复制代码

5.3 使用Heartbeat实现高可用性

Heartbeat是另一个流行的高可用性解决方案,虽然较老但在某些环境中仍然使用。
  1. # 安装Heartbeat
  2. sudo yum install heartbeat -y
  3. # 启动Heartbeat服务
  4. sudo systemctl start heartbeat
  5. # 设置Heartbeat开机自启
  6. sudo systemctl enable heartbeat
复制代码

编辑/etc/ha.d/ha.cf:
  1. logfile /var/log/ha-log
  2. logfacility     local0
  3. keepalive 2
  4. deadtime 30
  5. warntime 10
  6. initdead 120
  7. udpport 694
  8. ucast eth0 192.168.1.11
  9. auto_failback on
  10. node    node1.example.com
  11. node    node2.example.com
  12. ping 192.168.1.1
  13. respawn hacluster /usr/lib/heartbeat/ipfail
  14. apiauth ipfail gid=haclient uid=hacluster
复制代码

编辑/etc/ha.d/authkeys:
  1. auth 1
  2. 1 sha1 YourSecretKey
复制代码

编辑/etc/ha.d/haresources:
  1. node1.example.com 192.168.1.100/24/eth0 nginx
复制代码
  1. # 设置authkeys文件权限
  2. sudo chmod 600 /etc/ha.d/authkeys
  3. # 启动Heartbeat服务
  4. sudo systemctl start heartbeat
  5. # 设置Heartbeat开机自启
  6. sudo systemctl enable heartbeat
  7. # 查看Heartbeat状态
  8. sudo systemctl status heartbeat
  9. # 查看虚拟IP
  10. ip addr show
复制代码

6. 性能监控与优化

6.1 负载均衡性能监控

监控负载均衡器的性能对于确保系统稳定运行至关重要。

Nginx提供了状态模块,可以显示Nginx的基本状态信息:
  1. http {
  2.     server {
  3.         listen 80;
  4.         server_name status.example.com;
  5.         location /nginx_status {
  6.             stub_status on;
  7.             access_log off;
  8.             allow 192.168.1.0/24;
  9.             deny all;
  10.         }
  11.     }
  12. }
复制代码

访问http://status.example.com/nginx_status将显示类似以下内容:
  1. Active connections: 291
  2. server accepts handled requests
  3. 16630948 16630948 31070465
  4. Reading: 6 Writing: 179 Waiting: 106
复制代码

HAProxy提供了详细的统计页面:
  1. listen stats
  2.     bind *:8080
  3.     stats enable
  4.     stats uri /stats
  5.     stats refresh 30s
  6.     stats auth admin:password
  7.     stats hide-version
  8.     stats admin if TRUE
复制代码

访问http://loadbalancer.example.com:8080/stats将显示HAProxy的详细统计信息。

LVS提供了基本的统计信息:
  1. # 查看LVS连接统计
  2. sudo ipvsadm -L -n --stats
  3. # 查看LVS连接率统计
  4. sudo ipvsadm -L -n --rate
  5. # 查看LVS持久连接统计
  6. sudo ipvsadm -L -n --persistent-conn
复制代码

使用系统监控工具监控负载均衡器的资源使用情况:
  1. # 安装监控工具
  2. sudo yum install sysstat htop -y
  3. # 查看CPU使用情况
  4. top
  5. htop
  6. sudo mpstat 1 5
  7. # 查看内存使用情况
  8. free -h
  9. sudo vmstat 1 5
  10. # 查看网络连接
  11. sudo netstat -anp
  12. sudo ss -anp
  13. # 查看网络流量
  14. sudo iftop -nNP
  15. sudo nload
复制代码

6.2 日志分析

日志分析是了解负载均衡器性能和问题的重要手段。
  1. http {
  2.     log_format main '$remote_addr - $remote_user [$time_local] "$request" '
  3.                     '$status $body_bytes_sent "$http_referer" '
  4.                     '"$http_user_agent" "$http_x_forwarded_for" '
  5.                     'rt=$request_time uct="$upstream_connect_time" '
  6.                     'uht="$upstream_header_time" urt="$upstream_response_time"';
  7.    
  8.     access_log /var/log/nginx/access.log main;
  9.     error_log /var/log/nginx/error.log warn;
  10. }
复制代码
  1. global
  2.     log /dev/log local0 info
  3.     log /dev/log local1 notice
  4. defaults
  5.     log global
  6.     option httplog
  7.     option dontlognull
复制代码

配置rsyslog以处理HAProxy日志:
  1. # 编辑/etc/rsyslog.d/haproxy.conf
  2. sudo tee /etc/rsyslog.d/haproxy.conf > /dev/null <<EOF
  3. $AddUnixListenSocket /var/lib/haproxy/dev/log
  4. local0.* -/var/log/haproxy/haproxy.log
  5. local1.* -/var/log/haproxy/haproxy-alert.log
  6. & ~
  7. EOF
  8. # 重启rsyslog服务
  9. sudo systemctl restart rsyslog
复制代码

使用日志分析工具处理负载均衡器日志:
  1. # 安装GoAccess
  2. sudo yum install goaccess -y
  3. # 分析Nginx访问日志
  4. sudo goaccess /var/log/nginx/access.log -c
  5. # 实时分析Nginx访问日志
  6. sudo goaccess /var/log/nginx/access.log -c --real-time-html
  7. # 分析HAProxy日志
  8. sudo goaccess /var/log/haproxy/haproxy.log -c --log-format=HAProxy
复制代码

6.3 性能优化

优化负载均衡器的配置可以显著提高性能。
  1. user nginx;
  2. worker_processes auto;  # 根据CPU核心数自动设置工作进程数
  3. worker_rlimit_nofile 100000;  # 增加文件描述符限制
  4. events {
  5.     worker_connections 4096;  # 增加每个工作进程的连接数
  6.     multi_accept on;  # 允许一个工作进程同时接受多个新连接
  7.     use epoll;  # 使用高效的epoll事件模型
  8. }
  9. http {
  10.     # 基本优化
  11.     sendfile on;
  12.     tcp_nopush on;
  13.     tcp_nodelay on;
  14.     keepalive_timeout 30;
  15.     keepalive_requests 1000;
  16.     reset_timedout_connection on;
  17.    
  18.     # 缓冲区优化
  19.     client_body_buffer_size 128k;
  20.     client_max_body_size 10m;
  21.     client_header_buffer_size 1k;
  22.     large_client_header_buffers 4 4k;
  23.     output_buffers 1 32k;
  24.     postpone_output 1460;
  25.    
  26.     # Gzip压缩
  27.     gzip on;
  28.     gzip_vary on;
  29.     gzip_proxied any;
  30.     gzip_comp_level 6;
  31.     gzip_buffers 16 8k;
  32.     gzip_http_version 1.1;
  33.     gzip_types text/plain text/css application/json application/javascript text/xml application/xml application/xml+rss text/javascript;
  34.    
  35.     # SSL优化
  36.     ssl_session_cache shared:SSL:10m;
  37.     ssl_session_timeout 10m;
  38.     ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
  39.     ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256';
  40.     ssl_prefer_server_ciphers on;
  41.     ssl_stapling on;
  42.     ssl_stapling_verify on;
  43.    
  44.     # 上游服务器优化
  45.     upstream backend {
  46.         server backend1.example.com max_fails=3 fail_timeout=30s;
  47.         server backend2.example.com max_fails=3 fail_timeout=30s;
  48.         server backend3.example.com max_fails=3 fail_timeout=30s;
  49.         keepalive 32;  # 保持与上游服务器的连接
  50.     }
  51.    
  52.     server {
  53.         listen 80;
  54.         server_name example.com;
  55.         
  56.         location / {
  57.             proxy_pass http://backend;
  58.             proxy_http_version 1.1;
  59.             proxy_set_header Connection "";
  60.             proxy_connect_timeout 5s;
  61.             proxy_send_timeout 60s;
  62.             proxy_read_timeout 60s;
  63.             proxy_buffering on;
  64.             proxy_buffer_size 4k;
  65.             proxy_buffers 8 4k;
  66.             proxy_busy_buffers_size 8k;
  67.         }
  68.     }
  69. }
复制代码
  1. global
  2.     # 基本设置
  3.     chroot /var/lib/haproxy
  4.     stats socket /var/lib/haproxy/stats level admin
  5.     maxconn 100000
  6.     user haproxy
  7.     group haproxy
  8.     daemon
  9.     nbproc 1  # 根据CPU核心数调整
  10.    
  11.     # 性能优化
  12.     tune.ssl.default-dh-param 2048
  13.     ssl-default-bind-ciphers ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
  14.     ssl-default-bind-options no-sslv3 no-tlsv10 no-tlsv11
  15.     tune.bufsize 32768
  16.     tune.maxrewrite 1024
  17.     tune.chksize 2048
  18. defaults
  19.     # 基本设置
  20.     mode http
  21.     log global
  22.     option httplog
  23.     option dontlognull
  24.     option http-server-close
  25.     option forwardfor except 127.0.0.0/8
  26.     option redispatch
  27.     retries 3
  28.    
  29.     # 超时设置
  30.     timeout http-request 10s
  31.     timeout queue 1m
  32.     timeout connect 10s
  33.     timeout client 1m
  34.     timeout server 1m
  35.     timeout http-keep-alive 10s
  36.     timeout check 10s
  37.     maxconn 30000
  38. frontend main
  39.     bind *:80
  40.     bind *:443 ssl crt /etc/ssl/certs/example.com.pem alpn h2,http/1.1
  41.     http-request track-sc0 src
  42.     http-request track-sc1 hdr_beg(User-Agent) -i bot crawler spider
  43.     default_backend app
  44. backend app
  45.     balance roundrobin
  46.     cookie SERVERID insert indirect nocache
  47.     option httpchk GET /health
  48.     http-check expect status 200
  49.     server app1 192.168.1.20:80 cookie app1 check maxconn 10000
  50.     server app2 192.168.1.21:80 cookie app2 check maxconn 10000
  51.     server app3 192.168.1.22:80 cookie app3 check maxconn 10000
复制代码
  1. # 调整内核参数以优化LVS性能
  2. echo "net.ipv4.ip_forward = 1" | sudo tee -a /etc/sysctl.conf
  3. echo "net.ipv4.conf.all.send_redirects = 0" | sudo tee -a /etc/sysctl.conf
  4. echo "net.ipv4.conf.default.send_redirects = 0" | sudo tee -a /etc/sysctl.conf
  5. echo "net.ipv4.conf.eth0.send_redirects = 0" | sudo tee -a /etc/sysctl.conf
  6. echo "net.ipv4.conf.all.arp_ignore = 1" | sudo tee -a /etc/sysctl.conf
  7. echo "net.ipv4.conf.all.arp_announce = 2" | sudo tee -a /etc/sysctl.conf
  8. echo "net.ipv4.conf.all.rp_filter = 0" | sudo tee -a /etc/sysctl.conf
  9. echo "net.ipv4.conf.default.rp_filter = 0" | sudo tee -a /etc/sysctl.conf
  10. echo "net.ipv4.conf.eth0.rp_filter = 0" | sudo tee -a /etc/sysctl.conf
  11. # 应用内核参数
  12. sudo sysctl -p
  13. # 增加连接跟踪表大小
  14. echo "net.netfilter.nf_conntrack_max = 1000000" | sudo tee -a /etc/sysctl.conf
  15. echo "net.netfilter.nf_conntrack_tcp_timeout_established = 300" | sudo tee -a /etc/sysctl.conf
  16. echo "net.netfilter.nf_conntrack_tcp_timeout_time_wait = 1" | sudo tee -a /etc/sysctl.conf
  17. echo "net.netfilter.nf_conntrack_tcp_timeout_close_wait = 10" | sudo tee -a /etc/sysctl.conf
  18. echo "net.netfilter.nf_conntrack_tcp_timeout_fin_wait = 10" | sudo tee -a /etc/sysctl.conf
  19. # 应用内核参数
  20. sudo sysctl -p
  21. # 优化LVS参数
  22. sudo ipvsadm --set 30 5 60
复制代码
  1. # 增加文件描述符限制
  2. echo "* soft nofile 100000" | sudo tee -a /etc/security/limits.conf
  3. echo "* hard nofile 100000" | sudo tee -a /etc/security/limits.conf
  4. # 调整网络参数
  5. echo "net.core.rmem_max = 16777216" | sudo tee -a /etc/sysctl.conf
  6. echo "net.core.wmem_max = 16777216" | sudo tee -a /etc/sysctl.conf
  7. echo "net.ipv4.tcp_rmem = 4096 87380 16777216" | sudo tee -a /etc/sysctl.conf
  8. echo "net.ipv4.tcp_wmem = 4096 65536 16777216" | sudo tee -a /etc/sysctl.conf
  9. echo "net.ipv4.tcp_fin_timeout = 30" | sudo tee -a /etc/sysctl.conf
  10. echo "net.ipv4.tcp_keepalive_time = 1200" | sudo tee -a /etc/sysctl.conf
  11. echo "net.ipv4.tcp_max_syn_backlog = 8192" | sudo tee -a /etc/sysctl.conf
  12. echo "net.ipv4.tcp_syncookies = 1" | sudo tee -a /etc/sysctl.conf
  13. echo "net.ipv4.tcp_tw_reuse = 1" | sudo tee -a /etc/sysctl.conf
  14. echo "net.ipv4.tcp_tw_recycle = 0" | sudo tee -a /etc/sysctl.conf
  15. echo "net.ipv4.ip_local_port_range = 1024 65535" | sudo tee -a /etc/sysctl.conf
  16. # 应用内核参数
  17. sudo sysctl -p
复制代码

7. 故障排除与维护

7.1 常见问题及解决方案

问题:Nginx/HAProxy/LVS启动失败

解决方案:
  1. # 检查配置文件语法
  2. sudo nginx -t
  3. sudo haproxy -c -f /etc/haproxy/haproxy.cfg
  4. # 检查端口占用
  5. sudo netstat -tlnp | grep :80
  6. sudo ss -tlnp | grep :80
  7. # 检查日志文件
  8. sudo tail -f /var/log/nginx/error.log
  9. sudo tail -f /var/log/haproxy/haproxy.log
  10. sudo journalctl -u nginx
  11. sudo journalctl -u haproxy
复制代码

问题:负载均衡器标记后端服务器为不可用

解决方案:
  1. # 手动测试后端服务器
  2. curl -I http://backend-server/health
  3. # 检查防火墙设置
  4. sudo iptables -L -n
  5. sudo firewall-cmd --list-all
  6. # 检查后端服务器日志
  7. sudo tail -f /var/log/nginx/access.log
  8. sudo tail -f /var/log/httpd/access_log
  9. # 检查网络连接
  10. telnet backend-server 80
  11. nc -zv backend-server 80
复制代码

问题:用户的请求被分发到不同的后端服务器

解决方案:
  1. # 检查负载均衡器配置
  2. sudo grep -A 10 -B 5 "ip_hash\|sticky\|balance source" /etc/nginx/nginx.conf
  3. sudo grep -A 10 -B 5 "cookie\|balance source\|appsession" /etc/haproxy/haproxy.cfg
  4. # 检查客户端IP是否变化
  5. echo $REMOTE_ADDR
  6. echo $HTTP_X_FORWARDED_FOR
  7. # 检查Cookie设置
  8. curl -I -b /dev/null -c /tmp/cookies http://example.com/
  9. cat /tmp/cookies
复制代码

问题:负载均衡器响应缓慢或高CPU使用率

解决方案:
  1. # 检查系统资源使用情况
  2. top
  3. htop
  4. free -h
  5. iostat 1 5
  6. # 检查网络连接数
  7. sudo netstat -an | grep :80 | wc -l
  8. sudo ss -an | grep :80 | wc -l
  9. # 检查负载均衡器状态
  10. curl http://localhost/nginx_status
  11. curl http://localhost:8080/stats
  12. # 检查日志中的错误
  13. sudo grep -i error /var/log/nginx/error.log | tail -20
  14. sudo grep -i error /var/log/haproxy/haproxy.log | tail -20
复制代码

7.2 维护任务

定期维护是确保负载均衡器稳定运行的关键。
  1. # 创建备份目录
  2. sudo mkdir -p /backup/nginx /backup/haproxy /backup/lvs
  3. # 备份Nginx配置
  4. sudo cp -r /etc/nginx/* /backup/nginx/
  5. sudo tar -czf /backup/nginx-$(date +%Y%m%d).tar.gz -C /etc nginx
  6. # 备份HAProxy配置
  7. sudo cp -r /etc/haproxy/* /backup/haproxy/
  8. sudo tar -czf /backup/haproxy-$(date +%Y%m%d).tar.gz -C /etc haproxy
  9. # 备份LVS配置
  10. sudo ipvsadm-save > /backup/lvs/ipvsadm-$(date +%Y%m%d).conf
  11. sudo crontab -l > /backup/crontab-$(date +%Y%m%d).txt
复制代码
  1. # 创建Nginx日志轮转配置
  2. sudo tee /etc/logrotate.d/nginx > /dev/null <<EOF
  3. /var/log/nginx/*.log {
  4.     daily
  5.     missingok
  6.     rotate 52
  7.     compress
  8.     delaycompress
  9.     notifempty
  10.     create 640 nginx adm
  11.     sharedscripts
  12.     postrotate
  13.         if [ -f /var/run/nginx.pid ]; then
  14.             kill -USR1 `cat /var/run/nginx.pid`
  15.         fi
  16.     endscript
  17. }
  18. EOF
  19. # 创建HAProxy日志轮转配置
  20. sudo tee /etc/logrotate.d/haproxy > /dev/null <<EOF
  21. /var/log/haproxy/*.log {
  22.     daily
  23.     missingok
  24.     rotate 52
  25.     compress
  26.     delaycompress
  27.     notifempty
  28.     create 640 haproxy adm
  29.     sharedscripts
  30.     postrotate
  31.         if [ -f /var/run/haproxy.pid ]; then
  32.             kill -USR1 `cat /var/run/haproxy.pid`
  33.         fi
  34.     endscript
  35. }
  36. EOF
  37. # 测试日志轮转
  38. sudo logrotate -f /etc/logrotate.d/nginx
  39. sudo logrotate -f /etc/logrotate.d/haproxy
复制代码

创建自动化维护脚本:
  1. # 创建维护脚本目录
  2. sudo mkdir -p /usr/local/bin/lb-maintenance
  3. # 创建主维护脚本
  4. sudo tee /usr/local/bin/lb-maintenance/daily.sh > /dev/null <<EOF
  5. #!/bin/bash
  6. # 每日维护脚本
  7. LOG_FILE="/var/log/lb-maintenance.log"
  8. DATE=\$(date +%Y-%m-%d)
  9. echo "===== Starting daily maintenance at \$(date) =====" >> \$LOG_FILE
  10. # 备份配置
  11. echo "Backing up configurations..." >> \$LOG_FILE
  12. mkdir -p /backup/lb/\$DATE
  13. cp -r /etc/nginx/* /backup/lb/\$DATE/nginx/
  14. cp -r /etc/haproxy/* /backup/lb/\$DATE/haproxy/
  15. ipvsadm-save > /backup/lb/\$DATE/ipvsadm.conf
  16. # 清理旧日志
  17. echo "Cleaning old logs..." >> \$LOG_FILE
  18. find /var/log/nginx -name "*.log.*" -mtime +30 -delete
  19. find /var/log/haproxy -name "*.log.*" -mtime +30 -delete
  20. # 检查服务状态
  21. echo "Checking service status..." >> \$LOG_FILE
  22. systemctl is-active nginx >> \$LOG_FILE 2>&1
  23. systemctl is-active haproxy >> \$LOG_FILE 2>&1
  24. # 检查磁盘空间
  25. echo "Checking disk space..." >> \$LOG_FILE
  26. df -h >> \$LOG_FILE 2>&1
  27. echo "===== Daily maintenance completed at \$(date) =====" >> \$LOG_FILE
  28. EOF
  29. # 创建周维护脚本
  30. sudo tee /usr/local/bin/lb-maintenance/weekly.sh > /dev/null <<EOF
  31. #!/bin/bash
  32. # 每周维护脚本
  33. LOG_FILE="/var/log/lb-maintenance.log"
  34. DATE=\$(date +%Y-%m-%d)
  35. echo "===== Starting weekly maintenance at \$(date) =====" >> \$LOG_FILE
  36. # 更新系统
  37. echo "Updating system..." >> \$LOG_FILE
  38. yum update -y >> \$LOG_FILE 2>&1
  39. # 清理备份
  40. echo "Cleaning old backups..." >> \$LOG_FILE
  41. find /backup -name "*.tar.gz" -mtime +60 -delete
  42. # 检查SSL证书
  43. echo "Checking SSL certificates..." >> \$LOG_FILE
  44. for cert in /etc/ssl/certs/*.pem; do
  45.     openssl x509 -enddate -noout -in \$cert >> \$LOG_FILE 2>&1
  46. done
  47. # 性能报告
  48. echo "Generating performance report..." >> \$LOG_FILE
  49. echo "CPU usage:" >> \$LOG_FILE
  50. top -b -n 1 | head -20 >> \$LOG_FILE 2>&1
  51. echo "Memory usage:" >> \$LOG_FILE
  52. free -h >> \$LOG_FILE 2>&1
  53. echo "Network connections:" >> \$LOG_FILE
  54. ss -s >> \$LOG_FILE 2>&1
  55. echo "===== Weekly maintenance completed at \$(date) =====" >> \$LOG_FILE
  56. EOF
  57. # 设置脚本可执行权限
  58. sudo chmod +x /usr/local/bin/lb-maintenance/*.sh
  59. # 添加到crontab
  60. echo "0 2 * * * /usr/local/bin/lb-maintenance/daily.sh" | sudo crontab -
  61. echo "0 3 * * 0 /usr/local/bin/lb-maintenance/weekly.sh" | sudo crontab -
复制代码

7.3 灾难恢复

制定灾难恢复计划,确保在严重故障时能够快速恢复服务。
  1. # 创建灾难恢复脚本
  2. sudo tee /usr/local/bin/lb-maintenance/disaster-recovery.sh > /dev/null <<EOF
  3. #!/bin/bash
  4. # 灾难恢复脚本
  5. LOG_FILE="/var/log/lb-disaster-recovery.log"
  6. BACKUP_DIR="/backup/lb"
  7. echo "===== Starting disaster recovery at \$(date) =====" >> \$LOG_FILE
  8. # 检查服务状态
  9. echo "Checking service status..." >> \$LOG_FILE
  10. systemctl is-active nginx >> \$LOG_FILE 2>&1
  11. systemctl is-active haproxy >> \$LOG_FILE 2>&1
  12. # 停止服务
  13. echo "Stopping services..." >> \$LOG_FILE
  14. systemctl stop nginx >> \$LOG_FILE 2>&1
  15. systemctl stop haproxy >> \$LOG_FILE 2>&1
  16. # 恢复最新的配置
  17. echo "Restoring configurations..." >> \$LOG_FILE
  18. LATEST_BACKUP=\$(ls -t \$BACKUP_DIR | head -1)
  19. if [ -n "\$LATEST_BACKUP" ]; then
  20.     cp -r \$BACKUP_DIR/\$LATEST_BACKUP/nginx/* /etc/nginx/
  21.     cp -r \$BACKUP_DIR/\$LATEST_BACKUP/haproxy/* /etc/haproxy/
  22.     ipvsadm-restore < \$BACKUP_DIR/\$LATEST_BACKUP/ipvsadm.conf
  23.     echo "Restored from backup: \$LATEST_BACKUP" >> \$LOG_FILE
  24. else
  25.     echo "No backup found!" >> \$LOG_FILE
  26.     exit 1
  27. fi
  28. # 验证配置
  29. echo "Validating configurations..." >> \$LOG_FILE
  30. nginx -t >> \$LOG_FILE 2>&1
  31. haproxy -c -f /etc/haproxy/haproxy.cfg >> \$LOG_FILE 2>&1
  32. # 启动服务
  33. echo "Starting services..." >> \$LOG_FILE
  34. systemctl start nginx >> \$LOG_FILE 2>&1
  35. systemctl start haproxy >> \$LOG_FILE 2>&1
  36. # 检查服务状态
  37. echo "Checking service status after recovery..." >> \$LOG_FILE
  38. systemctl is-active nginx >> \$LOG_FILE 2>&1
  39. systemctl is-active haproxy >> \$LOG_FILE 2>&1
  40. echo "===== Disaster recovery completed at \$(date) =====" >> \$LOG_FILE
  41. EOF
  42. # 设置脚本可执行权限
  43. sudo chmod +x /usr/local/bin/lb-maintenance/disaster-recovery.sh
复制代码

定期测试灾难恢复流程,确保在真正需要时能够有效执行:
  1. # 创建测试脚本
  2. sudo tee /usr/local/bin/lb-maintenance/test-disaster-recovery.sh > /dev/null <<EOF
  3. #!/bin/bash
  4. # 测试灾难恢复脚本
  5. LOG_FILE="/var/log/lb-disaster-recovery-test.log"
  6. BACKUP_DIR="/backup/lb"
  7. echo "===== Starting disaster recovery test at \$(date) =====" >> \$LOG_FILE
  8. # 创建测试配置
  9. echo "Creating test configurations..." >> \$LOG_FILE
  10. cp /etc/nginx/nginx.conf /etc/nginx/nginx.conf.test
  11. cp /etc/haproxy/haproxy.cfg /etc/haproxy/haproxy.cfg.test
  12. ipvsadm-save > /tmp/ipvsadm.test.conf
  13. # 故意破坏配置
  14. echo "Intentionally breaking configurations..." >> \$LOG_FILE
  15. echo "# Broken configuration" > /etc/nginx/nginx.conf
  16. echo "# Broken configuration" > /etc/haproxy/haproxy.cfg
  17. ipvsadm -C
  18. # 测试服务启动(应该失败)
  19. echo "Testing service startup with broken configs..." >> \$LOG_FILE
  20. systemctl stop nginx haproxy >> \$LOG_FILE 2>&1
  21. systemctl start nginx >> \$LOG_FILE 2>&1
  22. systemctl start haproxy >> \$LOG_FILE 2>&1
  23. systemctl is-active nginx >> \$LOG_FILE 2>&1
  24. systemctl is-active haproxy >> \$LOG_FILE 2>&1
  25. # 运行灾难恢复
  26. echo "Running disaster recovery..." >> \$LOG_FILE
  27. /usr/local/bin/lb-maintenance/disaster-recovery.sh >> \$LOG_FILE 2>&1
  28. # 检查服务状态
  29. echo "Checking service status after recovery..." >> \$LOG_FILE
  30. systemctl is-active nginx >> \$LOG_FILE 2>&1
  31. systemctl is-active haproxy >> \$LOG_FILE 2>&1
  32. # 恢复原始配置
  33. echo "Restoring original configurations..." >> \$LOG_FILE
  34. cp /etc/nginx/nginx.conf.test /etc/nginx/nginx.conf
  35. cp /etc/haproxy/haproxy.cfg.test /etc/haproxy/haproxy.cfg
  36. ipvsadm-restore < /tmp/ipvsadm.test.conf
  37. rm -f /etc/nginx/nginx.conf.test /etc/haproxy/haproxy.cfg.test /tmp/ipvsadm.test.conf
  38. # 重启服务
  39. echo "Restarting services..." >> \$LOG_FILE
  40. systemctl restart nginx haproxy >> \$LOG_FILE 2>&1
  41. systemctl is-active nginx >> \$LOG_FILE 2>&1
  42. systemctl is-active haproxy >> \$LOG_FILE 2>&1
  43. echo "===== Disaster recovery test completed at \$(date) =====" >> \$LOG_FILE
  44. EOF
  45. # 设置脚本可执行权限
  46. sudo chmod +x /usr/local/bin/lb-maintenance/test-disaster-recovery.sh
  47. # 添加到crontab(每月运行一次测试)
  48. echo "0 4 1 * * /usr/local/bin/lb-maintenance/test-disaster-recovery.sh" | sudo crontab -
复制代码

8. 总结与最佳实践

8.1 负载均衡配置最佳实践

1. 选择合适的负载均衡解决方案:Nginx:适合HTTP/HTTPS负载均衡,功能丰富,配置简单HAProxy:专注于负载均衡和高可用性,性能优秀LVS:内核级负载均衡,适合高性能场景
2. Nginx:适合HTTP/HTTPS负载均衡,功能丰富,配置简单
3. HAProxy:专注于负载均衡和高可用性,性能优秀
4. LVS:内核级负载均衡,适合高性能场景
5. 优化负载均衡算法:根据应用特点选择合适的算法(轮询、最少连接、IP哈希等)对于不同性能的服务器,使用加权分配
6. 根据应用特点选择合适的算法(轮询、最少连接、IP哈希等)
7. 对于不同性能的服务器,使用加权分配
8. 实施健康检查:定期检查后端服务器的健康状态自动从负载均衡池中移除不健康的服务器在服务器恢复后自动将其重新加入负载均衡池
9. 定期检查后端服务器的健康状态
10. 自动从负载均衡池中移除不健康的服务器
11. 在服务器恢复后自动将其重新加入负载均衡池
12. 实现高可用性:使用Keepalived或Pacemaker实现负载均衡器的高可用性避免单点故障,确保服务持续可用
13. 使用Keepalived或Pacemaker实现负载均衡器的高可用性
14. 避免单点故障,确保服务持续可用
15. 优化性能:调整系统参数和负载均衡器配置以提高性能使用缓存和压缩减少后端服务器负载监控性能指标,及时发现并解决瓶颈
16. 调整系统参数和负载均衡器配置以提高性能
17. 使用缓存和压缩减少后端服务器负载
18. 监控性能指标,及时发现并解决瓶颈
19. 保障安全:实施SSL/TLS终止,保护数据传输安全配置请求限制和速率控制,防止滥用和DDoS攻击定期更新系统和软件,修复安全漏洞
20. 实施SSL/TLS终止,保护数据传输安全
21. 配置请求限制和速率控制,防止滥用和DDoS攻击
22. 定期更新系统和软件,修复安全漏洞
23. 日志和监控:配置详细的日志记录,便于故障排除使用监控工具实时监控系统状态设置告警机制,及时发现并响应问题
24. 配置详细的日志记录,便于故障排除
25. 使用监控工具实时监控系统状态
26. 设置告警机制,及时发现并响应问题
27. 定期维护:定期备份配置文件实施日志轮转,避免日志文件过大定期测试灾难恢复流程
28. 定期备份配置文件
29. 实施日志轮转,避免日志文件过大
30. 定期测试灾难恢复流程

选择合适的负载均衡解决方案:

• Nginx:适合HTTP/HTTPS负载均衡,功能丰富,配置简单
• HAProxy:专注于负载均衡和高可用性,性能优秀
• LVS:内核级负载均衡,适合高性能场景

优化负载均衡算法:

• 根据应用特点选择合适的算法(轮询、最少连接、IP哈希等)
• 对于不同性能的服务器,使用加权分配

实施健康检查:

• 定期检查后端服务器的健康状态
• 自动从负载均衡池中移除不健康的服务器
• 在服务器恢复后自动将其重新加入负载均衡池

实现高可用性:

• 使用Keepalived或Pacemaker实现负载均衡器的高可用性
• 避免单点故障,确保服务持续可用

优化性能:

• 调整系统参数和负载均衡器配置以提高性能
• 使用缓存和压缩减少后端服务器负载
• 监控性能指标,及时发现并解决瓶颈

保障安全:

• 实施SSL/TLS终止,保护数据传输安全
• 配置请求限制和速率控制,防止滥用和DDoS攻击
• 定期更新系统和软件,修复安全漏洞

日志和监控:

• 配置详细的日志记录,便于故障排除
• 使用监控工具实时监控系统状态
• 设置告警机制,及时发现并响应问题

定期维护:

• 定期备份配置文件
• 实施日志轮转,避免日志文件过大
• 定期测试灾难恢复流程

8.2 未来发展方向

负载均衡技术不断发展,以下是一些未来发展方向:

1. 云原生负载均衡:随着容器化和微服务架构的普及,负载均衡技术也在向云原生方向发展Kubernetes Ingress和Service Mesh(如Istio)提供了更灵活的负载均衡解决方案
2. 随着容器化和微服务架构的普及,负载均衡技术也在向云原生方向发展
3. Kubernetes Ingress和Service Mesh(如Istio)提供了更灵活的负载均衡解决方案
4. 智能负载均衡:基于机器学习的智能负载均衡算法,能够根据实时流量模式和历史数据自动调整负载分配策略预测性扩展,能够预测流量峰值并提前扩展资源
5. 基于机器学习的智能负载均衡算法,能够根据实时流量模式和历史数据自动调整负载分配策略
6. 预测性扩展,能够预测流量峰值并提前扩展资源
7. 边缘计算负载均衡:随着边缘计算的兴起,负载均衡技术也在向边缘扩展在边缘节点上实现负载均衡,减少延迟,提高用户体验
8. 随着边缘计算的兴起,负载均衡技术也在向边缘扩展
9. 在边缘节点上实现负载均衡,减少延迟,提高用户体验
10. 全球服务器负载均衡(GSLB):跨多个地理位置的数据中心实现负载均衡基于用户位置、网络延迟和服务器负载等因素,将用户请求路由到最佳数据中心
11. 跨多个地理位置的数据中心实现负载均衡
12. 基于用户位置、网络延迟和服务器负载等因素,将用户请求路由到最佳数据中心

云原生负载均衡:

• 随着容器化和微服务架构的普及,负载均衡技术也在向云原生方向发展
• Kubernetes Ingress和Service Mesh(如Istio)提供了更灵活的负载均衡解决方案

智能负载均衡:

• 基于机器学习的智能负载均衡算法,能够根据实时流量模式和历史数据自动调整负载分配策略
• 预测性扩展,能够预测流量峰值并提前扩展资源

边缘计算负载均衡:

• 随着边缘计算的兴起,负载均衡技术也在向边缘扩展
• 在边缘节点上实现负载均衡,减少延迟,提高用户体验

全球服务器负载均衡(GSLB):

• 跨多个地理位置的数据中心实现负载均衡
• 基于用户位置、网络延迟和服务器负载等因素,将用户请求路由到最佳数据中心

通过遵循这些最佳实践和关注未来发展方向,可以构建一个高性能、高可用、安全的负载均衡架构,为网站和应用提供稳定可靠的服务。
「七転び八起き(ななころびやおき)」
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则