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

[经验分享] 使用Haproxy搭建Web群集

[复制链接]
累计签到:1 天
连续签到:1 天
发表于 2015-9-10 08:34:50 | 显示全部楼层 |阅读模式
简介

    我们知道Nginx、LVS都可以做负载均衡,它们都具有各自的特点,今天介绍另一款比较流行的集群调度工具Haproxy,首先介绍负载均衡常用调度算法,然后介绍Haproxy搭建Web集群的案例环境,接下来重点介绍Haproxy搭建Web集群的安装配置和日志配置,最后介绍了Haproxy的参数优化


一、案例分析

1、案例概述

    Haproxy是目前比较流行的一种集群调度工具,同类集群调度工具有很多,如LVS和Nginx,相比较而言,LVS性能最好,但是搭建相对复杂,Nginx的upstream模块支持集群功能,但是对集群节点健康检查功能不强,性能没有Haproxy好。Haproxy官方网站是http://www.haproxy.org/

    本案例介绍使用Haproxy及Nginx搭建一套Web集群


2、案例前置知识点

(1)HTTP请求

    通过URL访问网站使用的协议是HTTP协议,此类请求一般称为HTTP请求。HTTP请求的方式分为GET方式和POST方式。当使用浏览器访问某一个URL,会根据请求URL返回状态码,通常正常的状态码为2 * * 、3 * *(如200、301),如果出现异常会返回4 * * 、5 * *(如400、500)。


    例如,访问http://www.test.com/a.php?id=123,就是一个GET请求,如果访问正常,会从服务器的日志中获取200状态码。假如此请求使用POST方式,那么传递给a.php的id参数依旧是123,但是浏览器的URL将不会显示后面的id=123字样,因此表单类或者有用户名、密码等内容提交时建议使用POST方式。不管使用什么方式。最终a.php获取的值是一样的

(2)负载均衡常用调度算法

    LVS、Haproxy、Nginx最常用的调度算法有三种,如下所述


  • RR(Round  Robin)。RR算法是最简单最常用的一种算法,即轮询调度。例如,有三个节点A、B、C,第一个用户访问会被指派到节点A,第二个用户访问会被指派到节点B,第三个用户访问会被指派到节点C,第四个用户访问继续指派到节点A,轮询分配访问请求实现负载均衡效果。此算法还有一种加权轮询,即根据每个节点的权重轮询分配访问请求


  • LC(Least  Connections)。LC算法即最小连接数算法,根据后端的节点连接数大小动态分配前端请求。例如,有三个节点A、B、C,各节点的连接数分别为A:4、B:5、C:6,此时如果有第一个用户连接请求,会被指派到A上,连接数变为A:5、B:5、C:6 ;第二个用户请求会继续分配给A上,连接数变为A:6、B:5、C:6 ;再有新的请求会配置给B,每次将新的请求指派给连接数最小的节点服务器。由于实际情况下A、B、C的连接数会动态释放,很难出现一样连接数的情况,因此此算法相比较RR算法有很大改进,是目前用到比较多的一种算法


  • SH(Source  Hashing)。SH即基于来源访问调度算法,此算法用于一些有Session会话记录在服务器端的场景,可以基于来源的IP、Cookie等做集群调度。例如,使用基于源IP的集群调度算法,有三个节点A、B、C,第一个用户第一次访问被指派到A,第二个用户第一次访问被指派到了B,当第一个用户第二次访问时会被继续指派到A,第二个用户第二次访问时依旧会被指派到B,只要负载调度器不重启,第一个用户访问都会被指派到A,第二个用户访问都会被指派到B,实现集群的调度。此调度算法好处是实现会话保持,但某些IP访问量非常大时会引起负载不均衡,部分节点访问量超大,影响业务使用


(3)常见的Web集群调度器

    目前常见的Web集群调度器分为软件和硬件,软件通常使用开源的LVS、Haproxy、Nginx,硬件一般使用比较多的F5,也有很多人使用国内的一些产品,如梭子鱼、绿盟等


