ITPub博客

首页 > 应用开发 > IT综合 > 软件级负载均衡器haproxy入门篇

软件级负载均衡器haproxy入门篇

原创 IT综合 作者:bestpaydata 时间:2015-12-11 15:14:01 0 删除 编辑

author:zy

现在网站发展的趋势对网络负载均衡的使用是随着网站规模的提升根据不同的阶段来使用不同的技术:

一种是通过硬件来进行,常见的硬件有比较昂贵的NetScaler、F5、Radware和Array等商用的负载均衡器,它的优点就是有专业的维护团队来对这些服务进行维护、缺点就是花销太大,所以对于规模较小的网络服务来说暂时还没有需要使用;另外一种就是类似于LVS/HAProxy、Nginx的基于Linux的开源免费的负载均衡软件策略,这些都是通过软件级别来实现,所以费用非常低廉,所以也比较推荐大家采用第二种方案来实施自己网站的负载均衡需求。


近期朋友刘鑫(紫雨荷雪)的项目成功上线了,PV达到了亿级/日的访问量,最前端用的是HAProxy+Keepalived双机作的负载均衡器/反向代理,整个网站非常稳定;这让我更坚定了以前跟老男孩前辈聊的关于网站架构比较合理设计的架构方案:即Nginx/HAProxy+Keepalived作Web最前端的负载均衡器,后端的MySQL数据库架构采用一主多从,读写分离的方式,采用LVS+Keepalived的方式。

在这里我也有一点要跟大家申明下:很多朋友担心软件级别的负载均衡在高并发流量冲击下的稳定情况,事实是我们通过成功上线的许多网站发现,它们的稳定性也是非常好的,宕机的可能性微乎其微,所以我现在做的项目,基本上没考虑服务级别的高可用了。

本篇文章旨在对HAProxy软件级负载均衡器的一个入门篇,后续,会陆续添加同样是软件级负载均衡的LVS、Keeplived、Twem proxy等的一些文章来共同学习。


HAProxy的特点是:

1、HAProxy是支持虚拟主机的,以前有朋友说这个不支持虚拟主机,我这里特此更正一下。

2、能够补充Nginx的一些缺点比如Session的保持,Cookie的引导等工作

3、支持url检测后端的服务器出问题的检测会有很好的帮助。

4、它跟LVS一样,本身仅仅就只是一款负载均衡软件;单纯从效率上来讲HAProxy更会比Nginx有更出色的负载均衡速度,在并发处理上也是优于Nginx的。

5、HAProxy可以对Mysql读进行负载均衡,对后端的MySQL节点进行检测和负载均衡,不过在后端的MySQL slaves数量超过10台时性能不如LVS,所以我向大家推荐LVS+Keepalived。

6、HAProxy的算法现在也越来越多了,具体有如下8种:

①roundrobin,表示简单的轮询,这个不多说,这个是负载均衡基本都具备的;

②static-rr,表示根据权重,建议关注;

③leastconn,表示最少连接者先处理,建议关注;

④ource,表示根据请求源IP,这个跟Nginx的IP_hash机制类似,我们用其作为解决session问题的一种方法,建议关注;

⑤ri,表示根据请求的URI;

⑥rl_param,表示根据请求的URl参数'balance url_param' requires an URL parameter name;

⑦hdr(name),表示根据HTTP请求头来锁定每一次HTTP请求;

⑧rdp-cookie(name),表示根据cookie(name)来锁定并哈希每一次TCP请求。



一、haproxy简介

HAProxy is a free, very fast and reliable solution offering high availability, load balancing, and proxying for TCP and HTTP-based applications. It is particularly suited for web sites crawling under very high loads while needing persistence or Layer7 processing. Supporting tens of thousands of connections is clearly realistic with todays hardware. Its mode of operation makes its integration into existing architectures very easy and riskless, while still offering the possibility not to expose fragile web servers to the Net。
摘自官网:http://haproxy.1wt.eu


集群(RAC)、主备机 这些字眼相信大家都已很熟悉或者是听过。不外乎是多台机器对外工作,避免单台机器超频率的工作带来的处理能力下渐、系统Hang住、以及数据灾难性的丢失等的一套应对性解决方案

同理,HAProxy是一个免费的、开源的、高可用的软件级别的负载均衡解决方案。这意味着它很便宜,不需要部署多台机器也能达到这一效果。

区别于其它类似的技术,HAProxy是可以工作在网络4层(TCP)和7层(HTTP)的。并且拥有图形界面

