sunren 发表于 2019-1-2 08:29:41

LB集群之Haproxy浅析及实现http动静分离及mysql负载

  一、HAProxy
   HAProxy提供高可用性、负载均衡以及基于TCP和HTTP应用的代理,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。
  

      HAProxy特别适用于那些负载特大的web站点,这些站点通常又需要会话保持或七层处理。HAProxy运行在当前的硬件上,完全可以支持数以万计的并发连接。并且它的运行模式使得它可以很简单安全的整合进当前的架构中, 同时可以保护web服务器不被暴露到网络上。
  

      HAProxy实现了一种事件驱动, 单一进程模型,此模型支持非常大的并发连接数。多进程或多线程模型受内存限制 、系统调度器限制以及无处不在的锁限制,很少能处理数千并发连接。事件驱动模型因为在有更好的资源和时间管理的用户端(User-Space) 实现所有这些任务,所以没有这些问题。此模型的弊端是,在多核系统上,这些程序通常扩展性较差。这就是为什么他们必须进行优化以使每个CPU时间片(Cycle)做更多的工作。
  

      HAProxy支持从4层至7层的网络交换,即覆盖所有的TCP协议。就是说,Haproxy 甚至还支持 Mysql 的均衡负载。
  

      Nginx,ApacheProxy,lighttpd,Cheroke 等,带反向代理均衡负载的产品,都是 Web 服务器,但是他们自己能够提供静态(html,jpg,gif..)或动态(php,cgi..)文件的传输以及处理。
      但 HAProxy 仅仅,而且专门是一款的用于均衡负载的应用代理。其自身并不能提供http服务。

  

      HAProxy拥有非常不错的服务器健康检查功能,还有专门的系统状态监控页面,当其代理的后端服务器出现故障, HAProxy会自动将该服务器摘除,故障恢复后再自动将该服务器加入。
http://s3.运维网.com/wyfs02/M02/28/82/wKiom1N6AaOxLaBaAADcPnspqkI156.jpg
  

  

  二、HAProxy特点

[*]  只专注负载均衡
[*]  强大的服务器健康检查功能,支持自动添加与排除服务器
[*]  自带强大的系统状态监控页面支持虚拟主机
[*]  支持对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡。(后端的MySQL slaves超过10台时性能不如LVS,此时建议LVS+Keepalived)
[*]  比Nginx有更出色的负载均衡速度,并发处理上也优于Nginx
[*]  支持全透明代理
[*]  支持连接拒绝
[*]  支持会话保持和七层处理

  
  三、HAProxy负载均衡调度算法
  1.roundrobin :

[*]  加权轮询;
[*]  动态算法,这表示支持服务器活动时修改其权重,服务器下线后重新上线时支持慢启动;
[*]  不过,每个后端服务器仅能最多接受4128个连接;
  2.static-rr :

[*]  加权轮询;
[*]  静态,不支持服务器活动时修改,需要重启服务才能生效;
[*]  后端服务器连接数上没有限制;
  3.leastconn :

[*]  最少连接者先处理,新的连接请求被派发至具有最少连接数目的后端服务器;
[*]  动态,可以在运行时调整其权重,慢启动;(推荐较长时间会话服务,使用此算法)
  4.source :

[*]  同一个客户端IP的请求由同一服务器处理,实现session保持;
[*]  默认为静态,支持使用hash-type调整为动态;
[*]  实现方式为,源地址进行hash运算,并由后端服务器的权重总数相除后派发至相应的服务器,若权重总数发生变化,如服务器宕机或添加新服务器,可能调度至不同服务器,session将无法保持;常用于负载均衡无cookie功能的基于TCP的协议;
  5.uri :

[*]  同一个URI的请求由同一服务器处理;
[*]  默认为静态算法,支持使用hash-type调整为动态;
[*]  实现方式为,对URI的左半部分(“问题”标记之前的部分)或整个URI进行hash运算,并由服务器的总权重相除后派发至相应的服务器,若权重总数发生变化,可能调度至不同服务器;
[*]  常用于代理缓存或反病毒代理以提高缓存的命中率;
  6.url_param :

[*]  确保同一个用户ID的请求将被送往同一个特定的服务器;
[*]  默认为静态算法,支持使用hash-type调整为动态;受限于权重;
[*]  若请求中没有出现指定的参数或没有有效值,则使用轮询;
  7.hdr ():