3、案例环境

    本案例使用三台服务器模拟一台Web集群


wKiom1Xv-6uDlZtdAAC56fZJSpk061.jpg

                                      Haproxy集群拓扑




主机
操作系统
IP地址
只要软件
Haproxy服务器
Centos 6.6 x86_64
192.168.1.10
haproxy-1.4.24.tar.gz
Nginx服务器-1
Centos 6.6 x86_64
192.168.1.20
nginx-1.6.0.tar.gz
Nginx服务器-2
Centos 6.6 x86_64
192.168.1.21
nging-1.6.0.tar.gz
客户端
Wendows XP
192.16.1.30
IE浏览器


                                            案例环境

    注意:这里服务器是托管在IDC机房中,公网访问使用的是防火墙NAT映射的公网IP,因此服务器端只需配置一个内外IP即可。如果没有防火墙映射,建议在服务器配置双网卡双IP,公网请求访问公网IP的网卡,Haproxy与各个节点间通信使用内外网卡


二、案例实施

1、编译安装Nginx服务器

(1)首先搭建Nginx-1,使用nginx-1.6.0.tar.gz安装包进行编译安装

[iyunv@localhost ~]# yum  -y  install  pcre-devel  zlib-devel
[iyunv@localhost ~]# useradd  -M  -s  /sbin/nologin  nginx
[iyunv@localhost ~]# tar  -zxvf  nginx-1.6.0.tar.gz
[iyunv@localhost ~]# cd nginx-1.6.0
[iyunv@localhost nginx-1.6.0]# ./configure  --prefix=/usr/local/nginx  --user=nginx  --group=nginx
[iyunv@localhost nginx-1.6.0]# make  &&  make  install

    安装完成后默认信息如下


  • 默认安装目录:/usr/local/nginx/


  • 默认日志:/usr/local/nginx/logs/


  • 默认监听:80


  • 默认Web目录:/usr/local/nginx/html/


[iyunv@localhost nginx-1.6.0]# cd  /usr/local/nginx/html/
[iyunv@localhost html]# echo  "Server  192.168.1.20" >test.html           //建立测试页面
[iyunv@localhost html]# /usr/local/nginx/sbin/nginx                       //启动Nginx
[iyunv@localhost html]# netstat  -utpln  |  grep  nginx
tcp        0      0 0.0.0.0:80           0.0.0.0:*          LISTEN        4262/nginx

[iyunv@localhost html]# service  iptables  stop

    为了方便实验,网站没有配置域名,直接使用IP地址。在客户端访问http://192.168.1.20/test.html测试

wKiom1XwKzfgGr2rAAF1m1eeSNE498.jpg

                                        测试访问Nginx-1

(2)搭建Nginx-2

    编译安装的步骤与Nginx-1相同,不同之处在于建立测试页面


[iyunv@localhost html]# echo "Server  192.168.1.21"  >test.html

wKiom1XwK76Ri4vEAAF26XjGSRw195.jpg

                                         测试访问Nginx-2

2、编译安装Haproxy

    使用haproxy-1.4.24.tar.gz安装包进行编译安装

[iyunv@localhost ~]# yum  -y  install  pcre-devel  bzip2-devel
[iyunv@localhost ~]# tar  -zxvf  haproxy-1.4.24.tar.gz
[iyunv@localhost ~]# cd  haproxy-1.4.24
[iyunv@localhost haproxy-1.4.24]# make  TARGET=linux26                 //64位系统
[iyunv@localhost haproxy-1.4.24]# make  install

3、Haproxy服务器配置

(1)建立Haproxy的配置文件

[iyunv@localhost haproxy-1.4.24]# mkdir  /etc/haproxy
[iyunv@localhost haproxy-1.4.24]# cp examples/haproxy.cf /etc/haproxy/   
//将haproxy.cfg文件复制到配置文件目录


(2)Haproxy配置项介绍

    Haproxy配置文件通常分为三个部分,即global、defaults和listen。global为全局配置、defaults为默认配置、listen为应用组件配置

    global配置项通常有下面配置参数,以示例参数说明如下

