HAproxy

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/dengyuelin/article/details/50778886

haproxy是一款非常的专业的全7层的反向代理负载均衡器,采用的是epoll机制,可以实现4层和7层的负载均衡,4层使用的是tcp模式可以模拟lvs,7层使用的是http模式可以模拟nginx,nginx和haproxy的处理速度都远不及lvs,因为他们是工作在用户空间的,而lvs是工作在内核空间的

  • 性能特性?
  1. 单进程、事件驱动模型显著降低了上下文切换的开销及内存占用。 
  2. 事件检查器(eventchecker)允许其在高并发连接中对任何连接的任何事件实现即时探测。 
  3. 在任何可用的情况下,单缓冲(singlebuffering)机制能以不复制任何数据的方式完成读写操作,这会节约大量的CPU时钟周期及内存带宽; 
  4. MRU内存分配器在固定大小的内存池中可实现即时内存分配,这能够显著减少创建一个会话的时长;
  • 可以实现:
  1. 反向代理
  2. 基于cookie会话绑定
  3. 网页动静分离

  • haproxy与各负载均衡器的区别?
  1. 与nginx:同样工作在用户空间,nginx是一款轻量级,能实现缓存、webserver、邮件、负载均衡等功能,但nginx的许多功能都需要第三方的模块,而haproxy的转发能力比nginx有更强更灵活的定制性,可以运用splice实现0复制的转发,并且有更直观的图形化管理界面,不过通用性不如nginx,并无缓存功能
  2. 与varnish:varnish是一款web缓存系统,
  3. 与lvs:lvs是工作在内核空间上直接转发的,无缓存功能

  • 衡量一个负载均衡器的性能:
  1. 会话率,会话接收的速率,类似于并发数QPS,每秒的NEW状态的查询请求数,可以通过http的header来标记,实时有效并发,最能体现负载均衡性能的最主要的指标,通常预期应该至少在10倍以上的并发能力
  2. 会话并发能力,类似活动连接数,即ESTABLISHED状态的会话,由于使用了keep-alive保持连接数以及链接复用等机制,因此活动连接数通常是并发数的很多倍,1:20
  3. 数据处理速度,减去与客户端,与服务端建立连接和传输的时间,中间那部分时间的数据处理的速度
  • 调度算法
  1. roundrobin  动态,加权轮询,所谓动态就是可以实时生效,不用重启服务,但是连接数受限,最多支持4128
  2. static-rr   静态轮询,需重启服务
  3. leastconn   动态,根据后端主机的负载数量进行调度
  4. source   类似源地址hash,可以指定hash-type ,有map-based(取膜法,静态), consistent(一致性哈希,动态)
  5. uri  类似于DH算法,目标地址哈希,可以指定hash-type ,有map-based(取膜法,静态), consistent(一致性哈希,动态)
  6. hdr(<name>):根据请求报文中指定的header(User-agent,referer,hostname,cookie)进行调度,把指定的header的值做hash计算;可根据header首部来进行调度,非常强大,比如根据User-Agent浏览器类型来进行调度,可以指定hash-type ,有map-based(取膜法,静态), consistent(一致性哈希,动态)
准备三台host:
host1:172.16.52.58
host2: 172.16.52.59
host3:172.16.52.60
host1:   yum install   haproxy  ,已经被收录进centos的base源了
分别现在host2和host3上面准备两台httpd服务,并存放数个html页面
yum  install  -y  httpd  mariadb-server  php
host2:   for i in {1..10};do echo "<h1>Page $i on node3</h1>" > /var/www/html/test$i.html; done
host3: for i in {1..10};do echo "<h1>Page $i on node4</h1>" > /var/www/html/test$i.html; done

eg1:利roundrobin实现最简单的调度,host1,可以同时绑定多个端口
frontend main *:80
   bind *:8080
   mode http
   default_backend websv1
backend websv1
  balance roundrobin
  server web1 172.16.52.59:80 check
  server web2 172.16.52.60:80 check