二、haproxy集群工作流程



三、haproxy官方文档
我们推荐任何技术的学习都从官方文档开始,博客的目的为大家展示一种经验。即我们团队用了(学了)这项技术,
然后把他记载下来,所以不会像官网那样篇篇长谈的经验交流

$haproxy setup path/doc/configuration.txt
$haproxy setup path/doc/haproxy-en.txt
configuration.txthaproxy-en.txt
在haproxy安装包目录,有个doc文件夹。里面便是各种详细的官方文档

haproxy安装篇
1.安装
在开始之前,请先将源程序下的README读完README

从官网或百度下找到haproxy-1.4.21.tar.gz
注:安装版本、安装目录均可自定义


haproxy-1.4.21.tar.gz
将haproxy-1.4.21.tar.gz上传至/zy/haproxy

解压缩安装包
tar zcvf haproxy-1.4.21.tar.gz
cd haproxy-1.4.21

执行编译
make TARGET=linux26 ARCH=i386 PREFIX=/zy/haproxy/haproxy_setup
--注:TARGET后面根据本机操作系统内核版本来填写。如果不明白的话,请查看文档
          TARGET、ARCH等词必需大写.ARCH是一个架构,指定系统相关的

安装proxy
make install PREFIX=/zy/haproxy/haproxy_setup


2.配置

首先把日志目录创建一次
mkdir /zy/haproxy/haproxy_setup/{logs} 


安装完毕后,进入安装目录配置文件,默认情况下目录里是没有.cfg配置文件的,可以回到安装文件目录下将examples下的haproxy.cfg拷贝到/zy/haproxy/haproxy_setup下。


HAProxy配置中分五大部分:
global:全局配置参数,进程级的,用来控制Haproxy启动前的一些进程及系统设置
defaults:配置一些默认的参数,可以被frontend,backend,listen段继承使用
frontend:用来匹配接收客户所请求的域名,uri等,并针对不同的匹配,做不同的请求处理
backend:定义后端服务器集群,以及对后端服务器的一些权重、队列、连接数等选项的设置,我将其理解为Nginx中的upstream块
listen:我将其理解为frontend和backend的组合体


# cd /zy/haproxy/haproxy_setup

# vi haproxy.cfg


根据实际需求,更改配置文件,我的配置如下

global           #全局设置
        log 127.0.0.1   local0      #日志输出配置,所有日志都记录在本机,通过local0输出
        #log loghost    local0 info
        maxconn 4096             #最大连接数
        chroot /zy/haproxy/haproxy_setup
        user root 
        group root
        daemon                   #以后台形式运行haproxy
        nbproc 2                 #启动2个haproxy实例
        pidfile /zy/haproxy/haproxy_setup/haproxy.pid  #将所有进程写入pid文件
        #debug
        #quiet
defaults             #默认设置
        #log    global
        log     127.0.0.1       local3         #日志文件的输出定向
        mode    http         #所处理的类别,默认采用http模式,可配置成tcp作4层消息转发
        option  httplog       #日志类别,采用httplog
        option  dontlognull  
        option  forwardfor   #如果后端服务器需要获得客户端真实ip需要配置的参数,可以从Http Header中获得客户端ip
        option  httpclose    #每次请求完毕后主动关闭http通道,haproxy不支持keep-alive,只能模拟这种模式的实现
        retries 3           #3次连接失败就认为服务器不可用,主要通过后面的check检查
        option  redispatch   #当serverid对应的服务器挂掉后,强制定向到其他健康服务器
        maxconn 2000                     #最大连接数
stats   uri     /haproxy-admin  #haproxy 监控页面的访问地址
        contimeout      5000            #连接超时时间
        clitimeout      50000           #客户端连接超时时间
        srvtimeout      50000           #服务器端连接超时时间
stats auth  zy:zhouyun   #设置监控页面的用户和密码:zhouyun
stats realm 设置统计页面认证时的提示内容 lands
# 设置统计页面认证时的提示内容
#stats hide-version         #隐藏统计页面的HAproxy版本信息
frontend http-in                        #前台
        bind *:80
        mode    http
        option  httplog
        log     global
acl php url_reg -i \.php$    --访问控制列表,    -i不区分大小写,    \.php$ php结尾规则
acl html url_reg -i \.html$
#use_backend php-server if php --判断访问控制列表类型,如果是php则会到下方的php-server中
use_backend htmpool if html
        default_backend htmpool       #静态服务器池,默认服务器池


