设为首页 收藏本站
查看: 1352|回复: 0

[经验分享] haproxy的负载均衡功能、基于cookie的session持久、haproxy自带的健康页面及其动静分离的实现

[复制链接]

尚未签到

发表于 2019-1-1 12:49:11 | 显示全部楼层 |阅读模式
  实验前提:
1、本次实验是在RHEL 6.4(64bit)系统上完成的。
2、实验前确保每台服务器同步
3、本次实验有3台主机,其中haproxy作为反向代理地址为192.168.108.232,后面2台的httpd服务器为192.168.108.230和192.168.108.231.(我这里在虚拟机上使用的是桥接的方式,也可以使用仅主机方式,不过使用仅主机方式haproxy上需要2快网卡)
4、测试时请关闭防火墙和selinux
  实验拓扑结构:

  安装步骤:
  1、配置web1
  首先需要安装httpd服务(需要事先配置好yum源)
  # yum -y install  httpd
  
  然后修改httpd的根目录下的index.html文件,修改内容如下:
  # echo  “I am a web1,my ip is  192.168.108.230”  >  /var/www/html/index.html
  
  启动httpd服务
  # service httpd start
  
2、配置web2
  安装httpd服务
  # yum -y install  httpd
  
  然后修改httpd的根目录下的index.html文件,修改内容如下:
  # echo  “I am a web1,my ip is  192.168.108.231”  >  /var/www/html/index.html
  
  启动httpd服务
  # service httpd start
  
  
  后端的2个httpd服务配置完成之后最后测试一下,httpd是否可以正常工作。如果可以,则继续下面的步骤。
  
  