测试:http://172.16.52.58
            http://172.16.52.58:8080

eg2:基于uri的一致性hash

frontend main *:80
   mode http
   default_backend websv1
backend websv1
  balance uri
  hash-type consistent 
  server web1 172.16.52.59:80 check
  server web2 172.16.52.60:80 check

测试:http://172.16.52.58/test1.html
测试:http://172.16.52.58/test2.html

eg3:基于hdr进行一致性hash调度,User-Agent
frontend main *:80
   mode http
   default_backend websv1
backend websv1
  balance hdr(User-Agent) 
  hash-type consistent 
  server web1 172.16.52.59:80 check
  server web2 172.16.52.60:80 check

测试:换不同浏览器对同一个地址请求连接
IE: http://172.16.52.58/test4.html
Chorm:http://172.16.52.58/test4.html

eg4: 设置cookie,基于会话绑定
frontend main *:80
   bind *:8080
   mode http
   default_backend websv1
backend websv1
  balance roundrobin 
  server web1 172.16.52.59:80 check  weight 1  cookie web1
  server web2 172.16.52.60:80 check  weight 3  cookie web2
  cookie COOKIEID  insert  nocache  indirect
说明:COOKIEID是自定义的一个变量,目的是接受cookie web1和cookie web2 传递过来的web1和web2,因此,当第一次使用roundrobin调度后,后面将会基于cookie实现会话绑定,而cookie插入的方式有三种:  rewrite(将COOKIEID改写为定义的名字),insert(附加插入,最常用),prefix(添加到前面),如图:


eg5:状态展示,listen用于将所有的frontend和backend都放在一起,可以定义另外一个端口来访问以提升安全,默认的uri访问路径是/haproxy?stats,不过可以自己定义uri
frontend main *:80
   mode http
   default_backend websv1
backend websv1
  balance roundrobin 
  server web1 172.16.52.59:80 check  weight 1  cookie web1
  server web2 172.16.52.60:80 check  weight 3  cookie web2
  cookie COOKIEID prefix  nocache indirect
listen status
  bind *:8081
  stats enable
测试:http://172.16.52.58:8081/haproxy?stats

eg6:

frontend main *:80
   bind *:8080
   mode http
   default_backend websv1
backend websv1
  balance roundrobin 
  server web1 172.16.52.59:80 check  weight 1  cookie web1
  server web2 172.16.52.60:80 check  weight 3  cookie web2
  cookie COOKIEID prefix  nocache indirect
listen status
  bind *:8081
  stats enable
  stats uri /hastatus
  stats realm "Sensitive Information"
  stats auth boom:boom
  stats auth map:map
  stats admin if TRUE

测试;http://172.16.52.58:8081/hastatus

说明:realm是指定认证的提示短语,貌似类似http认证时的原因短语,uri是自定义访问路径,auth后面指定账户名和密码,可以指定多个,若想要能够管理stats界面,需要管理员功能,stats amdin  if  TRUE就是开启管理员功能,于是就可以操作stats界面了,或者条件是只允许本地管理  stats admin if  LOCALHOST,还有两个选项:
     stats hide-version   //隐藏版本,这个有必要开启,避免针对性的攻击
    stats scope .    //指明作用域为当前范围,貌似开了不太靠谱,只能显示总的数量,不是很直观,不太习惯

eg7:记录源地址  
编辑后端httpd服务器的日志格式,然后当前访问的时候,用tail  /var/log/httpd/access_log  -f  查看,就会看到源地址
vim  /etc/httpd/conf/httpd.conf
  # LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined
    LogFormat "%{X-Forwarded-For}i %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-Agent}i\"" combined

说明:其实haproxy.conf中也是定义了option forwardfor       except 127.0.0.0/8 这个选项的,除了本地的访问地址不记录外,但是不知道为啥httpd的log看不到,但是在tail /var/log/haproxy.log中是可以看到的我的浏览器的访问ip地址的

