• 负载均衡
    • 负载均衡功能
      • web服务器的动态水平扩展—》对用户无感知
      • 增加业务并发访问及处理能力—》解决单服务器瓶颈问题
      • 节约公网IP地址—》降低IT支出成本
      • 隐藏内部服务器IP—》提高内部服务器安全性
      • 配置简单—》固定格式的配置文件
      • 功能丰富—》支持四层和七层,支持动态下线生机
      • 性能较强—》并发数万甚至数十万
    • 负载均衡类型
      • 四层
        • LVS
        • HAProxy
        • Nginx
      • 七层
        • HAProxy
        • Nginx
      • 硬件
        • F5
        • 深信服等
    • 应用场景
      • 四层:Redis Mysql RabbitMQ Memcache
      • 七层: Nginx Tomcat Apache PHP
    • HAProxy功能
      • TCP和HTTP反向代理
      • SSL/TSL服务器
      • 可以针对HTTP请求添加cookie,进行路由后端服务器
      • 可平衡负载至后端服务器,并支持持久连接
      • 支持所有主服务器故障切换至备用服务器
      • 支持专用端口实现监控服务
      • 支持不影响现有连接的情况下停止接受新的连接请求
      • 可以在双向添加,修改或删除HTTP报文首部
      • 响应报文压缩
      • 支持访问控制
      • 通过特定的URL为授权用户提供详细状态信息
  • HAProxy安装及基础配置

    • ubuntu


      1. apt -get install software-properties-common
      2. add-apt-repository ppa:vbernat/haproxy-2.0 #通过PPA源来安装软件
      3. apt update
      4. apt-cache madison haproxy
      5. apt isntall haproxy
    • centos

      • yum ```shell yum install -y haproxy #centos yum 安装版本过旧

第三方包安装 wget http://www.nosuchhost.net/~cheese/fedora/packages/epel- 7/x86_64/cheese-release-7-1.noarch.rpm rmp -ivh cheese-release-7-1.noarch.rpm yum install haproxy-1.8.14-1.e17.x86_64.rpm -y

  1. - **编译安装**
  2. ```shell
  3. #解决lua环境问题
  4. #环境:ubuntu
  5. #安装基础命令及软件包
  6. apt install iproute2 ntpdate tcpdump telnet traceroute nfs-kernel-server nfs-common lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute gcc openssh-server lrzsz tree openssl libssl-dev libpcre3 libpcre3-dev zlib1g-dev ntpdate tcpdump telnet traceroute iotop unzip zip libreadline-dev libsystemd-dev
  7. #环境:centos
  8. yum install libtermcap-devel ncurses-devel libevent- devel readline-devel
  9. yum install gcc gcc-c++ glibc glibc-devel pcre pcre- devel openssl openssl-devel systemd-devel net-tools vim iotop bc zip unzip zlib-devel lrzsz tree screen lsof tcpdump wget ntpdate
  10. #开始安装
  11. cd /usr/local/src
  12. wget http://www.lua.org/ftp/lua-5.3.5.tar.gz
  13. tar xvf lua-5.3.5.tar.gz
  14. cd lua-5.3.5
  15. make linux test
  16. #检查是否安装成功
  17. /usr/local/src/lua-5.3.5/src/lua -v
  18. #编译安装haproxy
  19. cd /usr/local/src
  20. tar xvf haproxy-2.0.4.tar.gz
  21. #2.0之前参数
  22. make ARCH=x86_64 TARGET=linux2628 USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 PREFIX=/usr/local/haproxy
  23. #2.0参数
  24. make ARCH=x86_64 TARGET=linux-glibc USE_PCRE=1 USE_OPENSSL=1 USE_ZLIB=1 USE_SYSTEMD=1 USE_CPU_AFFINITY=1 USE_LUA=1 LUA_INC=/usr/local/src/lua- 5.3.5/src/ LUA_LIB=/usr/local/src/lua-5.3.5/src/ PREFIX=/apps/haproxy
  25. #开始安装
  26. make install PREFIX=/apps/haproxy
  27. ln -s /apps/haproxy/sbin/haproxy /usr/sbin
  28. #验证版本
  29. haproxy -v
  30. #启动脚本
  31. [Unit]
  32. Description=HAProxy Load Balancer
  33. After=syslog.target network.target
  34. [Service] ExecStartPre=/usr/sbin/haproxy -f /etc/haproxy/haproxy.cfg -c -q
  35. ExecStart=/usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg -p /var/lib/haproxy/haproxy.pid
  36. ExecReload=/bin/kill -USR2 $MAINPID
  37. [Install]
  38. WantedBy=multi-user.target
  1. - **启动haproxy**
  1. mkdir /var/lib/haproxy
  2. chown 99.99 /var/lib/haproxy/ -R #99.99用户是nologin
  3. systemctl start haproxy
  • 配置文件详解
    • global 全局配置段
    • proxies 代理配置段 ```shell

      global参数

      chroot #锁定运行目录 deamon #以守护进程运行 user , group , uid , gid 运行haproxy的用户身份 nbproc #开启的进程数,尽量与CPU保持一致 nbthread#指定每个进程开启的线程数,默认为一进程一线程 maxconn #每个haproxy进程的最大并发数 maxsslconn #每个haproxy进程ssl最大连接数,用于haproxy配置了证书的场景 spread-checks #后端server状态check随机提前或延迟百分比时间,建议2-5之间 pidfile #指定pid文件路径 log 127.0.01 local3 info #定义全局的syslog全局服务器,最多两个

Proxies参数

defaults #默认配置项,针对frontend backend listen生效,可多个name 可无name frontend name #前端servername 类似于nginx的虚拟主机 backend name #后端服务器组,等于nginx的upstream

listen name #将frontend backend 合并配置

proxies 配置defaults

option redispatch #当server id对应的服务器挂掉以后,强制定向到其他健康的服务器 option abortonclose #当server负载很高的时候,自动结束掉当前队列处理较久的连接 option http-keep-alive #开启与客户端的会话保持 option forwardfor #透传客户端真实IP至后端web服务器 mode http #设置默认工作类型 timeout http-keep-alive 120s #会话保持超时时间 timeout connect 120s #客户端请求从haproxy到后端Server最长连接等待时间 TCP之前 timeout sercer 600s #客户端请求从haproxy到后端server的请求处理超时时长 TCP之后 timeout client 600s #设置haproxy与客户端的最长非活动时间 timeout check 5s #对后端服务器的默认检测超时时间

proxies 配置frontend

bind #监听地址,也可单独用于listen中

proxies 配置backend

mode #指定负载协议类型 option #配置选项 server #定义后端real server check #对指定real进行检查,默认不开启 addr IP #IP PORT #端口 inter #间隔时间,默认2000MS fall #失效检查次数 ,默认为23 rise #下线至恢复检查次数,默认为2 weight #默认为1,最大为256 0不参与负载均衡 backup #将后端服务器标记备份状态 disabled#将后端服务器标记为不可用状态 redirect prefix http://www.baidu.com/ #将请求临时重定向,适用于http模式 maxconn #最大并发连接数 backlog #当server的连接数达到上限后的后援队列长度

范例

frontend web-port bind:10.0.10.1:80 mode http.tcp use_backend web_port_http

backend web_port_http mode http option forwardfor server 10.0.10.2 10.0.10.2:8081 check inter 3000 fall 3 rise 5 server 10.0.10.3 10.0.10.3:8080 check inter 3000 fall 3 rise 5

listen范例

listen web_port bind 10.0.10.1:80 mode http option forwardfor server web1 10.0.10.2:80 check inter 3000 fall 3 rise 5 server web2 10.0.10.3:80 check inter 3000 fall 3 rise 5

  1. - **调度算法**
  2. - **服务器权重调整**
  3. ```shell
  4. yum install socat
  5. echo "show info " | socat stdio #查看信息
  6. echo "get weight web_host/web1" | socat stdio #查看web1的权重信息
  7. echo "set weight web_host/web1 2 " | socat stido #调整web1的权重信息
  • 静态算法
    • static-rr
      • 基于权重的轮询调度,不支持权重的运行时调整及后端服务器慢启动,其后端主机数量无限制
    • first
      • 根据服务器在列表中的位置,自上而下进行调度,但是其只会当第一台服务器的连接数到达上限,新请求才会分配下一台服务器,因此会忽略服务器的权重设置
  • 动态算法
    • roundrobin
      • 基于权重的轮询动态调度算法,支持权重的运行时调整,不完全等于lvs的rr轮询,haproxy的支持慢启动,也就是新加的服务器会逐渐增加转发数,为默认调度算法,且支持对realserver权重动态调整
    • leastconn
      • 加权的最少连接的动态,支持权重的运行时调整和慢启动,即当前后端服务器连接最少的优先调度(新客户端连接),比较适合长连接场景 ```shell

        static-rr

        listen web_host bind 10.0.10.2:80 mode http log global balance static-rr server web1 10.0.10.2:80 weight 1 chekc inter 3000 fall 3 rise 5 server web2 10.0.10.3:80 weight 1 check inter 3000 fall 3 rise 5

first

listen web_port bind 10.0.10.2:80 mode http log global balance first server web1 10.0.10.3:80 weight 1 check inter 3000 fall 3 rise 5 #实验可用maxconn控制最大并发数 server web2 10.0.10.4:80 weight 1 check inter 3000 fall 3 rise 6

roundrobin

listen web_port bind 10.0.10.1:80 mode http balance roundrobin server web1 10.0.10.2:80 weight check inter 3000 fall 2 rise 5 server weg2 10.0.10.3:80 weight check inter 3000 fall 2 rise 5

leastconn

listen web_port bind 10.0.10.1:80 mode http balance leastconn server web1 10.0.10.2:80 weight check inter 3000 fall 2 rise 5 server weg2 10.0.10.3:80 weight check inter 3000 fall 2 rise 5

random

listen web_port bind 10.0.10.1:80 mode http balance random server web1 10.0.10.2:80 weight check inter 3000 fall 2 rise 5 server weg2 10.0.10.3:80 weight check inter 3000 fall 2 rise 5

  1. - **其他算法**
  2. - **soure**
  3. - **源地址哈希,基于用户源地址hash并将请求转发至后端服务器,默认为静态取模,通过hash-type选项更改,后续同一个IP将被转发至同一个后端web服务器,适用于session保持及缓存等业务**
  4. - **取模方法**
  5. - **基于服务器总权重的hash数组取模,该hash是静态的,不支持在线调整,不支持慢启动,缺点是服务器上线或下线都会引起变化导致调度结果发生改变**
  6. - **取模就是计算两个数相除的余数**
  7. - **一致性hash**
  8. - **动态,支持在线调整权重,支持慢启动,优点在于当服务器的总权重发生变化时,对影响是局部的,不会引起太大变动**
  9. - **相当于吧客户端信息分组,每个后端一组,然后即使权重发生改变,**
  10. - ** uri**
  11. - **基于用户请求的urihash并将请求转发至后端指定服务器,可通过map-based consisten定义使用取模法还是一致性hash**
  12. - **url-param:**
  13. - **针对用户url的参数做hash计算,并由服务器总权重相除以后派发至跳出的服务器,通常用于追踪用户,以确保来自同一用户的请求始终发往同一个real server**
  14. - **hdr**
  15. - **针对用户每个http头部请求中的指定信息做hash,由name指定的http首部将会被取出做hash计算,然后服务器总权重除以后派发至跳出的服务器,若无有效值,则使用默认的轮询调度**
  16. - **rdp-cookie**
  17. - **实现对win桌面的负载,可实现同一个win的请求始终被转发至同一个后台服务器,若从未访问过,则使用连接roundrobin算法计算一个后端服务器进行转发**
  18. - **random**
  19. - **基于随机数作为一致性hashkey 随即负载均衡对于大型服务器或经常添加删除服务器非常有用**
  20. - ** **
  21. ```shell
  22. #soure
  23. #map-base
  24. balance source
  25. #一致性hash
  26. balance source
  27. hash-type consistent
  28. #uri
  29. #map-base
  30. balance uri
  31. #hash
  32. balance uri
  33. hash-type consistent
  34. #url-param
  35. balance url_param name,age #支持单个及多个
  36. #hash
  37. balance url-param name,age
  38. hash-type consistent
  39. #hdr
  40. balance hdr (User-Agent)
  41. #hash
  42. balance hdr (User-Agent)
  43. hash-type consistent
  44. #rdp-cookie
  45. balance rdp-cookie
  46. mode tcp
  47. server rdp0 172.18.132.20:3389 check fall 3 rise 5 inter 2000 weight 1
  48. #hash
  49. balance rdp-cookie
  50. persist rdp-cookie #启⽤基于RDP cookie的持久连接,同⼀个 cookie就转发给对应的服务器。
  51. tcp-request inspect-delay 5s #设置内容检查期间等待数据的最⼤允 许时间
  52. tcp-request content accept if RDP_COOKIE #匹配RDP_COOKIE 存在就接受请求
  53. #hash-type consistent
  54. server win-server1 172.31.4.0:3389 check fall 3 rise 5 inter 2000 weight 1
  55. #基于iptables实现转发
  56. # iptables -t nat -A PREROUTING -d 172.31.7.201 -p tcp -- dport 3389 -j DNAT --to-destination 172.31.4.0:3389
  57. # iptables -t nat -A POSTROUTING -s 172.31.0.0/21 -j SNAT --to-source 172.31.7.201
  • 总结
    ```shell static-rr 静态—》做session共享的web集群 first 静态—》使用少

roundrobin 动态—》默认 leastconn 动态—》数据库 random 动态—》大型服务器或经常添加删除服务器场合

取决于hash type类型

source —》基于客户端公网IP的会话保持 uri —》缓存服务器 CDN url_param —》http hdr —》基于客户端请求报文头部做下一步处理 rpd_cookie —》很少使用

  1. - **layer4 layer7**
  2. - **四层**
  3. - **在四层负载均衡设备中,将客户端发送的报文目标地址,根据均衡设备的设置选择web服务器的IP地址,这样客户端可以直接与服务器建立TCP连接**
  4. - **七层**
  5. - **负载均衡器主要起反向代理服务器的作用,服务器建立一次TCP连接要三次握手,客户端先与负载均衡进行握手然后建立TCP连接,把访问的报文信息发送至负载均衡,然后负载均衡在与后端服务器建立三次握手,把数据发送webserver,然后webser将数据发送给负载均衡,负载均衡在将数据发送客户端。**
  6. - **IP透传**
  7. - **四层**
  8. - **七层**
  9. - **高级功能及配置**
  10. - **基于cookie的会话保持**
  11. - **配置选项**
  12. - ** **
  13. ```shell
  14. name : cookie 的key名称,用于实现持久连接
  15. insert : 如果客户端请求报文没有cookie就插入新的cookie到响应报文,第一次访问haproxy
  16. indirect:不会向客户端发送服务器已经处理过请求的cookie信息,比如后端服务器宕机后haproxy将客户端请求强制转发至real server则会涉及修改cookie ,不建议配置
  17. nocache:当客户端与haproxy之间有缓存时,haproxy不缓存客户端cookie,因为客户端浏览器会缓存cookie并携带cookie访问haproxy
  18. #配置 cookie SERVER-COOKIE insert nocache
  19. #验证 curl --cookie "SERVER-COOKIE=we111" URL
  • HAProxy状态页

    • 配置项

      1. stats enable #基于默认的参数启用stats page
      2. stats hide-version #隐藏版本
      3. stats refresh #设置自动刷新时间间隔
      4. stats uri #自定义stats page url 默认值 /haproxy?stats
      5. stats realm #账户认证提示信息
      6. stats auth aaa:111 #认证的账户密码
      7. stats amdin if true #启用管理功能
    • 登录状态页

      1. Running tasks: 1/9; idle = 100 % #运⾏的任务/当前空闲率
      2. active UP:#在线服务器
      3. backup UP:#标记为backup的服务器
      4. active UP, going down:#监测未通过正在进⼊down过程
      5. backup UP, going down:#备份服务器正在进⼊down过程
      6. active DOWN, going up:#down的服务器正在进⼊up过程
      7. backup DOWN, going up:#备份服务器正在进⼊up过程
      8. active or backup DOWN:#在线的服务器或者是backup的服务器已经转换 成了down状态
      9. not checked:#标记为不监测的服务器
      10. active or backup DOWN for maintenance (MAINT) #active或者 backup服务器⼈为下线的
      11. active or backup SOFT STOPPED for maintenance #active或者 backup被⼈为软下线(⼈为将weight改成0)