[*]  通过指定的HTTP首部将会被检索,根据HTTP请求头来锁定每一次HTTP请求;
[*]  默认为静态方法, 先对做hash计算然后 hash/weight计算,支持使用hash-type调整为动态;
[*]  受限于权重;
[*]  若相应的首部中没有出现指定的参数或没有有效值,则使用轮训;
  8.rdp-cookie(name):

[*]  表示根据cookie(name)来锁定并哈希每一次TCP请求,使同一个用户(或同一个会话ID)总是发送同一个特定的服务器;
[*]  默认为静态算法,支持使用hash-type调整为动态;受限于权重;
[*]  如果没有cookie,则使用轮询;
  

  四、HAProxy配置文件解析

[*]  配置文件格式

  HAProxy主要包括:


[*]  "global"段,全局配置参数,参数为进程级别的参数,且通常与其运行的OS相关。
[*]  proxy相关配置段,包括"defaults","listen","frontend","backend";
  "defaults"段用于为所有其它配置段提供默认参数,这配置默认配置参数可由下一个“defaults”所重新设定。
        "frontend"段用于定义一系列监听的套接字,这些套接字可接受客户端请求并与之建立连接。
      "backend"段用于定义一系列“后端”服务器,代理将会将对应客户端的请求转发至这些服务器。
      "listen"段通过关联“前端”和“后端”定义了一个完整的代理,通常只对TCP流量有用。

   2. 主配置文件 haproxy.cfg 解析
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy   #修改haproxy的工作目录至指定的目录并在放弃权限之前执行chroot()操作,
                                 #可以提升haproxy的安全级别,要确保指定的目录为空目录且任何用户均不能有写权限;
    pidfile      /var/run/haproxy.pid #将所有进程的pid写入文件启动进程的用户必须有权限访问此文件。
    maxconn    4000                #最大连接数,默认4000
    user      haproxy             #用户
    group       haproxy             #组
    daemon                         #让haproxy以守护进程的方式工作于后台,其等同于haproxy命令“-D”选项的功能,
                                 #当然,也可以在命令行中以“-db”选项将其禁用;
    # turn on stats unix socket#unix socket 文件
    stats socket /var/lib/haproxy/stats
#---------------------------------------------------------------------
# common defaults that all the 'listen' and 'backend' sections will
# use if not designated in their block
#默认的全局设置,这些参数可以被利用配置到frontend,backend,listen段
#---------------------------------------------------------------------
defaults
    mode                   http   #默认的模式mode { tcp|http|health },tcp是4层,http是7层,health只会返回OK
    log                     global#采用全局定义的日志
    option                  httplog #日志类别http日志格式
    option                  dontlognull #不记录健康检查的日志信息
    option http-server-close             #当客户端超时时,允许服务器关闭连接
    option forwardfor      except 127.0.0.0/8#在响应头部加入forwardfor,但不记录本机转发的日志
    option                  redispatch#在使用基于cookie的会话保持时,使用此项
                                    #一旦后端某一server宕机时,能够将其会话
                                    #重新派发到其它的upstream server               
    retries               3         #3次连接失败就认为服务不可用,也可以通过后面设置
    timeout http-request    10s       #请求超时
    timeout queue          1m       #队列超时
    timeout connect         10s       #连接超时
    timeout client         1m       #客户端连接超时
    timeout server          1m       #服务器连接超时
    timeout http-keep-alive10s       #长连接超时
    timeout check          10s      #检查超时
    maxconn               3000   #最大并发连接数
#---------------------------------------------------------------------
# main frontend which proxys to the backends #frontend 与backends代理配置
#---------------------------------------------------------------------
frontendmain *:5000
#acl策略配置
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .jpg .gif .png .css .js
    use_backend static          if url_static#满足策略要求,则响应策略定义的backend页面
    default_backend             app         #不满足则响应backend的默认页面
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such #定义使用静态文件
#---------------------------------------------------------------------
backend static            #后端静态服务器
    balance   roundrobin #负载均衡模式轮询
    server      static 127.0.0.1:4331 check #服务器定义
#---------------------------------------------------------------------
# round robin balancing between the various backends
#---------------------------------------------------------------------
backend app            #非静态的文件服务器
    balance   roundrobin #负载均衡模式轮询
    serverapp1 127.0.0.1:5001 check #服务器定义,check进行健康检查
    serverapp2 127.0.0.1:5002 check
    serverapp3 127.0.0.1:5003 check
    serverapp4 127.0.0.1:5004 check  

  四、简单的haproxy动静分离的部署