eg8:向请求报文或者响应报文添加首部:
frontend main *:80
   bind *:8080
   mode http
   rspadd Via:\ 172.16.52.58
   default_backend websv1




global
    # to have these messages end up in /var/log/haproxy.log you will
    # need to:
    #
    # 1) configure syslog to accept network log events.  This is done
    #    by adding the '-r' option to the SYSLOGD_OPTIONS in
    #    /etc/sysconfig/syslog
    #
    # 2) configure local2 events to go to the /var/log/haproxy.log
    #   file. A line like the following can be added to
    #   /etc/sysconfig/syslog
    #
    #    local2.*                       /var/log/haproxy.log
    #
   # log         127.0.0.1 local2


    log         127.0.0.1 local2

/*实现日志存储功能,vim  /etc/sysconfig/rsyslog  ,  里面的选项貌似不加-r 也是可以的,

SYSLOGD_OPTIONS="-r"      

*/

/* 但是vim  /etc/rsyslog.conf里面必须要开启

# Provides UDP syslog reception
$ModLoad imudp
$UDPServerRun 514

# Provides TCP syslog reception
$ModLoad imtcp
$InputTCPServerRun 514

   local2.*                                               /var/log/haproxy.log

配置完成后重启haproxy和rsyslog服务可以查看/var/log/haproxy.log

 systemctl restart rsyslog.service

systemctl restart haproxy.service 

*/


    chroot      /var/lib/haproxy           

///创建虚拟目录,可以提高安全性,工作在假根目录,即是受到攻击,但也不会危害到系统,可以提升系统的安全级别

    pidfile     /var/run/haproxy.pid

///套接字文件,haproxy工作过程要建立4个套接字,即与接受client端的一次请求和返回,与后端server端发起一次请求和被返回
    maxconn     4000
    user        haproxy
    group       haproxy
    daemon

///守护进程


    # turn on stats 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
#---------------------------------------------------------------------
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                 3000
 listen stats
mode http
bind *:1080
stats enable
stats hide-version
stats uri  /haproxyadmin
    stats realm Haproxy\ Statistics
stats auth  admin:admin
stats admin if TRUE


frontend http-in
bind *:80
log global
  option httpclose
  option logasap 
  option dontlognull
  capture request header Host len 20
capture request header Referer len 60
default_backend servers
backend servers
balance roundrobin
server web1 172.16.52.59:80 check maxconn 4000
server web2 172.16.52.60:80 check maxconn 3000
  option httpclose
  option httpclose
  option httpclose
frontend mysql
bind *:3306
mode tcp 
log global
default_backend mysqlservers


backend mysqlservers
balance leastconn
server mysql1  172.16.52.59:3306  inter 2 rise 1 fall 2 maxconn 300

///inter是指健康状态检查的时间间隔为2s,rise是指从updown到ok状态检查的次数,而fall则是从ok到down状态的检查次数


server mysql2  172.16.52.59:3306  inter 2 rise 1 fall 2 maxconn 300


  • 访问:http://172.16.52.58:1080/haproxyadmin
调度算法(balance):
roundrobin,static-rr,leastconn(常用语ldap,msyql),source(地址hash),uri
而source的hash-type有两种,

    

  • 使用zaibbix监控haproxy   http://blog.csdn.net/hanzheng260561728/article/details/52819253
 wget http://www.dest-unreach.org/socat/download/socat-1.7.3.0.tar.bz2
  tar xf socat-1.7.3.0.tar.bz2 
  cd socat-1.7.3.0
  ./configure 
   make
   make install
   which socat
默认haproxy sock是开启的
global
    # turn on stats unix socket
    stats socket /var/lib/haproxy/stats

echo "show info"|socat /var/lib/haproxy/stats stdio


   

阅读更多
想对作者说点什么?

博主推荐

换一批

没有更多推荐了,返回首页