#这玩艺每次启动都在报错,可能是还没有搭健康检查吧
backend htmpool                    #后台
        balance leastconn#负载均衡算法
        option  httpchk HEAD /index.htm HTTP/1.0       #健康检查
        server  web1 192.168.202.201:80 cookie 1 weight 5 check inter 2000 rise 2 fall 3
        server  web2 192.168.202.202:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3
        #cookie 1表示serverid为1,check inter 1500 是检测心跳频率
        #rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重

这是一篇从网上收集比较详细的配置文件,但运行报错,应该是哪要配置没配好,先贴出来给大家参考

global # 全局参数的设置 

     log 127.0.0.1   local0      #日志输出配置,所有日志都记录在本机,通过local0输出
     #log 127.0.0.1 local0 info 
# log语法:log [max_level_1] 
     # 全局的日志配置,使用log关键字,指定使用127.0.0.1上的syslog服务中的local0日志设备,记录日志等级为info的日志(不大明白加这个info的意思
)
     user root 
     group root
# 设置运行haproxy的用户和组,也可使用uid,gid关键字替代之 
     daemon 
# 以守护进程的方式运行,也就是以后台形式运行haproxy


     nbproc 2 
# 设置haproxy启动时的进程数,根据官方文档的解释,我将其理解为:该值的设置应该和服务器的CPU核心数一致,即常见的2颗8核心CPU的服务器,即共有16核心,则可以将其值设置为:<=16 ,创建多个进程数,可以减少每个进程的任务队列,但是过多的进程数也可能会导致进程的崩溃。这里我设置为16 。nbproc=number process
     maxconn 4096 
# 定义每个haproxy进程的最大连接数 ,由于每个连接包括一个客户端和一个服务器端,所以单个进程的TCP会话最大数目将是该值的两倍。 

    chroot /zy/haproxy/haproxy_setup

     #ulimit -n 65536 
# 设置最大打开的文件描述符数,在1.4的官方文档中提示,该值会自动计算,所以不建议进行设置 

     pidfile /zy/haproxy/haproxy_setup/haproxy.pid
# 定义haproxy的pid,将所有进程写入pid文件

defaults# 默认部分的定义
     mode http
# mode语法:mode {http|tcp|health} 。http是七层模式,tcp是四层模式,health是健康检测,返回OK

     log     127.0.0.1       local3         #日志文件的输出定向
     #log 127.0.0.1 local3 err
# 使用127.0.0.1上的syslog服务的local3设备记录错误信息,我也不知道这个err是什么意思?
     retries 3
# 定义连接后端服务器的失败重连次数,连接失败次数超过此值后将会将对应后端服务器标记为不可用。主要通过后面的check检查
     option httplog
# 启用日志记录HTTP请求,默认haproxy日志记录是不记录HTTP请求的,只记录“时间[Jan 5 13:23:46] 日志服务器[127.0.0.1] 实例名已经pid[haproxy[25218]] 信息[Proxy http_80_in stopped.]”,日志格式很简单。
     option redispatch
# 当使用了cookie时,haproxy将会将其请求的后端服务器的serverID插入到cookie中,以保证会话的SESSION持久性;而此时,如果后端的服务器宕掉了,但是客户端的cookie是不会刷新的,如果设置此参数,将会将客户的请求强制定向到另外一个后端server上,以保证服务的正常。redis=重定向那个单词
     option abortonclose
# 当服务器负载很高的时候,自动结束掉当前队列处理比较久的链接。abort on close
     option dontlognull
# 启用该项,日志中将不会记录空连接。所谓空连接就是在上游的负载均衡器或者监控系统为了探测该服务是否存活可用时,需要定期的连接或者获取某一固定的组件或页面,或者探测扫描端口是否在监听或开放等动作被称为空连接;官方文档中标注,如果该服务上游没有其他的负载均衡器的话,建议不要使用该参数,因为互联网上的恶意扫描或其他动作就不会被记录下来
     option httpclose
# 这个参数我是这样理解的:使用该参数,每处理完一个request时,haproxy都会去检查http头中的Connection的值,如果该值不是close,haproxy将会将其删除,如果该值为空将会添加为:Connection: close。使每个客户端和服务器端在完成一次传输后都会主动关闭TCP连接。与该参数类似的另外一个参数是“option forceclose”,该参数的作用是强制关闭对外的服务通道,因为有的服务器端收到Connection: close时,也不会自动关闭TCP连接,如果客户端也不关闭,连接就会一直处于打开,直到超时。


