2004 发表于 2019-1-1 12:49:11

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

  实验前提:
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
  实验拓扑结构:
http://s3.运维网.com/wyfs02/M00/5D/B4/wKioL1Ujk1Swy5BcAABQ4XgAQUQ005.jpg
  安装步骤:
  1、配置web1
  首先需要安装httpd服务(需要事先配置好yum源)
  # yum -y installhttpd
  
  然后修改httpd的根目录下的index.html文件,修改内容如下:
  # echo“I am a web1,my ip is192.168.108.230”>/var/www/html/index.html
  
  启动httpd服务
  # service httpd start
  
2、配置web2
  安装httpd服务
  # yum -y installhttpd
  
  然后修改httpd的根目录下的index.html文件,修改内容如下:
  # echo“I am a web1,my ip is192.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
  
  frontendfirst
      bind *:80
      mode http
      log global
      option httpclose
      option logasap
      capturerequest header Host len 20
      capturerequest header refererlen 60
      default_backend             webserver
  
  
  backend webserver
      balance   roundrobin (采用加权轮调算法)
      server      web1 192.168.108.230:80check inter 1000 rise 1 fall 2maxconn 2000
      server      web2 192.168.108.231:80check inter 1000 rise 1 fall 2maxconn 2000
  
  
  
  
  4、测试负载均衡功能是否生效
  访问http://192.168.108.233,显示结果为:
http://s3.运维网.com/wyfs02/M02/5D/B8/wKiom1UjkPfgn1ghAADCglPtrt8002.jpg

  

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

                  server localweb127.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: 192.168.108.15:58371 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: 192.168.108.15:58371 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: Connect from 192.168.106.15:65116 to 192.168.108.232:80 (first/HTTP)
  Dec 25 05:26:49 www.xsl.com haproxy: 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: 192.168.108.15:51016 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: 192.168.108.15:51016 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来实现会话保持功能

  如在配置文件中添加如下内容:
  backendwebserver
  balance roundrobin
  cookie SERVERID insert nocache
  serverweb1 192.168.108.230:80 cookie websession1 check inter 10 fall 2 rise 1
  serverweb2 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。如:
http://s2.运维网.com/wyfs02/M02/79/58/wKiom1aOk4Pi3xlRAAAwIb9tYkg434.png
  当用户下一次请求时,请求报文中将会新增一个cookie首部,如:
  
http://s3.运维网.com/wyfs02/M00/79/56/wKioL1aOlB3Sh9NeAAA_7-ml-iI360.png
  


  

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

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

测试,在浏览器中输入:http://192.168.108.232:8080/haproxyadmin?stats
显示结果为:
http://s3.运维网.com/wyfs02/M00/5D/B4/wKioL1Ujkl_hsPQEAAD-dB45GSY355.jpg

  
  将用户名xsl和密码xsl输入进去之后,显示结果为:
  http://s3.运维网.com/wyfs02/M00/79/70/wKioL1aRFuyDmOW1AAGkluE7meo171.png


  这个界面里面包含了各种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来完成请求资源的动静分离。
  其架构设计如下:
  http://s2.运维网.com/wyfs02/M01/79/79/wKioL1aSZB3QzVFCAAA-ab64Spk039.png
  在这个图中,所有静态资源有static site站点处理,而所有的动态资源则由dynamic site站点处理。
  其中haproxy的ip地址为192.168.108.230
  static site ip为192.168.108.51
  dynamic site ip为192.168.108.52
  

  动静分离的配置如下:
  
  frontendwebproxy *: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_dynamicpath_end -i .php
  use_backend staticif url_static
  use_backend dynamic if url_dynamic
  default_backend static
  

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

  server static192.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://s1.运维网.com/wyfs02/M00/79/7B/wKiom1aSZsvxnviyAABMRdokyUs241.png
  

  

  

  访问http://192.168.108.230:8080/index.php,访问结果如下:
http://s1.运维网.com/wyfs02/M00/79/79/wKioL1aSZxPCCQarAABFK-zUKeA875.png
  至此,请求资源的动静分离已经实现了。



页: [1]
查看完整版本: haproxy的负载均衡功能、基于cookie的session持久、haproxy自带的健康页面及其动静分离的实现