global
        log 127.0.0.1   local0       //配置日志记录,local0为日志设备,默认存放到系统日志
        log 127.0.0.1   local1 notice           //notice为日志级别,通常有24个级别
        maxconn 4096                            //最大连接数
        uid 99                                  //用户uid
        gid 99                                  //用户gid

    defaults配置项配置默认参数,一般会被应用组件继承,如果在应用组件中没有特别声明,将按照默认配置参数设置


defaults
        log     global                           //定义日志为global配置中的日志定义
        mode    http                             //模式为http
        option  httplog                          //采用http日志格式记录日志
        retries 3            //检查节点服务器失败次数,连续达到三次失败,则认为节点不可用
        maxconn 2000                            //最大连接数
        contimeout      5000                    //连接超时时间
        clitimeout      50000                   //客户端超时时间
        srvtimeout      50000                   //服务器超时时间

    listen配置项目一般为配置应用模块参数


listen  appli4-backup 0.0.0.0:10004             //定义一个appli4-backup的应用
        option  httpchk /index.html             //检查服务器的index.html文件
        option  persist                         //强制将请求发送到已经down掉的服务器
        balance roundrobin                      //负载均衡调度算法使用轮询算法
        server  inst1 192.168.114.56:80 check inter 2000 fall 3           //定义在线节点
        server  inst2 192.168.114.56:81 check inter 2000 fall 3 backup    //定义备份节点

(3)根据目前的集群设计,将haproxy.cfg配置文件的内容修改如下

global
        log 127.0.0.1   local0
        log 127.0.0.1   local1 notice
        #log loghost    local0 info
        maxconn 4096
        uid 99
        gid 99
        daemon
        #debug
        #quiet

defaults
        log     global
        mode    http
        option  httplog
        option  dontlognull
        retries 3
        maxconn 2000
        contimeout      5000
        clitimeout      50000
        srvtimeout      50000

listen  webcluster 0.0.0.0:80
        option  httpchk GET /index.html
        balance roundrobin
        server  inst1 192.168.1.20:80 check inter 2000 fall 3
        server  inst2 192.168.1.21:80 check inter 2000 fall 3

4、创建自启动脚本

[iyunv@localhost ~]# cp  ~/haproxy-1.4.24/examples/haproxy.init  /etc/init.d/haproxy
[iyunv@localhost ~]# ln  -s  /usr/local/sbin/haproxy  /usr/sbin/haproxy
[iyunv@localhost ~]# chmod  +x  /etc/init.d/haproxy
[iyunv@localhost ~]# /etc/init.d/haproxy  start
Starting haproxy:                                          [  OK  ]

[iyunv@localhost ~]# service  iptables  stop

5、测试Web集群

    通过上面的步骤,已经搭建完成Haproxy的Web集群,接下来需要验证集群是否正常工作。一个集群一般需要具备两个特性,第一个是高性能,第二个是高可用


(1)测试高性能

    在客户端使用浏览器打开http://192.168.1.10/test.html,浏览器显示信息如图所示

wKiom1XwO3GCfkqSAAF79UK3HB4022.jpg

                                         第一次访问的显示信息

    再次打开一个新的浏览器页面访问http://192.168.1.10/test.html,浏览器显示信息如图所示

wKioL1XwPiHCBHVTAAGCjd8ngEE540.jpg

                                         第二次访问的显示信息

    可以看到集群的负载均衡调度已经生效,已经满足了集群的高性能需求


(2)测试高可用

    现在将192.168.1.20的Nginx服务停用,在客户端使用浏览器打开http://192.168.1.10/test.html,浏览器显示信息仍然如第一次访问时的图相同

    从中可以看出,当出现一台节点故障,不会影响集群的使用,这样就满足了集群的高可用性。也可以将192.168.1.20的Nginx服务恢复,再将192.168.1.21的Nginx服务停用,测试高可用性


