高并发负载均衡——HAProxy

HAProxy 提供高可用性、负载均衡以及基于 TCP (第四层)和 HTTP(第七层) 应用的负载均衡软件,支持虚拟主机,它是免费、快速并且可靠的一种解决方案。HAProxy 特别适用于那些负载特大且需要持久连接或四层和七层处理机制的 web 站点,例如门户网站或电商网站等。

作为专业的负载均衡软件,它有如下的显著优点:

(1) 单位时间内处理的最大请求数和最大数据处理能力都很大;

(2) 支持8中负载均衡算法,同时也支持session会话保持;

(3) 1.3版本以后,支持连接拒绝、全透明代理等功能,而这些功能其他负载均衡器不具备;

(4) 拥有强大的服务器状态监控页面;

(5) 拥有强大的ACL支持,支持虚拟主机;

HAProxy LVS的异同:

(1) LVS基于linux操作系统实现负载均衡,HAProxy基于第三应用实现;

(2) LVS是基于四层的负载均衡技术,而HAProxy是基于四层和七层技术、可提供HTTPTCP应用的的综合解决方案;

(3) LVS工作在第四层,状态监控功能单一,HAProxy可支持端口、URL、间本等多种状态检测方法;

(4) 虽然HAProxy功能强大,但整体处理性能低于四层的LVSLVS拥有更接近硬件设备的网络吞吐和连接负载的能力。

常用的调度算法如下:

roundrobin简单轮叫,服务器性能分布比较均匀时,此算法最公平、最合理;

static-rr表示根据权重进行轮叫,此为静态方法,在运行时调整服务器权重不会生效;

leastconn将新的连接发送给具有最少连接数目的后端服务器,适用与会话时间较长的场景中;

source基于请求源IP的算法,可以使同一个客户端的IP请求始终被发送到某个特定的后端服务器上,我们用其作为解决session问题的一种方法;

uri表示根据请求的URI

uri_param表示根据请求的URl参数’balance url_param’ requires an URL parameter name

hdr(name)表示根据HTTP头来锁定每一次HTTP请求,若指定的头不存在,则使用roundrobin进行调度;

一、 实验环境

172.25.18.1 ha1.tb.com

172.25.18.2 ha2.tb.com

172.25.18.3 www1.tb.com

172.25.18.4 www2.tb.com

172.25.18.5 bbs.tb.com

172.25.18.6 blog.tb.com

172.25.18.7 default.tb.com

系统环境RHEL6.5,防火墙和Selinux关闭

二、日志策略配置

HAProxy为了节省读写I/O所消耗的性能,没有自动配置日志输出功能。在RHEL6.5中,由可以实现UDP日志接收、将日志写入文件、将日志写入数据库等功能的rsyslog管理日志。因此,要先确保系统中安装了rsyslog

HAProxy的配置文件中可知,需要做两处修改:

(1) 修改/etc/sysconfig/rsyslog

 SYSLOGD_OPTIONS="-c 2 -r -m 0"

 -r表示接受远程日志; -c 2,使用兼容rsyslogsyslogd的模式

(2) 编辑/etc/rsyslog.conf

 $ModLoad imudp

$UDPServerRun 514

 local2.*        /var/log/haproxy.log

imdup,是模块名,支持UDP协议;

第二行表示允许514端口接收使用UDPTCP转发过来的日志,rsyslog在默认情况下,就是使用514端口监听UDP的;

HAProxy的日志信息存储到/var/log/haproxy.log中。

之后重启rsyslog服务,即可将HAProxy日志写入指定文件中。

三、后端真实服务器的配置

实验中以HTTP为例,验证HAProxy的负载均衡。

在后端五个主机上同时安装并开启httpd服务,并在发布目录中写入测试文件。可使用脚本或pssh加速执行。

[root@www ~]# pssh -i -H 172.25.18.1 "yum install -y hhtpd ; /etc/init.d/httpd start;echo `hostname` > /var/www/html/index.html"

四、HAProxy调度器的配置

HAProxy的配置虽然比较复杂,但常用的参数并不多,且所有配置都在一个文件中。

1、 配置文件概述

HAProxy的配置文件主要由如下五部分组成:

(1) global

 用于设定全局配置参数,属于进程级的配置,通常和操作系统配置有关。

2default

 默认参数的配置,在此部分设置的参数,会自动引用到下面的frontendbackendlisten部分。

3frontend

 用于设置设置前端虚拟节点。frontend可以根据ACL规则直接指定要使用的后端节点。

4backend

 用于设置集群后端真实服务器,以处理前端用户的请求。

5listen

 类似与HAProxy的监控页面的设置。

2、具体的配置如下

[root@ha1 ~]# cat /etc/haproxy/haproxy.cfg

global

    log         127.0.0.1 local2   全局的日志配置,local2是日志设备

    pidfile     /var/run/haproxy.pid   指定HAProxy进程的pid文件

    maxconn     4000      每个HAProxy进程可接受的最大连接数

    user        nobody      运行HAProxy进程的用户

    group       nobody

    Daemon      设置HAProxy进程进入后台运行

    nbproc 1     设置HAProxy启动时创建的进程数

#---------------------------------------------------------------------

# common defaults that all the 'listen' and 'backend' sections will

# use if not designated in their block

#---------------------------------------------------------------------