stats   uri     /haproxy-admin  #haproxy 监控页面的访问地址

       contimeout      5000            #连接超时时间,设置成功连接到一台服务器的最长等待时间,默认单位是毫秒,新版本的haproxy使用timeout connect替代,该参数向后兼容

       clitimeout      50000           #客户端连接超时时间,设置连接客户端发送数据时的成功连接最长等待时间,默认单位是毫秒,新版本haproxy使用timeout client替代。该参数向后兼容

       srvtimeout      50000           #服务器端连接超时时间,设置服务器端回应客户度数据发送的最长等待时间,默认单位是毫秒,新版本haproxy使用timeout server替代。该参数向后兼容


# 设置统计页面认证时的提示内容
     stats auth zhouyun:zhouyun



#我测试时感觉这玩艺压根就没识别
listen status# 定义一个名为status的部分
     bind 0.0.0.0:80
# 定义监听的套接字
     mode http
# 定义为HTTP模式
     log global
# 继承global中log的定义


     stats refresh 30s
# stats是haproxy的一个统计页面的套接字,该参数设置统计页面的刷新间隔为30s
     stats   uri     /haproxy-admin  #haproxy 监控页面的访问地址
     stats realm Private lands
# 设置统计页面认证时的提示内容
     stats auth zhouyun:zhouyun
# 设置统计页面认证的用户和密码,如果要设置多个,另起一行写入即可
     #stats hide-version
# 隐藏统计页面上的haproxy版本信息

frontend http_80_in# 定义一个名为http_80_in的前端部分
     bind 0.0.0.0:80

     #bind *:80
# http_80_in定义前端部分监听的套接字
     mode http
# 定义为HTTP模式
     log global

     default_backend htmpool       #静态服务器池,在backend section指定的
# 继承global中log的定义
     option forwardfor
# 启用X-Forwarded-For,在requests头部插入客户端IP发送给后端的server,使后端server获取到客户端的真实IP
     acl static_down nbsrv(static_server) lt 1