6、Haproxy的日志

    Haproxy的日志默认是输出到系统的syslog中,查看起来不是非常方便,为了更好地管理Haproxy的日志,我们在生产环境中一般单独定义出来,定义的方法如下所述


(1)修改Haproxy配置文件中关于日志配置的选项,修改为下面的配置

        log  /dev/log    local0  info
        log  /dev/log    local0  notice

    这两行配置是将原本的log  127.0.0.1配置项修改,主要是将Haproxy的info及notice日志分别记录到不同的日志文件中


    然后重启Haproxy,完成Haproxy配置


(2)修改rsyslog配置

    为了便于管理,将Haproxy下相关的配置独立定义到haproxy.conf,并放到/etc/rsyslog.d/下,rsyslog启动时会自动加载此目录下的所有配置文件


[iyunv@localhost ~]# touch /etc/rsyslog.d/haproxy.conf
[iyunv@localhost ~]# vim /etc/rsyslog.d/haproxy.conf

    加入下面的内容:

if ($programname == 'haproxy' and $syslogseverity-text == 'info') then -/var/log/haproxy/haproxy-info.log
& ~
if ($programname == 'haproxy' and $syslogseverity-text == 'notice') then -/var/log/haproxy/haproxy-notice.log
& ~

    这部分配置是将Haproxy的info日志记录到/var/log/haproxy/haproxy-info.log下,将notice日志记录到/var/log/haproxy/haproxy-notice.log下,其中“& ~”表示当日志写入到日志文件后,rsyslog停止处理这个信息。这里配置的语法是使用rainerscript脚本语言写的


    当然也可用用另一种解决方式,修改/etc/rsyslog.conf配置文件,在配置文件中加入如下两行:


local0.info                                             /var/log/haproxy-info.log
local0.notice                                           /var/log/haproxy-notice.log

    这样也可以实现上面相同的效果

    然后保持配置文件并重启rsyslog服务,完成rsyslog配置   

(3)测试日志信息

    在客户端访问http://192.168.1.10/test.html后,可以使用tail  -f  /var/log/haproxy/haproxy-info.log即时查看Haproxy的访问请求日志信息

[iyunv@localhost ~]# tail -f /var/log/haproxy/haproxy-info.log

Sep  9 22:30:05 localhost haproxy[2634]: 192.168.1.30:1165 [09/Sep/2015:22:30:02.202] webcluster webcluster/inst2 0/0/0/1/3255 200 256 - - CD-- 0/0/0/0/0 0/0 "GET /test.html HTTP/1.1"

7、Haproxy的参数优化

    关于Haproxy的参数优化,以下列举了几个关键的参数,并对各参数的生产环境的优化建议做了说明


参数
参数说明
优化建议
maxconn
最大连接数
此参数根据应用的实际情况进行调整,推荐使用10 240
daemon
守护进程模式
Haproxy可以使用非守护进程模式启动,生产环境建议使用守护模式启动
nbproc
负载均衡的并发进程数
建议与当前服务器CPU核数相等或为其2倍
retries
重试次数
此参数主要用于对集群节点的检查,如果节点多,且并发量大,设置为2次或3次;在服务器节点不多的情况下,可以设置为5次或6次
option  http-server-close
主动关闭http请求选项
建议在生产环境中使用此选项,避免由于timeout时间设置过长导致http连接堆积
timeout  http-keep-alive
长连接超时时间
此选项设置长连接超时时间,具体参考应用自身特点设置,可以设置为10s
timeout  http-request
http请求超时时间
建议此时间设置为5~10s,增加http连接释放速度
timeout  client
客户端超时时间
如果访问量过大,节点响应慢,可以将此时间设置短一些,建议设置为1min左右就可以了



运维网声明 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-111698-1-1.html 上篇帖子: Haproxy隐藏后端服务器信息及Haproxy实现压缩 下篇帖子: centos下haproxy日志的配置
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

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

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

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

扫描微信二维码查看详情

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


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


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


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



合作伙伴: 青云cloud

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