3、配置haproxy
  在RHEL 6.4上面有自带的RPM包,因此在这里我们直接使用RPM包的方式进行安装。
  # yum -y install haproxy
  
  配置完成之后,然后在编辑其配置文件为如下内容:
  # vim /etc/haproxy/haproxy.cfg
  global
      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
      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
  
  frontend  first
      bind *:80
      mode http
      log global
      option httpclose
      option logasap
      capture  request header Host len 20
      capture  request header referer  len 60
      default_backend             webserver
  
  
  backend webserver
      balance     roundrobin (采用加权轮调算法
      server      web1 192.168.108.230:80  check inter 1000 rise 1 fall 2  maxconn 2000
      server      web2 192.168.108.231:80  check inter 1000 rise 1 fall 2  maxconn 2000
  
  
  
  
  4、测试负载均衡功能是否生效
  访问http://192.168.108.233,显示结果为:


  

  然后在刷新该页面,显示结果为:

  
  由于采用的是加权轮调算法,因此,每个用户请求都会均匀的分发给后端的服务器。
  
  5、定义备份服务器
  定义备份服务器的好处在于,当后端的所有服务器都不可用时,将启动备份服务器,此时备份服务器通常不是用来提供服务的,而是返回一些提示信息给用户,比如“网站正在维护中,请您稍好访问...”等之类的信息。
  在backend段中在添加一个server,并且在这个server后面加上参数backup即可。比如:
   backend webserver

                  server localweb  127.0.0.1 backup
  

  然后在本机上安装httpd,并启动该服务器。
  # yum -y install httpd
  echo "sorry,Site is weihu" > /var/www/html/index.html
  

  然后启动httpd服务即可
  # service httpd start
  

  

  

  6、定制日志文件
  haproxy的特性之一就是可以将日志文件定义到其他服务器上。
  在haproxy配置文件中,在global中添加如下信息,如:
  globa
          log 192.168.108.231 daemon info

  说明:daemon必须是rsyslog系统上的标准facility之一。
  

  global端配置完成之后,还需要在default段中添加log global等参数。如:
  default
          log global

          option httplog

  

  然后重载haproxy服务
  # service haproxy reload
  

  此时,在配置文件定义完成之后,还需要在日志服务器上(这里为192.168.108.231)的日志服务配置文件添加如下信息:
  # vim /etc/rsyslog.conf
  daemon.*                                                /var/log/haproxy.log
  

  此时重启日志系统服务
  #  service rsyslog restart
  

  测试访问http://192.168.108.232,并查看日志文件/var/log/haproxy.log中的日志信息。其日志内容大概为如下信息:
  Dec 25 09:54:38 www.xsl.com haproxy[2449]: 192.168.108.15:58371 [25/Dec/2015:09:54:38.691] first webserver/web1 5/0/1/1/7 200 286 - - ---- 2/2/0/1/0 0/0 "GET / HTTP/1.1"
  Dec 25 09:54:38 www.xsl.com haproxy[2449]: 192.168.108.15:58371 [25/Dec/2015:09:54:38.699] first webserver/web2 19/0/1/2/22 404 472 - - ---- 2/2/0/0/0 0/0 "GET /favicon.ico HTTP/1.1"
  

  如果不加参数option httplog参数时,其日志文件中的内容大概为如下内容:
  
  Dec 25 05:26:49 www.xsl.com haproxy[2312]: Connect from 192.168.106.15:65116 to 192.168.108.232:80 (first/HTTP)
  Dec 25 05:26:49 www.xsl.com haproxy[2312]: Connect from 192.168.106.15:65117 to 192.168.108.232:80 (first/HTTP)
  

  通常,如果将某日志文件定义在一台日志服务器上时,我们还应该在日志文件中记录是由哪台服务器发送来的日志信息,以便分析使用。在global段中添加log-send-hostname指令即可。如
  global
  log-send-hostname "director" (引号中的内容可以自行定义,默认为当前主机名)

  

  定义完成之后,其日志内容大概为:
  Dec 25 10:16:52 www.xsl.com "director" haproxy[2578]: 192.168.108.15:51016 [25/Dec/2015:10:16:52.110] first webserver/web2 814/0/1/1/816 404 472 - - ---- 1/1/0/0/0 0/0 "GET /favicon.ico HTTP/1.1"
  Dec 25 10:16:53 www.xsl.com "director" haproxy[2578]: 192.168.108.15:51016 [25/Dec/2015:10:16:52.927] first webserver/web1 127/0/1/1/129 404 472 - - ---- 1/1/0/0/0 0/0 "GET /favicon.ico HTTP/1.1"
  
7、session保持机制

  session保持方式一般说来有四种:
  (1)、基于ip的绑定。这种方式不利用负载均衡,比如nat服务器后的所有用户将会被调度到后端的同一个服务器上。lvs、nginx、haproxy均提供了此功能。
  (2)、基于cookie绑定。这种做法可以使得每个用户的请求被调度到不通的后端服务器,从而实现负载功能。而我们的haproxy提供了此功能。
  (3)、session集群或session复制,这种做法会使得服务器资源消耗太大,并且集群服务器之间的session信息相互复制,会增大网络io。
  (4)、使用一台单独的服务器作为session服务器,当需要某个客户端的session信息时,直接从这台session服务器上获取即可。但是这种做法需要为session服务器提供高可用服务,否则session服务器故障了,则所有的session信息不可用。
  

  在这里只介绍如何使用cookie来实现会话保持功能

  如在配置文件中添加如下内容:
  backend  webserver
  balance roundrobin
  cookie SERVERID insert nocache
  server  web1 192.168.108.230:80 cookie websession1 check inter 10 fall 2 rise 1
  server  web2 192.168.108.231:80 cookie websession2 check inter 10 fall 2 rise 1
  

  然后重载haproxy服务
  # service haproxy reload
  

  然后测试访问http://192.168.108.232,第一次访问时将会在响应报文中出现一个set-cookie的首部信息,其值为相应后端服务器返回的value,这里为websession1。如:

  当用户下一次请求时,请求报文中将会新增一个cookie首部,如:
  

  


  

  8、启用统计报告功能,使用web界面来管理其haproxy的状态连接等信息
  需要在其配置文件中添加如下信息:
listen stats
        mode http
        bind *:8080
        stats enable
        stats  hide-version
        stats uri /haproxyadmin?stats
        stats realm  "hello\ proxy"
        stats auth  xsl:xsl
        stats admin if TRUE(表示只有认证通过后才可以管理其统计信息
  
创建认证用户和密码
# useradd  xsl
# passwd  xsl    (密码也为xsl)

然后在重启haproxy服务
# service haproxy restart

测试,在浏览器中输入:http://192.168.108.232:8080/haproxyadmin?stats
显示结果为:


  
  将用户名xsl和密码xsl输入进去之后,显示结果为:
  


  这个界面里面包含了各种haproxy的状态、连接、会发、宕机时长等信息。其中这些参数的意思如下:
  Queue显示的是一些队列的参数
  Cur:当前的队列数
  Max:最大队列数
  Limit:队列的限制数
  Session rate显示的是与会话速率相关的参数
  Cur:表示当前每秒的会话数,也是当前每秒的请求数。
  Max:表示当前每秒最大的会话数。也是指的是最大并发数。
  Limit:限制每秒的会话数。
  Session显示的是与会话统计相关的参数
  Cur:当前的会话数
  Max:某一时刻的最大会话总数
  Limit:会话限制数
  Total:总的连接数或者总的session数
  Lbtot: total number of times a server was selected,从后端选择一台服务器所花的时间。
  Last:表示上一次会话到现在所经过的时间。如果此参数太大了,表示该服务器一致处于空闲状态。
  Byte:显示的请求和响应的字节数
  In:表示进来的字节数
  Out:表示出去的字节数
  Denied:拒绝的字节数
  Req:表示请求被拒绝的字节数
  Resp:响应被拒绝的字节数

  Error:表示与错误相关的参数

  Req:表示错误的请求数

  Conn:错误的连接数
  Resp:错误的响应数
  Warnings:与提示相关的参数

  Retr:表示重新尝试连接的次数

  Redis:重新发送的次数

  server:与服务器状态相关的参数

  status:显示的后端服务器的状态,及其由一种状态转换为另一种状态的时间。服务器状态只有up或down。
  LastChk:表示是通过4层还是通过7层方式来检查后端服务器的健康状况。con表示连接被拒绝,因此,监测失败。ok表示检测成功。
  Weight:后端服务器的权重

  Act:是否是活动主机。Y表示yes。

  Bct:是否是备份主机。
  Chk:后端服务器的健康状况监测失败的次数。
  Dwn:后端服务器宕过的次数。
  Dwntme:宕机的总时间
  

  9、haproxy实现请求的动静分离

  通常,在一个中上等规模的网站架构中,需要将静态资源和动态资源分开进行处理。即静态内容由一台或多台服务器进行处理;而动态内容由另外的一台或多台服务器进行处理。这样静态和动态内容实现分离响应。haproxy可以利用acl来完成请求资源的动静分离。
  其架构设计如下:
  
  在这个图中,所有静态资源有static site站点处理,而所有的动态资源则由dynamic site站点处理。
  其中haproxy的ip地址为192.168.108.230
  static site ip为192.168.108.51
  dynamic site ip为192.168.108.52
  

  动静分离的配置如下:
  
  frontend  webproxy *:8080
  acl url_static path_beg -i /static /img /images /css
  acl url_static path_end -i .html .xml .css .txt .png .gif .js .gpg
  acl url_dynamic  path_end -i .php
  use_backend static  if url_static
  use_backend dynamic if url_dynamic
  default_backend static
  

  backend static
  balance roundrobin
  option httpchk HEAD /test.html (定义7层检测方法,默认是通过4层来检测的)

  server static  192.168.108.51:80 check inter 5 fall 2 rise 1 weight 1 maxconn 2000
  

  backend dynamic
  balance roundrobin
  option httpchk HEAD /test.html
  server dynamic 192.168.108.52:80 check inter 5 fall 2 rise 1 weight 1 maxconn 1000
  
在后端服务器192.168.108.51上,添加如下文件:
  # echo "hello,static site"  > /var/www/html/index.html

  # echo "This is the static site..." > /var/www/html/index.php
  启动httpd服务
  # server httpd start
  

  在后端服务器192.168.108.52上,添加如下文件:
  
# echo "hello,dynamic site"  > /var/www/html/index.html

# echo "This is the dynamic site..." > /var/www/html/index.php
启动httpd服务
# server httpd start
  
访问http://192.168.108.230:8080/index.html,访问结果如下:

  

  

  

  访问http://192.168.108.230:8080/index.php,访问结果如下:

  至此,请求资源的动静分离已经实现了。




运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-658276-1-1.html 上篇帖子: OpenStack HA集群4 下篇帖子: haproxy环境
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表