defaults

    mode                    http  HAProxy实例运行的模式

    option                  httplog  HAProxy日志默认不记录HTTP请求,此选项可以启用日志记录HTTP请求

    retries                 3     连接后端服务器的失败重试次数

    timeout connect      10s   连接到一台服务器的最长等待时间

    timeout client        30s   连接客户端发送数据时的最长等待时间

    timeout server  30s    服务器回应客户端数据发送的最长等待时间

    timeout check     10s  设置对后端服务器的检测超时时间

#---------------------------------------------------------------------

#listen part

#---------------------------------------------------------------------

listen admin_status

bind 0.0.0.0:19088    用于定义一个或几个监听的套接字

mode       http

log 127.0.0.1 local0 err

stats refresh 30s     设置监控页面的自动刷新时间

stats uri /haproxy_status  设置监控统计页面的URL路径,可任意指定

stats realm welcome login\ Haproxy 登录监控页面时的文本提示信息

stats auth admin:redhat   登录监控也面时的用户名和密码

#---------------------------------------------------------------------

# main frontend which proxys to the backends

#---------------------------------------------------------------------

frontend tb       定义前端虚拟节点的名称为tb

    bind *:80     

    mode  http

    option forwardfor   使后端服务器可以获得客户端的真实IP

    log   global     使用全局的日志配置

   acl url_www       hdr_reg(host)       -i ^(www.tb.com|tb.com)

   acl url_bbs       hdr_dom(host)       -i bbs.tb.com

   acl url_blog      hdr_beg(host)       -i blog.

ACL的使用方法如下:

acl   自定义的acl名称   acl方法   -i   [匹配的文件或路径]

acl:是一个关键字,表示ACL规则的开始;

acl方法:常用的有hdr_reg(host)hdr_beg(hosts)url_suburl_dirpath_begpath_end

-i:表示不区分大小写。

    use_backend server_www          if url_www

    use_backend server_bbs          if url_bbs

    use_backend server_blog         if url_blog

    default_backend          server_default

use_backend后需要跟一个backend实例名,表示在满足ACL规则后去请求哪个backend实例名。default_backend表示在没有满足ACL条件的时候默认使用哪个后端。

第一条ACL规则表示如果客户端以www.tb.comtb.com发送请求时,则此规则返回TRUE,第一个use_backend定义当url_www规则返回TRUE时,要调度的后端为server_www

#---------------------------------------------------------------------

#backend for default

#---------------------------------------------------------------------

backend server_default     后端真实服务器组的名称

    mode   http

    option  redispatch      此参数用于cookie保持的环境中

    option  abortonclose    设置在服务器负载高时自动结束队列中处理时间比较长的连接

    balance roundrobin    定义负载均衡算法为轮叫

    cookie  SERVERID      表示允许向cookie插入SERVERID

    server default 172.25.18.7:80 cookie default inter 2000 rise 2 fall 3 check 

server关键字用来定义后端真实服务器,使用格式为:

server    

:port   [param*]

常用的参数有:cookie,为指定的后端服务器设置cookie值;

check,对后端服务器执行健康检查;

inter,设置健康状态检查的时间间隔;

rise,从故障状态转至正常状态需要成功检查的次数;

fall,后端服务器从正常状态转至不可用状态需要检查的次数;

#---------------------------------------------------------------------

#backend for www.tb.com or tb.com

#---------------------------------------------------------------------

backend server_www

    mode  http

    option  redispatch

    option  abortonclose

    balance     roundrobin

    cookie  SERVERID

    server      www1  172.25.18.3:80 cookie www1 inter 2000 weight 2 rise 2 check fall 3

    server      www2  172.25.18.4:80 cookie www2 inter 2000 weight 2 rise 2 check fall 3

#---------------------------------------------------------------------

#backend for bbs.tb.com

#---------------------------------------------------------------------

backend server_bbs

    mode  http

    option  redispatch

    option  abortonclose

    balance     source

    cookie  SERVERID

    server bbs 172.25.18.5:80 cookie bbs inter 2000 rise 2 fall 3  check

#---------------------------------------------------------------------

#backend for blog.tb.com

#---------------------------------------------------------------------

backend server_blog

    mode  http

    option  redispatch

    option  abortonclose

    balance roundrobin

    cookie  SERVERID

    server blog 172.25.18.6:80 cookie blog inter 500 rise 2 fall 3 check

五、开启服务并测试

[root@ha1 haproxy]# /etc/init.d/haproxy start

1、 使用HAProxy的监控平台

与监控页面相关的设置已在part部分做了详细设置。在监控页面中,详细记录了frontendbackend等信息,并用不同的颜色标记出了backend中真实主机的状态。

在浏览器中输入http://172.25.18.1:19088/haproxy_status 进行访问
高并发负载均衡——HAProxy_第1张图片

2、负载均衡和虚拟主机测试

当不断刷新访问www.tb.com或是tb.com时,server_www的两台后端服务器默认的web页面信息会轮流的出现,这表明实现了server_www的负载均衡功能;

  当访问blog.tb.com时,只会出现server_blog后端的服务器的web页面,而不会出现其他的页面信息,表明实现了虚拟主机功能。

3、故障转移测试

server_www中有两台主机,假设将172.25.18.3HTTPD服务停止,当访问www.tb.com或是tb.com时,就不会访问到172.25.18.3这个节点。


http://blog.chinaunix.net/uid-30241692-id-5151676.html



你可能感兴趣的:(haproxy)