[*]  拓扑结构
  node1:HAProxy(172.16.1.1)
  node2:static-server(httpd: 172.16.1.11)
  node3:dynamic-server(httpd: 172.16.1.12)
  haproxy配置
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile   /var/run/haproxy.pid
    maxconn   4000
    user      haproxy
    group       haproxy
    daemon
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats
defaults
    mode                  http   
    log                     global
    option                  httplog
    option                  dontlognull
    option http-server-close   
    option forwardfor       except 127.0.0.0/8   
    option                  redispatch   
    retries               3
    timeout http-request    10s
    timeout queue         1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check         10s
    maxconn               10000    #最大并发连接数
frontendproxy *:80    #前端代理
    acl url_static       path_beg       -i /static /images /javascript /stylesheets
    acl url_static       path_end       -i .html .jpg .gif .png .css .js
    acl dynamic_contentpath_end       -i .php
    use_backend static          if url_static
    default_backend             dynamic
#---------------------------------------------------------------------
# static backend for serving up images, stylesheets and such
#---------------------------------------------------------------------
backend static    #后端静态服务器
    balance   roundrobin
    server      web1172.16.1.11:80 inter 3000 rise 2 fall 3 check maxconn 5000
backend dynamic    #后端动态服务器
    balance   roundrobin
    server      web2172.16.1.12:80 inter 3000 rise 2 fall 3 check maxconn 5000
listen statistics
      mode http
      bind *:8080    #把stats页面绑定到8080端口
      stats enable   #开启stats功能
      stats auth hoo:hoo       #认证的用户名和密码
      stats uri /admin?stats    #指定uri访问路径
      stats realm   Haproxy\ Statistics#定义显示文字
      stats hide-version      #为了安全(版本bug),隐藏版本信息
      stats admin if TRUE      #如果认证通过了就允许管理
      stats refresh 5s          #页面5秒刷新一次
      acl allow src 172.16.0.0/16    #定义访问控制列表
      tcp-request content accept if allow
      tcp-request content reject   3. httpd配置
  a. node2 配置
# yum install httpd -y
# echo \welcom to web1\ > /var/www/html/index.html
# service httpd start  b. node3 配置
# yum install httpd -y
# vim /var/www/html/index.html
welcom to web2

# service httpd start  4. 配置haproxy日志
  a.配置日志系统

# vim /etc/sysconfig/rsyslog# Options for rsyslogd
# Syslogd options are deprecated since rsyslog v3.
# If you want to use them, switch to compatibility mode 2 by "-c 2"
    #明显已有提示
# See rsyslogd(8) for more details
SYSLOGD_OPTIONS="-c 2 -r"  b.增加日志设备
# vim /etc/rsyslog.conf
#添一行
local2.*                     /var/log/haproxy.log  c.重启日志服务
# service rsyslog restart  5.启动服务
  node1
# haproxy -c -f /etc/haproxy/haproxy.cfg//检查配置文件
# service haproxy start
# netstat -tunlp | grep :80  6.测试服务
  a.在web1(172.16.1.11)的网页目录下,随意放一张图pic.jpg
  b.请求172.16.1.1/pic.jpg

  图片显示

  c.请求172.16.1.1
  显示phpinfo()函数信息

  d.haproxy统计页面输出
  请求:172.16.1.1:8080/admin?status
  输入帐号,密码即可访问

  

  五、简单的基于HAProxy的MySQL服务的负载均衡
  与http服务多大区别,只需改变mode合port,同时根据业务不同调整时间和连接数。

  配置文件:
global
    log         127.0.0.1 local2
    chroot      /var/lib/haproxy
    pidfile      /var/run/haproxy.pid
    maxconn   4000
    user      haproxy
    group       haproxy
    daemon
defaults
    mode                  tcp
                #基于四层
    log                     global
    option                  httplog
    option                  dontlognull
    retries               3
    timeout http-request    10s
    timeout queue         1m
    timeout connect         10s
    timeout client          1m
    timeout server          1m
    timeout http-keep-alive 10s
    timeout check         10s
    maxconn               600
listen statistics
    mode http
    bind *:1080
    stats enable
    stats hide-version
    stats uri   /admin?stats
    stats realm   Haproxy\ Statistics
    stats auth    hoo:hoo
    stats admin if TRUE
frontend mysqlproxy
    bind *:3306
    mode tcp
    log global
    default_backend mysqlservers
backend mysqlservers
    balance leastconn
    server dbser1 172.16.1.11:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300
    server dbser2 172.168.1.12:3306 check port 3306 intval 2 rise 1 fall 2 maxconn 300


页: [1]
查看完整版本: LB集群之Haproxy浅析及实现http动静分离及mysql负载