# 定义一个名叫static_down的acl,当backend static_sever中存活机器数小于1时会被匹配到
     acl php_web url_reg /*.php$
     #acl php_web path_end .php
# 定义一个名叫php_web的acl,当请求的url末尾是以.php结尾的,将会被匹配到,上面两种写法任选其一
     acl static_web url_reg /*.(css|jpg|png|jpeg|js|gif)$
     #acl static_web path_end .gif .png .jpg .css .js .jpeg
# 定义一个名叫static_web的acl,当请求的url末尾是以.css、.jpg、.png、.jpeg、.js、.gif结尾的,将会被匹配到,上面两种写法任选其一
     use_backend php_server if static_down
 # 如果满足策略static_down时,就将请求交予backend php_server
     use_backend php_server if php_web
# 如果满足策略php_web时,就将请求交予backend php_server
     use_backend static_server if static_web
# 如果满足策略static_web时,就将请求交予backend static_server

backend php_server #定义一个名为php_server的后端部分

     mode http
# 设置为http模式
     balance source
# 设置haproxy的调度算法为源地址hash
     cookie SERVERID
# 允许向cookie插入SERVERID,每台服务器的SERVERID可在下面使用cookie关键字定义
     option httpchk GET /test/index.php
# 开启对后端服务器的健康检测,通过GET /test/index.php来判断后端服务器的健康情况
     server php_server_1 192.168.202.201:80 cookie 1 check inter 2000 rise 3 fall 3 weight 2
     server php_server_2 192.168.202.202:80 cookie 2 check inter 2000 rise 3 fall 3 weight 1
     server php_server_bak 10.12.25.79:80 cookie 3 check inter 1500 rise 3 fall 3 backup
# server语法:server [:port] [param*]
     # 使用server关键字来设置后端服务器;为后端服务器所设置的内部名称[php_server_1],该名称将会呈现在日志或警报中、后端服务器的IP地址,支持端口映射[10.12.25.68:80]、指定该服务器的SERVERID为1[cookie 1]、接受健康监测[check]、监测的间隔时长,单位毫秒[inter 2000]、监测正常多少次后被认为后端服务器是可用的[rise 3]、监测失败多少次后被认为后端服务器是不可用的[fall 3]、分发的权重[weight 2]、最为备份用的后端服务器,当正常的服务器全部都宕机后,才会启用备份服务器[backup]

backend static_server
     mode http
     option httpchk GET /test/index.html
     server static_server_1 192.168.202.201:80 cookie 3 check inter 2000 rise 3 fall 3


backend htmpool                    #后台
        balance leastconn#负载均衡算法
        option  httpchk HEAD /index.htm HTTP/1.0       #健康检查
        server  web1 192.168.202.201:80 cookie 1 weight 5 check inter 2000 rise 2 fall 3
        server  web2 192.168.202.202:80 cookie 2 weight 3 check inter 2000 rise 2 fall 3
        #cookie 1表示serverid为1,check inter 2000 是检测心跳频率
        #rise 2是2次正确认为服务器可用,fall 3是3次失败认为服务器不可用,weight代表权重




3.加上日志支持

# vim /etc/syslog.conf

在最下边增加

local0.*        /zy/haproxy/haproxy_setup/logs/haproxy.log
local3.*        /zy/haproxy/haproxy_setup/logs/haproxy_err.log
#为了查看简便,local3可以跟local0是同一个文件


#vim /etc/sysconfig/syslog

修改: SYSLOGD_OPTIONS="-r -m 0"

重启日志服务service syslog restart


#service syslog restart    --系统日志也是个服务
注: -r enables logging from remote machines



4.设置开机启动

为了方便系统在开机时加载,还可以创建启动脚本:

# vim /etc/rc.d/init.d/haproxy  内容如下:

#! /bin/sh
set -e

PATH=/sbin:/bin:/usr/sbin:/usr/bin:/zy/haproxy/haproxy_setup/sbin
PROGDIR=/zy/haproxy/haproxy_setup
PROGNAME=haproxy
DAEMON=$PROGDIR/sbin/$PROGNAME
CONFIG=$PROGDIR/$PROGNAME.conf
PIDFILE=$PROGDIR/$PROGNAME.pid
DESC="HAProxy daemon"
SCRIPTNAME=/etc/init.d/$PROGNAME

# Gracefully exit if the package has been removed.
test -x $DAEMON || exit 0

start()
{
        echo -n "Starting $DESC: $PROGNAME"
        $DAEMON -f $CONFIG
        echo "."
}

stop()
{
        echo -n "Stopping $DESC: $PROGNAME"
        haproxy_pid=cat $PIDFILE
        kill $haproxy_pid
        echo "."
}

restart()
{
        echo -n "Restarting $DESC: $PROGNAME"
        $DAEMON -f $CONFIG -p $PIDFILE -sf $(cat $PIDFILE)
        echo "."
}

case "$1" in
  start)
        start
        ;;
  stop)
        stop
        ;;
  restart)
        restart
        ;;
  *)
        echo "Usage: $SCRIPTNAME {start|stop|restart}" >&2
        exit 1
        ;;
esac 

exit 0


保存后赐予可执行权限
# chmod +x /etc/rc.d/init.d/haproxy

就可以使用 service haproxy start|stop|restart 来控***务的启动停止跟重启。


还可以通过以下命令加载到开机服务启动列表
# chkconfig --add haproxy


5.启动服务

启动服务:
/zy/haproxy/haproxy_setup/sbin/haproxy -f /zy/haproxy/haproxy_setup/haproxy.cfg

重启服务:
/zy/haproxy/haproxy_setup/sbin/haproxy -f /zy/haproxy/haproxy_setup/haproxy.cfg -st `cat /zy/haproxy/haproxy_setup/haproxy.pid`
--注意不是单引号“'”,就是这种符号“`”

停止服务:
# killall haproxy



6.举例

在浏览器中输入haproxy监控地址:http://192.168.202.201/haproxy-admin,如图所示






参考文献:

http://network.51cto.com/art/201110/295955_1.htm

http://blog.csdn.net/maijian/article/details/6082283

http://blog.sina.com.cn/s/blog_51d3553f0100u1bb.html

http://andrewyu.blog.51cto.com/1604432/647907

http://blog.chinaunix.net/space.php?uid=22600159&do=blog&id=2124188

http://sookk8.blog.51cto.com/455855/579719

http://freehat.blog.51cto.com/1239536/1347882

http://www.cnblogs.com/dkblog/archive/2012/03/13/2393321.html

http://jlsfwq.blog.51cto.com/818700/165617




来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/30109892/viewspace-1870482/ ,如需转载,请注明出处,否则将追究法律责任。

上一篇: sql风暴来袭
请登录后发表评论 登录
全部评论

注册时间:2015-01-19

  • 博文量
    126
  • 访问量
    1054935